关于php:如何使用LIKE语句创建PDO参数化查询?

How do I create a PDO parameterized query with a LIKE statement?

这是我的尝试:

1
2
3
4
5
6
7
8
$query = $database->prepare('SELECT * FROM table WHERE column LIKE"?%"');

$query->execute(array('value'));

while ($results = $query->fetch())
{
    echo $results['column'];
}

我发布后马上想通了:

1
2
3
4
5
6
7
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));

while ($results = $query->fetch())
{
    echo $results['column'];
}


对于那些使用命名参数的人,以下是对MySQL数据库使用LIKE%部分匹配的方法:

1
WHERE column_name LIKE CONCAT('%', :dangerousstring, '%')

其中命名参数为:dangerousstring

换句话说,在您自己的查询中使用显式未转义的%符号,这些符号是分开的,并且绝对不是用户输入。

编辑:Oracle数据库的串联语法使用串联运算符:||,因此它将简单地变为:

1
WHERE column_name LIKE '%' || :dangerousstring || '%'

但是,有一些警告,如@bobince在这里提到的那样:

The
difficulty
comes when you want to allow a literal % or _ character in the
search string, without having it act as a wildcard.

因此,在将like和parameterization结合使用时,还需要注意其他事项。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->bindValue(1,"%$value%", PDO::PARAM_STR);
$query->execute();

if (!$query->rowCount() == 0)
{
    while ($results = $query->fetch())
    {
        echo $results['column'] ."<br />\
"
;
    }      
}
else
{
    echo 'Nothing found';
}


您也可以尝试这个。我面临类似的问题,但经过研究取得了结果。

1
2
3
4
5
6
7
8
9
$query = $pdo_connection->prepare('SELECT * FROM table WHERE column LIKE :search');

$stmt= $pdo_connection->prepare($query);

$stmt->execute(array(':search' => '%'.$search_term.'%'));

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($result);


这有效:

1
search `table` where `column` like concat('%', :column, '%')

我是从php妄想中得到的

1
2
3
4
$search ="%$search%";
$stmt  = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();

它对我有用,非常简单。就像他说的那样,在将其发送到查询之前,您必须"首先准备我们完整的文字"


PDO会转义"%"(可能导致sql注入):如果希望访问部分字符串,则使用先前的代码会产生期望的结果,但如果访问者键入字符"%",即使您不输入,也会获得结果t数据库中没有存储任何内容(可能导致sql注入)

我尝试了很多变化,所有这些都具有相同的结果,PDO转义了"%"导致不需要的/未激活的搜索结果。

我很值得分享,如果有人发现它周围的单词,请分享