Здесь моя попытка:
$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->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Выяснил это сразу после публикации:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Чтобы использовать Like с частичным совпадением%, вы также можете сделать это: column like concat('%', :dangerousstring, '%')
с указанным параметром :dangerousstring
. Другими словами, использование явно неэкранированных знаков% в вашем собственном запросе, которые разделены и определенно не являются пользовательским вводом.
Редактировать: альтернативный синтаксис конкатенации, который я обнаружил, заключается в использовании оператора конкатенации: ||, так что он станет простым: where column like '%' || :dangerousstring || '%' etc
where column like '%' || :dangerousstring || '%' etc
@bobince упоминает здесь, что:
Трудность возникает, когда вы хотите разрешить буквальный символ
%
или_
в строке поиска, не используя его в качестве подстановочного знака.
Так что что-то еще нужно остерегаться при комбинировании лайков и параметризации.
$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 избегает "%" , приводя к нежелательным/невозбужденным результатам поиска.
Я, хотя стоило делиться, если кто-то нашел слово вокруг, пожалуйста, поделитесь им.
Если вы хотите сделать это с 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%'
Я сделал функцию из нее и использую ее для моих подобных заявлений
Я получил это от бреда php
$search = "%$search%";
$stmt = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();
И это работает для меня, очень просто. Как он говорит, вы должны "подготовить наш полный литерал в первую очередь", прежде чем отправить его на запрос