Использование подготовленного к строке оператора приведет к тому, что ваш окончательный SQL будет выглядеть так:
IN ('1,2,3,4,5')
с кавычками, а это не то, что вам нужно.Я бы сделал следующее:
$ids= array(1,2,3,4,5);
$mysqli = new mysqli(DB_SERVER, DB_NAME, DB_PASSWORD, DB_NAME);
$rawQuery = 'SELECT * FROM core_tags WHERE tag_id IN (';
$rawQuery .= implode(',',array_fill(0,count($ids),'?'));
$rawQuery .= ') GROUP BY tag_id ORDER BY tag_popularity ASC';
$stmt = $mysqli->prepare($rawQuery);
call_user_func_array(array($stmt,'bind_param'),$ids);
$stmt->execute();
$stmt->bind_result($tag_id, $tag_name, $tag_desc, $tag_popularity);
while ($stmt->fetch()) {
printf ("%s\n", $tag_name);
}
Если implode array_fill
сбивает с толку, это просто сокращенный способ создания массива того же размера, что и $ids
, заполненного "?"
, тогдапревращение их в csv.
ОБНОВЛЕНИЕ: путь без привязки параметров
Конечно, если вы хотите пропустить бессмысленную привязку параметров, и вы можете доверять списку$ids
для того, чтобы уже очистить, вы можете просто сделать это вместо этого и пропустить раздел bind_params:
$rawQuery = 'SELECT * FROM core_tags WHERE tag_id IN (';
$rawQuery .= implode(',',$ids);
$rawQuery .= ') GROUP BY tag_id ORDER BY tag_popularity ASC';
Если вы не можете доверять данным:
function clean_ids(&$item){
$item = intval($item);
}
$clean_ids = array_walk($ids,'clean_ids');
$rawQuery = 'SELECT * FROM core_tags WHERE tag_id IN (';
$rawQuery .= implode(',',$clean_ids);
$rawQuery .= ') GROUP BY tag_id ORDER BY tag_popularity ASC';