Согласно 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);
Кажется, он отлично работает при использовании строки с кома-разделенными значениями. Я все еще проверяю, действительно ли результаты являются точными …