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%"
или это будет совсем другое?
Ответы
Ответ 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" указано в ответе и не может быть изменено. Большое спасибо.