【问题标题】:Using REGEXP inside mysqli prepared statement in PHP在 PHP 中的 mysqli 准备语句中使用 REGEXP
【发布时间】:2014-03-20 08:59:08
【问题描述】:

我正在尝试使用这样的(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(没有冲突的问号)吗?

谢谢。

【问题讨论】:

  • 你的s参数在哪里?
  • @AliMasudianPour 你的意思是搜索查询?我“得到”了它(使用 $_GET)。很好,准备好的查询中不需要的引号有问题。无论如何谢谢:)
  • @AlexL 真的吗? O.o我看不出我怎么能从你给出的答案链接中找到答案。我想它需要好的眼睛,我戴眼镜(或者我只是太菜鸟):) 无论如何谢谢。
  • @AlexL 啊,我明白了。是的,这就是问题所在:) Ed Cottrell 首先指出了这一点。无论如何,谢谢。

标签: php mysql regex mysqli prepared-statement


【解决方案1】:

去掉?周围的单引号。您的代码应为:

$prep->prepare("SELECT * FROM details WHERE id REGEXP ?");
$prep->bind_param("s", $search_query);

就目前而言,您正在传递一个参数,但单引号中的 ? 被视为字符串,而不是参数标记。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-03-01
      • 1970-01-01
      • 2016-07-22
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      相关资源
      最近更新 更多