Не удается получить строку, содержащую «%», из базы данных, используя PHP PDO - PullRequest
0 голосов
/ 12 апреля 2019

Я делаю сайт с автозаполнением панели поиска товаров.Когда пользователь вводит несколько букв, я сравниваю их с базой данных с помощью оператора LIKE и возвращаю продукты, которые выглядят одинаково.Пользователь может увидеть до 4 продуктов, о которых он думал, в выпадающем списке под строкой поиска.Теперь, когда пользователь нажимает на результат, я передаю его обратно в оператор PHP PDO.

Если продукт не содержит %, он работает нормально.Но у меня есть такие продукты, как «100% продукт А», и я не могу с этим справиться.Я знаю, что% используется в операторе LIKE.Я использовал, как, но результаты не были хорошими.Я получал другой вариант продукта, который хотел.Как мне пройти это?

$pdo = new PDO($dsn, $user, $passwd);

//Retrieving Product Name
$prodName = $_GET['name'];

$stm = $pdo->prepare("SELECT * FROM products WHERE productName = ?");
$stm->bindValue(1, $prodName);
$stm->execute();

$row = $stm->fetch(PDO::FETCH_ASSOC);

$results[0] = $row["productName"]; 
$results[1] = $row["price"];
$results[2] = $row["quantity"];

$result=implode("','", $results);         
echo $result;

Ответы [ 3 ]

0 голосов
/ 12 апреля 2019

Поскольку % имеет особое значение, вам просто нужно экранировать его, чтобы использовать его буквально, используя обычные \:

\%  A % character; see note following the table

Так что вам просто нужно str_replace() все %с \%.

См .: https://dev.mysql.com/doc/refman/8.0/en/string-literals.html

0 голосов
/ 12 апреля 2019

Нет ни одной проблемы с извлечением строки, содержащей символ% * , с оператором LIKE, не говоря уже об операторе сравнения, используемом в вашем коде.

Даже при том, что он может дать вам дополнительные результаты, но никогда не будет проблем с получением существующего результата.

Чтобы утверждать, что такая проблема существует, вы должны подтвердить свои слова, опубликовав Пример минимальной полной проверки , чтобы каждый мог запустить ваш код и подтвердить, что проблема действительно существует.

Однако в таком простом случае вместо доказательства вы просто обнаружите некоторую простую ошибку, совершенно не относящуюся к знаку%. Например, ваша строка поиска подвергается строгому кодированию / экранированию каким-либо кодом культа груза и, естественно, становится другой строкой, которая не имеет совпадений в базе данных

0 голосов
/ 12 апреля 2019

Ну, я бы просто удалил % из строки поиска, используя str_replace

//Retrieving Product Name
$prodName = str_replace('%', '', $_GET['name']);

Вы также можете избежать процента, заключив его в квадратные скобки или используя обратную косую черту:

//Retrieving Product Name
$prodName = str_replace('%', '[%]', $_GET['name']); // \% would work too instead of [%]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...