Как создать PDO-параметризованный запрос с помощью инструкции LIKE?

Здесь моя попытка:

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

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

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

Ответ 1

Выяснил это сразу после публикации:

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

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

Ответ 2

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

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

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

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

Так что что-то еще нужно остерегаться при комбинировании лайков и параметризации.

Ответ 3

$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';
}

Ответ 4

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

$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);

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

Если вы хотите сделать это с 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%'

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

Ответ 8

Я получил это от бреда php

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

И это работает для меня, очень просто. Как он говорит, вы должны "подготовить наш полный литерал в первую очередь", прежде чем отправить его на запрос