Неправильно формируется массив из SQL-запроса

  • Автор темы Annihilator
  • Дата начала

Annihilator

Guest
Из верных данных Неверно формируется массив

Никак не могу справиться со транным глюком при формировании одного массива из SQL-запроса.
Мне надо из таблицы product выбрать продукты, которые не занесены в текущую категорию в таблице allocation. Сначала я попробовал сделать эту выборку в пределах одного запроса, но оказывается, что MySQL не поддерживает вложеные запросы. Тогда решил сделать это в два приема. Вначале из таблицы allocation выбираю все ID продуктов в текущей категории, затем из таблицы product выбираю все продукты, которых нету в первом массиве.
Вот код:
PHP:
<?
$allocids = array();
$query = mysql_query("SELECT product_id FROM allocation WHERE category_id=".$cur_cat[0].";") or die (mysql_error());
$allocids = mysql_fetch_array($query);
$idstr = implode(",", $allocids);
$notalloc = array();
$i = 0;
$query = mysql_query("SELECT * FROM product WHERE product_id NOT IN(".$idstr.");") or die (mysql_error());
while ($result = mysql_fetch_array($query)){
    $notalloc[$i] = array();
    for ($j=0; $j<count($result); $j++) $notalloc[$i][$j] = htmlentities($result[$j]);
    $i++;
}
?>
Проблема в том, что массив $allocids формируется какой-то странный: отдельные его значения вообще не выводятся, а сделанная из него строка $idstr имеет примерно такой вид: "15,15", то есть в ней всегда два раза повторяется первый попавшийся ID из выборки, остальных вообще нету. В самом MySQL эти запросы с конкретными числами нормально работают, выдают все правильно.
В чем причина такого странного глюка?
 

Фанат

oncle terrible
Команда форума
вопрос поставлен неверно. В корне, причем.
Надо либо писать "Неверно работает запрос"
или "Из верных данных Неверно формируется массив".
И искать не две ошибки, а одну.

-~{}~ 22.11.04 15:47:

хммм. я что-то пропустил, и точка с запятой после запроса в mysql_query перестала вызывать синтакс еррор?
 

Profic

just Profic (PHP5 BetaTeam)
Фанат
Да у него там нет вообще массива, у него же от первого запроса идет взятие только одного ряда.
Т.е. даже код представлен не реальный

ЗЫ. Вернее массив там есть, да не тот
 

Annihilator

Guest
Я перепробовал разные варианты формирования первого массива:
такой:
PHP:
<?
$i = 0;
while ($result = mysql_fetch_array($query)){
   $allocids[$i] = htmlentities($result[$i]);
   $i++;
}
?>
такой:
PHP:
<?
$result = mysql_fetch_array($query);
for ($i=0; $i<count($result); $i++) $allocids[$i] = $result[$i];
?>
Не помогает. Может подскажете, как еще можно?
 

Profic

just Profic (PHP5 BetaTeam)
Пилять. Ты понимаешь, что возвращает [m]mysql_fetch_array[/m]?
Она УЖЕ возвращает массив (но не тот, который тебе нужен), следовательно когда ты генерируешь массив, тебе нужно из того массива, который вернула mysql_fetch_array получить ОДНО единственное значение.

И вообще рекоммендация, поставь в начало скрипта
error_reporting (E_ALL);
и удивись тому, что ты не хотел замечать.
 

Annihilator

Guest
Всё, спасибо, я понял, в чем ошибка. Вместо mysql_fetch_array() надо использовать mysql_fetch_row() в цикле, т.к. запрос возвращает один столбик.
Тему можно удалять.

ЗЫ. Не сердитесь на меня, просто у нас в конторе все програмят на Java/PostgreSQL, а это какой-то уебичный клиент захотел сайт обязательно на PHP. Шеф сказал - сделаем и тыкнул в меня пальцем. Вот мне приходится разбираться...
 

Фанат

oncle terrible
Команда форума
да-да.
все сразу поверили, что это клиент и пхп тебе виноваты.
крутому ява-программисту.
 
Сверху