Я уже проверил ответы на такие вопросы, как this one (How do I create a PDO parameterized query with a LIKE statement in PHP). я в конечном итоге к этому решению:PDO/Php Проблема с инструкцией LIKE и специальными символами
$sql = "SELECT count(*) ".
"FROM mytable ".
"WHERE num_certif LIKE CONCAT('%',:val,'%')";
$valeur = 'azert';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':val', $val);
Это работает, но вот моя проблема: как я могу справиться с «%» символ? (т. е. $ valeur = '%'; возвращает все строки)?
Yep. Я знал это. Но если вы подумайте о принципе: prepare() и bindValue() были созданы для оптимизации * и *, избегая таких функций, как mysql_real_escape(), escape() и т. д. Поэтому, если мне нужно сделать str_replace ('%', ' \% '...) это означало бы, что одна (важная) цель была упущена. Именно поэтому я искал элегантное решение, вместо того, чтобы чувствовать себя как возвращение к старым временам «php safe_mode». –
Я не получил ваш Подготовленный оператор не имеет ничего общего с семантикой подстановочного знака. Символ подстановки не должен изменять его значение при использовании в качестве аргументов для подготовленных операторов. –
Я имею в виду: old code = "select * from xx where t =". Mysql_real_escape (blabla). "
новый код: prepare ("select * from xx where t =: tmp") then bindValue (': tmp', $ val). используя ваше предложение, это даст: bindValue (': tmp', str_replace ('%', '\%', $ val)). Для меня это не чистый код. Мы не должны использовать str_replace() здесь. Должен быть другой путь, потому что этот способ - это принцип «избежания нежелательных символов», который является принципом, который ** должен быть ** не существовать больше благодаря prepare() и bindValue(). Надеюсь, на этот раз я был более ясен :) –