php mysqli ГДЕ (?,?,? ...) - PullRequest
       28

php mysqli ГДЕ (?,?,? ...)

4 голосов
/ 08 октября 2009

Согласно 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);

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

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

Ответы [ 4 ]

3 голосов
/ 08 октября 2009

Если у вас есть список переменных, которые различаются по размеру при каждом вызове, который вы хотите связать с IN -статистом, самый простой способ - генерировать строку 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;
}
3 голосов
/ 08 октября 2009

Правильный синтаксис будет

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

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

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

0 голосов
/ 10 января 2013

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

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

if (!$stmt->execute()) {
    $this->throwException();
}

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

0 голосов
/ 08 октября 2009

Мне кажется, я нашел ответ на свой вопрос:

->prepare("SELECT stuff FROM table_name WHERE id IN (?)");

$itemList = implode(',',$items);
$children->bind_param('s',$itemList);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...