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

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

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

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

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

6 ответов


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

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

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

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

Edit: альтернативный синтаксис, который я нашел, заключается в использовании оператора конкатенации:|/, поэтому он станет просто: where column like '%' || :something || '%' etc

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

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

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


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

это работает:

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

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

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

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