Привет, мне нужно изменить мой уже рабочий запрос на подготовленный оператор. Я просто не могу понять, как получить 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);'
пожалуйста, любая помощь будет большой, спасибо.
Я предлагаю изменить ваше $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, в основном является синтаксисом сахара для этой более старой функции.
Вам действительно не нужно перебирать свои термины во второй раз, просто передайте кучу слов "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);
Вы можете построить массив и объединить их на 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=?");
$terms
term?