Связывание нескольких параметров с запросом mysqli

Сейчас мне нужно использовать следующую структуру, чтобы справиться с привязкой нескольких параметров к запросу mysqli:

if ($words_total == 1)
{
    $statement -> bind_param("s", $words[0]);
}
else if ($words_total == 2)
{
    $statement -> bind_param("ss", $words[0], $words[1]);
}
else if ($words_total == 3)
{
    $statement -> bind_param("sss", $words[0], $words[1], $words[2]);
}

//and so on....

Я задаю количество вопросительных знаков, используя приведенный ниже код, и вставьте его в мой запрос:

$marks = "";
for($i = 1; $i<=$words_total; $i++) {
    if ($i == $words_total)
    {
        $marks .= "?";
    }
    else
    {
        $marks .= "?,";
    }
}

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

Я использую версию php 5.4.10

Ответы

Ответ 1

Здесь идет решение или фактическая проблема привязки переменной количества значений к подготовленному оператору mysqli:

<?php
$values = array('b','c','d');

$in  = str_repeat("?,", count($values));
$in  = trim($in, ",");

$sql = "SELECT * from users where username in($in)";
$stm = $con->prepare($sql);

$types = str_repeat("s", count($values));

if (strnatcmp(phpversion(),'5.3') >= 0)
{
    $bind = array();
    foreach($values as $key => $val)
    {
        $bind[$key] = &$values[$key];
    }

} else {

    $bind = $values;
}

array_unshift($bind, $types);
call_user_func_array(array($stm, 'bind_param'), $bind);

#var_dump($sql, $types, $bind, $con->error);

$stm->execute();
$res = $stm->get_result();
while($row = $res->fetch_assoc()) var_dump($row);

Комментируемая строка предназначена только для тестирования разработки. Очень полезно.

Но ваша первоначальная проблема заключалась в отсутствии сообщений об ошибках.

Это испортило вам не только в этом конкретном случае, но и весь ваш опыт работы с PHP.
Каждый раз, когда что-то пойдет не так, PHP скажет вам - что случилось и кого винить. Только если вы позволите. И ты всегда должен.

Вы можете прочитать этот ответ на основы отчетности об ошибках

Имея сообщение об ошибке, вы можете просто загрузить Google и найти решение за считанные секунды. Или, по крайней мере, вы узнаете, какова определенная проблема. На самом деле это поведение функции call_user_func_array(), которая была внезапно изменена.

Ответ 2

Извините, что функция str_repeat() имеет только свое ограничение в том, чего вы можете достичь, сравнивая с возможностью использования цикла foreach в запросе. Для этого я просто оставлю эту часть своих веб-сайтов в старом школьном режиме без параметра привязки