我有一个带有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中的特殊字符吗?
答案 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();