mysqli_stmt_bind_param для поиска

0

Привет, мне нужно изменить мой уже рабочий запрос на подготовленный оператор. Я просто не могу понять, как получить mysqli_stmt_bind_param(); право. мое подготовленное выражение...

$query = "SELECT users.user_id, users.first_name WHERE users.active IS NULL AND";
foreach ($terms as $term) { // add the search term..
    $query .= " word=? OR"; // STUCK HERE
} 
$query = substr($query, 0, -3); // remove last OR.
    $query .= " GROUP BY users.user_id ORDER BY users.first_name DESC";
$stmt = mysqli_prepare($dbc, $query);
    mysqli_stmt_bind_param($stmt, 's', $term); // STUCK HERE
    mysqli_stmt_execute($stmt);
    mysqli_stmt_store_result($stmt);
    mysqli_stmt_bind_result($stmt, $user_id, $first_name);
    mysqli_stmt_fetch($stmt);'

пожалуйста, любая помощь будет большой, спасибо.

  • 0
    Что содержит $terms term?
  • 0
    массив имен
Теги:
search
prepared-statement

3 ответа

0
Лучший ответ

Я предлагаю изменить ваше $query building следующим образом:

$query = "SELECT users.user_id, users.first_name WHERE users.active IS NULL AND (";
foreach ($terms as $term) {
    $query .= "word=? OR ";
}
$query = rtrim($query, " OR "); // remove last OR .
$query .= ") GROUP BY users.user_id ORDER BY users.first_name DESC";
$stmt = mysqli_prepare($dbc, $query);

Есть несколько изменений, которые я сделал здесь, таких как замена substr() на rtrim() (поскольку это более короткий синтаксис и более динамичный), фиксируя интервал и помещая все ваше word=? и внутри круглых скобок.

Что касается вашего фактического привязки параметров, я предлагаю изменить его следующим образом:

//use str_repeat to create a string of "s" equal to the amount of terms there are.
//use variable unpacking to unpack all of the terms into the function.
mysqli_stmt_bind_param($stmt, str_repeat("s", count($terms)), ...$terms);

Изменения включают использование str_repeat() которое будет генерировать строку "s" той же длины, что и количество терминов в $terms. Я также использую переменную распаковку (добавленную в PHP версии 5.6) для распаковки всех переменных, привязанных к запросу.


Примечание. Если вы используете PHP версию старше 5.6, я рекомендую вам обновить, но и распаковка переменных не будет работать. Вот альтернатива, просто замените mysqli_stmt_bind_param():

call_user_func_array("mysqli_stmt_bind_param", array_merge(array($stmt, str_repeat("s", count($terms)), $terms));

Это использует call_user_func_array() чтобы вы могли распаковать переменные. Пакет переменных, добавленный в PHP версии 5.6, в основном является синтаксисом сахара для этой более старой функции.

  • 0
    Привет переменная распаковка ... $ term не работает для меня, я могу использовать что-то еще?
  • 0
    @ sam67 Что значит не работает? Что это делает?
Показать ещё 7 комментариев
1

Вам действительно не нужно перебирать свои термины во второй раз, просто передайте кучу слов "word =? OR" или "word"? и т.д. Используя array_fill() вы можете просто выполнить эту задачу.

Реальная проблема вступает в игру при привязке параметров. Вы можете использовать str_repeat() чтобы сгенерировать строку с ssssss... равным количеству слагаемых для присоединения, а затем использовать распаковку Argument для присоединения массива $terms как параметров к mysqli_stmt_bind_param().

$query = "SELECT users.user_id, users.first_name WHERE users.active IS NULL AND ";
$query .= implode(
   ' OR ',
   array_fill(0, count($terms), 'word=?')
);

$query .= " GROUP BY users.user_id ORDER BY users.first_name DESC";
$stmt = mysqli_prepare($dbc, $query);
$types = str_repeat('s', count($terms));
mysqli_stmt_bind_param($stmt, $types, ...$terms);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
mysqli_stmt_bind_result($stmt, $user_id, $first_name);
mysqli_stmt_fetch($stmt);
0

Вы можете построить массив и объединить их на OR. Затем вызовите mysqli_stmt_bind_param с массивом параметров:

$query = "SELECT users.user_id, users.first_name WHERE users.active IS NULL AND";
foreach ($terms as $term) {
    $or[] = " word=?";
}
$query .= implode("OR ", $or);
$query .= " GROUP BY users.user_id ORDER BY users.first_name DESC";
$stmt = mysqli_prepare($dbc, $query);
call_user_func_array("mysqli_stmt_bind_param",
                     array_merge(array($stmt, str_repeat("s", count($terms)), $terms));

Я собирался изменить это как альтернативу foreach но FrankerZ имеет это как часть своего ответа:

$query .= implode(" OR ", array_fill(0, count($terms), "word=?");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню