PHP PDO - 参数号无效:使用RLIKE时未定义参数

时间:2018-02-10 08:28:51

标签: php mysql pdo

我有一个带有text字段的简单MySQL表。

我可以直接在MySQL中进行搜索以搜索确切的短语(我不想使用全文索引,因此这种方法):

select * from tbl_log_days where post_content RLIKE '[[:<:]]the office[[:>:]]'

在MySQL中可以正常工作,并返回包含该确切短语的任何文本。

我希望使用PHP将其包含在搜索表单中。

我在PHP中设置了参数化查询:

$sql = "SELECT ID
             , post_date
             , post_content
             , post_cat_id
             , post_label
          FROM tbl_log_days
         WHERE post_content RLIKE '[[:<:]]:exact_text[[:>:]]'
      ORDER BY post_date";

$stmt = $pdo->prepare($sql);
$stmt->bindParam(':exact_text', $str);
$stmt->execute();

然而,当我运行它时,它出错:

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\data\php\public_html\diary\search.php:424

如果我将SQL更改为:

$sql = "SELECT ID
             , post_date
             , post_content
             , post_cat_id
             , post_label
          FROM tbl_log_days
         WHERE AND post_content = :exact_text '
      ORDER BY post_date";

工作正常。

问题似乎与RLIKE使用的'[[:<:]]:exact_text[[:>:]]'语法有关。

有什么方法可以逃避RLIKE中的特殊字符吗?

1 个答案:

答案 0 :(得分:1)

首先,在查询中用引号括起来不会使它成为占位符。

因此,您的查询中没有占位符。修复(正如评论中已经注意到的)是:

$sql = "SELECT ID
             , post_date
             , post_content
             , post_cat_id
             , post_label
          FROM tbl_log_days
         WHERE post_content RLIKE :match
      ORDER BY post_date";

$stmt = $pdo->prepare($sql);
// use bindValue as you pass a value, not a variable
$stmt->bindValue(':match', '[[:<:]]' . $str . '[[:>:]]');
$stmt->execute();