在PHP中使用mysqli中的REGEXP预处理语句

时间:2014-02-19 19:32:42

标签: php mysql regex mysqli prepared-statement

我正在尝试用这样的(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 个答案:

答案 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);