php - MySQL PDO : Using bound placeholder within a regular expression

标签 php mysql regex pdo

下面是一个尝试从 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/

相关文章:

php - Laravel/Illuminate fatal error

mysql - 如何计算api服务的数据并以 Angular 组件显示在卡片中

regex - 将文件名的第一部分移至文件扩展名之前的末尾

python - 正则表达式 unicode 替换不起作用

regex - Rails验证RGB十六进制

php - 如何将随机字符串列添加到 laravel 迁移

php - 我应该使用什么 SQL 语句来显示另一个表中的正确 ID

php - 为什么不显示wordpress fatal error ?

javascript - 在图表中显示来自 mysql 的日期

php - 从两个表中获取信息