下面是一个尝试从 MySQL 表中获取某些行的 PHP 代码段:
$connect = dbconn(PROJHOST,'dbcontext', PROJDBUSER, PROJDBPWD);
$sql= "SELECT contextleft, contextright
FROM tblcontext
WHERE contextleft REGEXP '[[:<:]]:word[[:>:]]'
LIMIT 0, 10";
$xleft = array();
$xright = array();
$countrows = 0;
$query = $connect->prepare($sql);
$query->bindParam(':word', $term);
if($query->execute()) {
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $row){
$xleft[$countrows] = $row['contextleft'];
$xright[$countrows] = $row['contextright'];
$countrows++;
}
$notfound = null;
}
我认为上面代码中的以下行存在一些问题:
$sql= "SELECT contextleft, contextright FROM tblcontext WHERE contextleft REGEXP '[[:<:]]:word[[:>:]]' LIMIT 0, 10";
基本上,我需要运行一个匹配单词(由 :word 占位符绑定(bind))的正则表达式并返回匹配的记录。该代码在其他方面都很好,因为它无需正则表达式即可工作。但不知何故,当我使用正则表达式时它拒绝返回任何内容。我在正则表达式中使用占位符参数的方式有问题吗?
简而言之,我的问题是如何在正则表达式中使用绑定(bind)占位符?
附加信息:该表名为tblcontext,具有以下结构:
Engine MyISAM
sn: int(11), auto-increment, primary key
contextleft: varchar(190), fulltext index, unique
contextright: varchar(190), fulltext index, unique
当用户输入时应匹配的一些随机示例,例如fly:
I want to fly
To fly is easy
She will never fly because she is too heavy
当用户输入fly时不应匹配的一些随机示例:
Flying is easy
There is a blowfly on your food
She has been flying since last night
我无法对上述示例使用全文搜索,因为它仅适用于大于 3 个字符的搜索字符串。
最佳答案
除非您指定不带引号的数据类型(例如 PDO::PARAM_INT
),否则您注入(inject)的字符串将被带引号。由于您不想在正则表达式模式中添加引号(已用引号括起来),因此您需要将整个模式放入绑定(bind)参数中。
$connect = dbconn(PROJHOST,'dbcontext', PROJDBUSER, PROJDBPWD);
$sql= "SELECT contextleft, contextright
FROM tblcontext
WHERE contextleft REGEXP :word
LIMIT 0, 10";
$xleft = array();
$xright = array();
$countrows = 0;
$query = $connect->prepare($sql);
$word = "[[:<:]]".$term."[[:>:]]";
$query->bindParam(':word', $word, PDO::PARAM_STR);
if($query->execute()) {
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $row){
$xleft[$countrows] = $row['contextleft'];
$xright[$countrows] = $row['contextright'];
$countrows++;
}
$notfound = null;
}
关于php - MySQL PDO : Using bound placeholder within a regular expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34771957/