Вопрос по php, pdo, sql-like, mysql – реализовать запрос LIKE в PDO

32

У меня проблемы с реализацией LIKE в PDO

У меня есть этот запрос:

$query = "SELECT * FROM tbl WHERE address LIKE '%?%' OR address LIKE '%?%'";
$params = array($var1, $var2);
$stmt = $handle->prepare($query);
$stmt->execute($params);

Я проверил$var1 а также$var2 они содержат оба слова, которые я хочу найти, мой PDO работает нормально, так как некоторые из моих запросовSELECT INSERT они работают, просто я не знаком сLIKE здесь, в PDO.

Результат не возвращается. Сделать мой$query синтаксически правильно?

Возможный дубликатHow do I create a PDO parameterized query with a LIKE statement? feeela

Ваш Ответ

5   ответов
5

Нет, вам не нужно указывать готовые заполнители. Кроме того, включите отметки% внутри ваших переменных.

LIKE ?

И в переменной:%string%

Я на мобильном телефоне, но постараюсь объяснить как можно лучше. Смотрите мое редактирование.
Хм, простите, но я не совсем уверен, как реализовать то, что вы только что предложили. Leandro Garcia
2

Просто используйте следующее:

$query = "SELECT * FROM tbl WHERE address LIKE CONCAT('%', :var1, '%')
            OR address LIKE CONCAT('%', :var2, '%')";

$ar_val = array(':var1'=>$var1, ':var2'=>$var2);
if($sqlprep->execute($ar_val)) { ... }
Это медленнее, чем добавление% непосредственно в связанные переменные.
69

% знаки в$params, не в запросе:

$query = "SELECT * FROM tbl WHERE address LIKE ? OR address LIKE ?";
$params = array("%$var1%", "%$var2%");
$stmt = $handle->prepare($query);
$stmt->execute($params);

Если вы посмотрите на сгенерированный запрос в предыдущем коде, вы увидите что-то вродеSELECT * FROM tbl WHERE address LIKE '%"foo"%' OR address LIKE '%"bar"%'потому что подготовленный оператор заключает в кавычки ваши значения внутри уже заключенной в кавычки строки.

+1 за объяснение .. Но я не думаю, что есть способ посмотреть на сгенерированный запрос ... есть ли что-нибудь подобное?
Что произойдет, если мой параметр & quot; $ name% & quot; и пользователь вводит: $ name = '% bob'. Разве не было бы непреднамеренного побочного эффекта поиска с привязкой вместо поиска с привязкой слева? Как я мог бы предотвратить это?
Не могу понять это за всю мою жизнь, и я все об этом забыл. Потрясающий ответ. Спасибо!
4
$query = "SELECT * FROM tbl WHERE address LIKE ? OR address LIKE ?";
$params = array("%$var1%", "%$var2%");
$stmt = $handle->prepare($query);
$stmt->execute($params);
2

$title = 'PHP%';
$author = 'Bobi%';
// query
$sql = "SELECT * FROM books WHERE title like ? AND author like ? ";
$q = $conn->prepare($sql);
$q->execute(array($title,$author));

Надеюсь, это сработает.

Похожие вопросы