Я пытаюсь сделать простой процесс поиска с (noob) кодами, подобными этому:
$prep->prepare("SELECT * FROM details WHERE id REGEXP '?'"); $prep->bind_param("s", $search_query);
Это дает мне предупреждение:
Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement
Я предполагаю, что это может быть потому, что знак вопроса также используется для RegExp (необязательный предыдущий символ).
Любая идея о том, как использовать REGEXP внутри подготовленных операторов (без противоречивых вопросительных знаков)?
Благодарю.
Вытащите одиночные кавычки вокруг ?
, Ваш код должен читать:
$prep->prepare("SELECT * FROM details WHERE id REGEXP ?"); $prep->bind_param("s", $search_query);
Как сейчас, вы проходите в одном параметре, но ?
в одинарных кавычках рассматривается как строка, а не маркер параметра.
Ответ Эд ответил правильно.
Однако, если вам нужны более сложные регулярные выражения, вы можете использовать CONCAT
для создания выражения.
// Target SQL // SELECT * FROM `table` WHERE `field` REGEXP "value1|value2|value3"; // Target Prepared Statement SQL // SELECT * FROM `table` WHERE `field` REGEXP ?|?|?; $sql = 'SELECT * FROM `table` ' . 'WHERE `field` REGEXP CONCAT(?, "|", ?, "|", ?)'; $bindings = [$value1, $value2, $value3]; $prepStmt = $db->prepare($sql); $prepStmt->execute($bindings);