Операторы MySQL Prepared с переменным списком переменных размера

22
задан Michael 3 May 2016 в 21:42
поделиться

5 ответов

Я могу думать о паре решений.

Одно решение могло бы состоять в том, чтобы составить временную таблицу. Сделайте вставку в таблицу для каждого параметра, который Вы имели бы в в пункте. Тогда сделайте простое соединение против своей временной таблицы.

Другой метод мог бы быть должен сделать что-то вроде этого.

$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);
<час>
20
ответ дан 29 November 2019 в 04:51
поделиться

достойная sql привязка поддержки оберток для выстраивания значений. т.е.

$sql = "... WHERE id IN (?)";
$values = array(1, 2, 3, 4);
$result = $dbw -> prepare ($sql, $values) -> execute ();
4
ответ дан 29 November 2019 в 04:51
поделиться

Возьмите № 2 со стола. Подготовленные операторы являются единственным способом, которым необходимо рассмотреть защиту себя против Внедрения SQL.

то, Что можно сделать, однако, генерируют динамический набор обязательных переменных. т.е. не делайте 100, если Вам нужно 7 (или 103).

2
ответ дан 29 November 2019 в 04:51
поделиться

я получил свой ответ от: 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();
?>
2
ответ дан 29 November 2019 в 04:51
поделиться

Если Вы только используете целочисленные значения в Вашем 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)

, Но без сомнения решением здесь является более общий подход к этой проблеме.

1
ответ дан 29 November 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: