Я пытаюсь отобразить отдельный набор строк в PHP на основе результатов запроса MySQL, но вижу повторяющиеся записи, выводимые в HTML.
Мой код PHP и MySQL выглядит следующим образом:
<h2>Related products</h2>
<?php
$title=str_replace(' ',',',$_GET['title']);
$words=explode(',',$title);
foreach ($words as $word){
if (strlen($word) > 5){
$res=mysqli_query($link, "SELECT title,id FROM posts WHERE title LIKE '% $word %' or title LIKE '%$word' or title LIKE '$word%' ORDER BY id DESC");
while ($row=mysqli_fetch_array($res)){
echo "<a href='/product/".$row['id']."/'><h3>".$row['title']."</h3></a>";
}}}
?>
Я искал уже заданные похожие вопросы и, основываясь на их рекомендациях, попытался подать заявку:
Select DISTINCT..
А также:
while ($row=array_unique(mysqli_fetch_array($res)))
Однако он по-прежнему показывает повторяющиеся результаты. (Один и тот же товар отображается 3-5 раз в разделе сопутствующих товаров.)
(Возможное) примечание: не используйте интерполяцию или конкатенацию строк для получения значений в запросах SQL. Это подвержено ошибкам и может сделать вашу программу уязвимой для атак SQL-инъекций. Используйте параметризованные запросы. См. "Как включить переменную PHP в инструкцию MySQL" и "Как предотвратить внедрение SQL в PHP?".
Отредактируйте вопрос и предоставьте минимальный воспроизводимый пример, то есть
CREATE
операторы таблиц или других задействованных объектов (вставьте текст, не используйте изображения, не ссылайтесь на внешние сайты),INSERT
инструкции для выборочных данных (то же) и желаемый результат с этими примерными данными в табличном текстовом формате.В конце концов я добавлю mysqli_real_eascape_string в $_GET['title'] для предотвращения SQL-инъекций. но я не уверен, что мне нужно уточнить в этом посте
Нет, забудьте
...real_eascape...
и используйте параметризованные запросы!Уточните, как я вам сказал. Что конкретно вам в нем не понятно?
Вы выполняете запрос n раз, по одному разу для каждого слова. Таким образом, если заголовок соответствует более чем одному слову, он будет совпадать при каждой итерации. Вместо того, чтобы повторять запрос, вам нужно повторить, чтобы создать одно предложение where
… и сейчас самое время начать использовать параметризованный запрос, потому что вам все равно нужно изменить запрос. Может и правильно сделать.