У меня есть эта строка в PHP, которая строит параметр запроса в PDO:
$p[':criteria'] = '%' . $search . '%';
Рассматриваемая строка MySQL выглядит так:
d.d_name LIKE :criteria
Проблема в том, что если я вставлю число в $ search, оно преобразует его в символ. Например, если я установлю $ search в:
6008
Я хочу, чтобы это было:
%6008%
но то, что я получаю, это:
`08%
Похоже, что он% -кодирует первые 2 символа. Я пытался использовать urldecode (), чтобы вернуть его, но это не сработало. Он сохранил строку как `08%.
Как я могу предотвратить это?
Механизм привязки слишком общий, потому что он имеет дело со многими типами, и есть некоторые крайние случаи, подобные этому.
Так что в этом случае, вместо использования bind, смонтируйте ваш запрос в виде строки:
$sql = "...whatever d.d_name LIKE '%" . $search . "%'";
Отладка $ search, чтобы убедиться, что в ней нет кавычек или чего-либо еще перед объединением. Если у него есть с отделкой или что-то в этом роде.
Также не забудьте проверить правильность $ search из-за SQL-инъекций.
Это просто иллюзия. Вы пытаетесь просмотреть свой запрос, используя неподходящий инструмент, например браузер. И этот инструмент делает некоторые преобразования. Абсолютно не имеет отношения к SQL-материалу.
В то время как для базы данных ваш запрос остается точно таким же. И нет ни одной проблемы с любыми конверсиями. Просто запустите ваш запрос и получите результат.
Я рекомендую вам прочитать о экранировании строк, это может помочь вам в решении этой проблемы, а также хорошо знать некоторые основы программирования.
Попробуйте использовать подготовленное утверждение, как показано ниже.
$sth = $dbh->prepare("SELECT *
FROM `test`
WHERE `criteria` LIKE :criteria");
$sth->bindParam(':criteria', '%'.$search.'%');
$sth->execute();