Ответов (8)8
Вы также можете попробовать это. Я столкнулся с аналогичной проблемой, но после исследования получил результат.
$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();
И у меня это работает, очень просто. Как он говорит, вы должны «сначала подготовить наш полный литерал», прежде чем отправлять его в запрос.
У меня была аналогичная потребность, но я использовал переменную, взятую из формы. Я сделал это так, чтобы получить результаты из моей БД 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 упоминает здесь, что:
Трудность возникает , когда вы хотите , чтобы в буквальном смысле
%
или_
символ в строке поиска, без него выступать в качестве шаблона.
Так что это еще кое-что, на что следует обратить внимание при объединении лайков и параметризации.