Подтвердить что ты не робот

Mysql PDO, как связать LIKE

В этом запросе

select wrd from tablename WHERE wrd LIKE '$partial%'

Я пытаюсь связать переменную '$partial%' с PDO. Не знаете, как это работает с % в конце.

Будет ли это

select wrd from tablename WHERE wrd LIKE ':partial%'

где :partial привязано к $partial="somet"

или это будет

select wrd from tablename WHERE wrd LIKE ':partial'

где :partial привязано к $partial="somet%"

или это будет совсем другое?

4b9b3361

Ответ 1

+1 ответ karim покрывает его. Вы также можете сказать:

"SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')"

чтобы выполнить объединение строк в конце MySQL, а не в том, что в этом случае есть какая-то особая причина.

Все становится немного сложнее, если частичный wrd, который вы ищете, может сам содержать символ процента или подчеркивания (поскольку они имеют особое значение для оператора LIKE) или обратную косую черту (которую MySQL использует в качестве другого слоя экранирования в операторе LIKE - неправильно, в соответствии со стандартом ANSI SQL).

Надеюсь, это не повлияет на вас, но если вам нужно получить этот случай правильно, здесь беспорядочное решение:

$stmt= $db->prepare("SELECT wrd FROM tablename WHERE wrd LIKE :term ESCAPE '+'");
$escaped= str_replace(array('+', '%', '_'), array('++', '+%', '+_'), $var);
$stmt->bindParam(':term', $escaped);

Ответ 2

$var = "partial%";
$stmt = $dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial");
$stmt->bindParam(":partial", $var);
$stmt->execute(); // or $stmt->execute(array(':partial' => $var)); without 
                  // first calling bindParam()
$rs = $stmt->fetchAll();

Использование параметров вопросительной метки:

$stmt = $dbh->prepare('select wrd from tablename WHERE wrd LIKE ?');
$stmt->execute(array('partial%'));
$rs = $stmt->fetchAll();

http://www.php.net/manual/en/pdo.prepare.php

Ответ 3

Вы можете использовать addcslashes перед подготовленным оператором. Я тестировал mysql.

$value = addcslashes($value, '%');
$stmt = $db->prepare('select * from products where description like ?');
$stmt->execute(["$value%"]);

Ответ 4

Я думаю, что принятый ответ (@bobince) может быть немного упрощен.

Вы можете уменьшить его до чего-то подобного, чтобы обрабатывать подчеркивание, процент и т.д. В параметре, но при этом сопоставлять запрос LIKE с частичным%:

$stmt = $dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial");
$stmt->execute([":partial" => addcslashes($value, '_%') . "%"]);
$rows = $stmt->fetchAll();

Ответ 5

В приведенном ниже коде отображаются только первые ключевые слова в базе данных!

"SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')"

Попробуйте это, если вы хотите найти все ключевые слова из базы данных

"SELECT wrd FROM tablename WHERE wrd LIKE :partial";
$stmt->execute(array(':partial'=>'%'.$YourVarHere.'%'));

Ответ 6

Вот как вы должны это делать

bindValue(':partial', '%' . $_GET['partial'] . '%');

Спасибо,

Qwerty

Ответ 7

Кто написал answare (может быть karim79):

$var ="partial%"
$stmt =$dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial")
$stmt->bindParam(":partial",$var)
$stmt->execute(); //or$stmt->execute(array(':partial'=>$var)); without 
                  // first calling bindParam()
$rs =$stmt->fetchAll();

Использование параметров вопросительной метки:

$stmt =$dbh->prepare('select wrd from tablename WHERE wrd LIKE ?');
$stmt->execute(array('partial%'));
$rs =$stmt->fetchAll();

Большое спасибо ему. Я искал код и видел много примеров, но я не мог решить свою проблему. На этот раз мне удастся это сделать. Я использовал раздел "Использование параметров вопроса:" в коде.

Для других, если вы хотите получить значение из переменной, вы можете изменить код на

$stmt->execute(array($variable.'%'));

вместо

$stmt->execute(array('partial%'));

Поскольку слово "partial" указано в ответе и не может быть изменено. Большое спасибо.