我正在尝试用这样的(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(没有冲突的问号)?
感谢。
答案 0 :(得分:5)
取出?
周围的单引号。您的代码应为:
$prep->prepare("SELECT * FROM details WHERE id REGEXP ?");
$prep->bind_param("s", $search_query);
现在看来,你传递的是一个参数,但是单引号中的?
被视为字符串,而不是参数标记。
答案 1 :(得分:1)
Ed回答的是正确的。
但是,如果您碰巧需要更复杂的正则表达式,可以使用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);