Как создать параметризованный запрос PDO с помощью оператора LIKE? - PullRequest
97 голосов
/ 24 февраля 2009

Вот моя попытка:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');

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

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

Ответы [ 7 ]

121 голосов
/ 24 февраля 2009

понял это сразу после того, как я написал:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));

while ($results = $query->fetch())
{
    echo $results['column'];
}
72 голосов
/ 09 сентября 2011

Чтобы использовать Like с частичным совпадением%, вы также можете сделать это: column like concat('%', :dangerousstring, '%') с указанным параметром :dangerousstring. Другими словами, использование явно неэкранированных знаков% в вашем собственном запросе, которые разделены и определенно не являются пользовательским вводом.

Редактировать: Альтернативный синтаксис конкатенации, который я обнаружил, заключается в использовании оператора конкатенации: ||, поэтому он станет простым: where column like '%' || :dangerousstring || '%' etc

@ bobince упоминает здесь что:

The Трудность приходит, когда вы хотите разрешить буквальный символ % или _ в строка поиска, без использования ее в качестве подстановочного знака.

Так что это то, на что нужно обратить внимание при комбинировании лайков и параметризации.

17 голосов
/ 14 сентября 2012
$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 />\n";
    }       
} 
else 
{
    echo 'Nothing found';
}
9 голосов
/ 05 августа 2015

Вы также можете попробовать это. Я столкнулся с подобной проблемой, но получил результат после исследования.

$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);
4 голосов
/ 30 января 2017

Это работает:

search `table` where `column` like concat('%', :column, '%')
0 голосов
/ 08 января 2019

Если вы хотите сделать это с php, а не в запросе

$string = 'this is a string';
$len = strlen($string);
$first = substr_replace($string, '%', 0,0); // insert % before the first character
$string = substr_replace($first, '%', $len+1,0); // insert % after the last one

$string будет иметь значение '%this is a string%'

Я сделал из нее функцию и использую ее для моих похожих слов

0 голосов
/ 27 сентября 2015

PDO экранирует "%" (может привести к внедрению sql) : использование предыдущего кода даст желаемые результаты при поиске соответствия частичным строкам НО , если посетитель наберет символ "%" вы все равно получите результаты, даже если у вас ничего не хранится в базе данных (это может привести к SQL инъекциям)

Я перепробовал множество вариантов с одним и тем же результатом. PDO избегает "%", приводя к нежелательным / невозбужденным результатам поиска.

Я думал, что стоит поделиться, если кто-нибудь нашел слово вокруг него, пожалуйста, поделитесь им

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...