Не работает num_rows в mysqli, если использовать IN

BelStudent

целеустремлённый чел
Не работает num_rows в mysqli, если использовать IN

Не работате num_rows в mysqli если использовать IN.
В результате исполнения скрипта всегда получаю 1. Что удивительно стоит заменит IN и сразу все работает.

Код:
$mysqli = new mysqli(
            HOST,  /* Хост, к которому мы подключаемся */ 
            ADMIN,       /* Имя пользователя */ 
            ADMINPASS,   /* Используемый пароль */ 
            DB_MAINNAME);     /* База данных для запросов по умолчанию */ 

/* Проверка соединения */ 
if (mysqli_connect_errno()) { 
    printf("Подключение невозможно: %s\n", mysqli_connect_error()); 
    exit(); 
} 
$t='1,2,3,4';
$stmt = $mysqli->prepare("SELECT * FROM `news` WHERE `id` IN ( ? )"); 
$stmt->bind_param('s', $t); 

/* выполнение подготовленного выражения  */ 
$stmt->execute(); 
$stmt->store_result();

echo $stmt->num_rows; 

/* Закрытие соединения и выражения*/ 
$stmt->close(); 

/* Закрыть подключение */ 
$mysqli->close(); 
die();
 

vovanium

Новичок
num_rows вообще не знает in у тебя там или нет.
проверь какой именно запрос ты исполняешь
 

BelStudent

целеустремлённый чел
Код:
$t='1';
$stmt = $mysqli->prepare("SELECT * FROM `news` WHERE `id` > ( ? )"); 
$stmt->bind_param('s', $t);
Этот запрос даёт у меня 4, что правильно.

А вот этот запрос:
Код:
$t='1,3,4';
$stmt = $mysqli->prepare("SELECT * FROM `news` WHERE `id` IN ( ? )"); 
$stmt->bind_param('s', $t);
Даёт 1. Новости с id равным 1,3,4 существуют (проверил ещё раз в phpmyadmin).
Теряюсь в догадках откуда корни данной проблемы.
 

vovanium

Новичок
Я вообще говорил о том, чтобы ты посмотрел реальные запросы (в логе запросов), так как ты не понимаешь что именно делает bind_param.
Намек, одинаковые ли следующие выражения
IN (1,3,4) и IN ('1,3,4')
 

BelStudent

целеустремлённый чел
Нет не одинаковы.
Проблема в том что я не могу сделать так:
Код:
SELECT * FROM `news` WHERE `id` IN (?,?,?)
Т.е. для случая когда количество id неизветсно, я не могу сделать подготовленный запрос такого вида. Выход только:
SELECT * FROM `news` WHERE `id` IN (?)
где вместо "?" вставляется 1,2,...,n
Но в результате такого запроса получаю num_rows=1. Я не вижу другого выхода. Если ты видишь подскажи.
 

iceman

говнокодер
SELECT * FROM `news` WHERE `id` IN (1,2,3,...,n)
SELECT * FROM `news` WHERE `id` IN ('1,2,3,...,n')
 

BelStudent

целеустремлённый чел
Хы, если ты глянеш в код, то там ПОДГОТОВЛЕННЫЙ запрос. Когда обычный запрос
SELECT * FROM `news` WHERE `id` IN (1,2,3,...,n)
то тут ясно всё. А как быть с подготовленным?
 

Mols

Новичок
А сразу в mysqli->prepare отдать полностью сформированный запрос религия не позволяет?
 

BelStudent

целеустремлённый чел
Тогда какой толк препаре или обычный. Мне нравилось в prepare защита от SQL-инъекций и д.р.. А так -обычный запрос. Зачем тогда вообще в prepare помещать?
 

tf

крылья рулят
BelStudent, что за бред?
у тебя проблема с запросами?, с запросами, так потрудить написать запрос, а не php код
сможеш написать запросы проблемные, может и проблему сваю решиш
 

BelStudent

целеустремлённый чел
Так, пойдем от частного к общему:
Попробуйте создать КОРРЕКТНО работающий ПОДГОТОВЛЕНЫЙ запрос следующего вида:
Код:
SELECT * FROM `news` WHERE `id` IN ( 1,2,3,...,n )"
Лично у меня такой не получился.
Думаю я понятно изложил?
 

tf

крылья рулят
Попробуйте создать КОРРЕКТНО работающий ПОДГОТОВЛЕНЫЙ запрос следующего вида:
мне это не надо, но это сделать легко
а чтобы тебе это сделать ковыряйся в документации
 

Фанат

oncle terrible
Команда форума
Я, когда искал - вывод SQL запроса не нашел.
Поскольку, как я понял, его просто не существует, как понятия.

Плюс, не нашел плейсхолдера для массивов, да.
 

Фанат

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

BelStudent

целеустремлённый чел
Автор оригинала: Wicked
join(', ', array_fill(1, count($arr), '?')) :)
Прикольно, но главное должно работать. Только вопрос тогда ставится о целесообразности подготовленных запросов.

p.s. Но вообще-то ты нашёл выход из положения ))) тебе +1
 

DiMA

php.spb.ru
Команда форума
Я использую плейсхолдеры с массивами, условиями и прочей логикой. Просто нужно шаблонизатор прикрутить.

А в обсуждаемой тема выход прост: в цикле дописываем ? и сам аргумент.

Тут была уже соседняя тема, там ее дебил один засрал... Но мораль такова: шаблонизатор должен разгребать имена переменных и автоматически подставлять либо

= value

либо

IN (value, ... )

И тогда становится абсолютно не важно чего загонять в запрос. Ради удобства, шаблонизатор может как и имя переменной подставлять ( name = ... name IN ...), так еще и рулить необходимостью вставить OR/AND: если переменная отстуствует, то не пишем в запрос ничего, если передана - пишем "AND name =/IN ... ".
 

Mols

Новичок
Ну можно конечно прикрутить и шаблонизатор... если лень привести элементы массива к ИНТ и сделать джойн.
 
Сверху