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

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

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

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

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

Ответов (8)

Решение

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

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

while ($results = $query->fetch())
{
    echo $results['column'];
}
$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';
}

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

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

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

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

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

Я получил это из-за заблуждений php

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

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

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

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

У меня была аналогичная потребность, но я использовал переменную, взятую из формы. Я сделал это так, чтобы получить результаты из моей БД PostgreSQL, используя PHP:

<?php
     $player = $_POST['search'];  //variable from my search form
     $find = $sqlPDO->prepare("SELECT player FROM salaries WHERE player ILIKE ?;");
     $find->execute(['%'.$player.'%']);

     while ($row = $find->fetch()) {
         echo $row['player']."</br>";
     }
?>

"ILIKE" делает поиск нечувствительным к регистру, поэтому поиск корзины, корзины или cARt будет возвращать одни и те же результаты.

Для тех , кто использует именованные параметры, вот как использовать LIKE с % частичным соответствием для баз данных MySQL :

WHERE имя_столбца LIKE CONCAT ('%',: dangerousstring, '%')

где именованный параметр :dangerousstring .

Другими словами, используйте явно неэкранированные % знаки в собственном запросе, которые разделены и определенно не вводятся пользователем.

Изменить: синтаксис конкатенации для баз данных Oracle использует оператор конкатенации : ||, поэтому он просто станет:

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

Однако есть предостережения, поскольку @bobince упоминает здесь, что:

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

Так что это еще кое-что, на что следует обратить внимание при объединении лайков и параметризации.