Я могу думать о паре решений.
Одно решение могло бы состоять в том, чтобы составить временную таблицу. Сделайте вставку в таблицу для каждого параметра, который Вы имели бы в в пункте. Тогда сделайте простое соединение против своей временной таблицы.
Другой метод мог бы быть должен сделать что-то вроде этого.
$dbh=new PDO($dbConnect, $dbUser, $dbPass);
$parms=array(12, 45, 65, 33);
$parmcount=count($parms); // = 4
$inclause=implode(',',array_fill(0,$parmcount,'?')); // = ?,?,?,?
$sql='SELECT age, name FROM people WHERE id IN (%s)';
$preparesql=sprintf($sql,$inclause); // = example statement used in the question
$st=$dbh->prepare($preparesql);
$st->execute($parms);
я подозреваю, но не имею никакого доказательства, что первое решение могло бы быть лучше для больших списков, и позже будет работать на меньшие списки.
<час>Для создания @orrd счастливый вот краткая версия.
$dbh=new PDO($dbConnect, $dbUser, $dbPass);
$parms=array(12, 45, 65, 33);
$st=$dbh->prepare(sprintf('SELECT age, name FROM people WHERE id IN (%s)',
implode(',',array_fill(0,count($parms),'?'))));
$st->execute($parms);
<час> достойная sql привязка поддержки оберток для выстраивания значений. т.е.
$sql = "... WHERE id IN (?)";
$values = array(1, 2, 3, 4);
$result = $dbw -> prepare ($sql, $values) -> execute ();
Возьмите № 2 со стола. Подготовленные операторы являются единственным способом, которым необходимо рассмотреть защиту себя против Внедрения SQL.
то, Что можно сделать, однако, генерируют динамический набор обязательных переменных. т.е. не делайте 100, если Вам нужно 7 (или 103).
я получил свой ответ от: http://bugs.php.net/bug.php?id=43568
это - мое рабочее решение моей проблемы. Теперь я могу динамично использовать столько параметров, сколько я хочу. Они будут тем же числом, как я имею в массиве, или поскольку в этом случае я передаю идентификаторы от последнего запроса (который нашел все идентификаторы, где электронная почта = 'johndoe@gmail.com') к динамическому запросу для получения всей информации о каждом из них идентификатор, неважно, в скольких я заканчиваю тем, что нуждался.
<?php $NumofIds = 2; //this is the number of ids i got from the last query
$parameters=implode(',',array_fill(0,$NumofIds,'?'));
// = ?,? the same number of ?'s as ids we are looking for<br />
$paramtype=implode('',array_fill(0,$NumofIds,'i')); // = ii<br/>
//make the array to build the bind_param function<br/>
$idAr[] = $paramtype; //'ii' or how ever many ?'s we have<br/>
while($statement->fetch()){ //this is my last query i am getting the id out of<br/>
$idAr[] = $id;
}
//now this array looks like this array:<br/>
//$idAr = array('ii', 128, 237);
$query = "SELECT id,studentid,book_title,date FROM contracts WHERE studentid IN ($parameters)";
$statement = $db->prepare($query);
//build the bind_param function
call_user_func_array (array($statement, "bind_param"), $idAr);
//here is what we used to do before making it dynamic
//statement->bind_param($paramtype,$v1,$v2);
$statement->execute();
?>
Если Вы только используете целочисленные значения в Вашем IN
пункт, нет ничего, что приводит доводы против построения Вашего запроса динамично без использования параметров SQL.
function convertToInt(&$value, $key)
{
$value = intval($value);
}
$ids = array('12', '45', '65', '33');
array_walk($ids, 'convertToInt');
$sql = 'SELECT age, name FROM people WHERE id IN (' . implode(', ', $ids) . ')';
// $sql will contain SELECT age, name FROM people WHERE id IN (12, 45, 65, 33)
, Но без сомнения решением здесь является более общий подход к этой проблеме.