php mysqli WHERE IN (?,?,? …)

Согласно http://us2.php.net/manual/en/mysqli-stmt.bind-param.php , различные типы:

i corresponding variable has type integer d corresponding variable has type double s corresponding variable has type string b corresponding variable is a blob and will be sent in packets 

Однако как вы справитесь с этим:

 ->prepare("SELECT blabla FROM foo WHERE id IN (?)") 

Где ? будет список идентификаторов. Может быть один или несколько элементов:

 $ids = "3,4,78"; ->bind_param('s',$ids); 

Это возможно?

Я хотел бы использовать подготовленные инструкции, потому что он будет выполнен в цикле.

Правильный синтаксис

 ->prepare("SELECT blabla FROM foo WHERE id IN (?, ?, ?)") 

для 3 элементов в этом массиве, например. Затем вам необходимо связать каждый из этих элементов с помощью bind_param() .

Если у вас нет гарантии размера в массиве, вам придется написать пару вспомогательных функций для генерации вашего SQL с соответствующим количеством операторов «?» И bind.

Если у вас есть список переменных, который отличается по размеру каждым вызовом, который вы хотите связать с IN -statement, самым простым способом было бы сгенерировать строку SQL программно и использовать цикл для привязки переменных:

 /** * @param array $values * @param mysqli $db * @return mysqli_stmt */ function bindInValues(array $values, mysqli $db) { $sql = sprintf('SELECT blabla FROM foo WHERE id IN (%s)', implode(', ', array_fill(0, count($values), '?')) ); $stmt = $db->prepare($sql); foreach ($values as $value) { $stmt->bind_param('s', $value); } return $stmt; } 

Если вам нравится call_user_func_array вы можете использовать динамический вызов метода и идти без цикла.

 /** * @param array $values * @param mysqli $db * @return mysqli_stmt */ function bindInValues(array $values, mysqli $db) { $sql = sprintf('SELECT blabla FROM foo WHERE id IN (%s)', implode(', ', array_fill(0, count($values), '?')) ); $stmt = $db->prepare($sql); array_unshift($values, implode('', array_fill(0, count($values), 's'))); call_user_func_array(array($stmt, 'bind_param'), $values); return $stmt; } 

Как насчет этого:

 $sql = sprintf("SELECT blabla FROM foo WHERE id IN(%s) ", $ids); $stmt = $mysqli->prepare($sql); if (!$stmt) { $this->throwException(); } if (!$stmt->execute()) { $this->throwException(); } 

Если это нехорошо, скажите мне, почему я могу учиться на своих ошибках. Благодаря!

Думаю, я нашел ответ на свой вопрос:

 ->prepare("SELECT stuff FROM table_name WHERE id IN (?)"); $itemList = implode(',',$items); $children->bind_param('s',$itemList); 

Кажется, он отлично работает при использовании строки с кома-разделенными значениями. Я все еще проверяю, действительно ли результаты являются точными …