Использование REGEXP внутри подготовленного оператора mysqli в PHP

Я пытаюсь сделать простой процесс поиска с кодами (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 внутри подготовленных операторов (без противоречивых вопросительных знаков)?

Спасибо.

2 ответа

Выведите одиночные кавычки вокруг ?. Ваш код должен читать:

$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);

licensed under cc by-sa 3.0 with attribution.