Поисковые слова в тексте html в описании поля mysql без обычного текста
Я модифицирую код в dolibarr, и у меня возникла проблема с поиском в описании продуктов с помощью редактора WYSIG (запись html текста). Поиск описания, содержащего несколько слов, не работает после
(возможно, всех тегов) или в самом начале текста, первое слово не возвращает описание. Кроме того, "galvanisé" работает с "é", но не с "d'options" с кавычками. см. примеры ниже:
Я попытался использовать htmlentities и включить конец или начало тегов (см. Ниже).
описание:
Стандартный фильтр со всеми опциями 900x400x116
Nom 22
EN779-2002
acier galvanisé
for( $i=0 ; $i < sizeof($tabMots) ; $i++) {
if($i == 0) {
if(is_numeric($tabMots[$i]))
$sql.= ' WHERE (p.description LIKE \'% '.$tabMots[0].' %\' OR p.description LIKE \'%>'.$tabMots[0].' %\' OR p.description LIKE \'%>'.$tabMots[0].'<%\' OR p.description LIKE \'% '.$tabMots[0].'<%\' )';
else
$sql.= ' WHERE (p.description LIKE \'% '.$tabMots[0].'%\' OR p.description LIKE \'% '.htmlentities($tabMots[0]).'%\' OR p.description LIKE \'%>'.$tabMots[0].'%\' OR p.description LIKE \'%>'.htmlentities($tabMots[0]).'%\' )';
} else {
if(is_numeric($tabMots[$i])) {
$sql.= ' AND (p.description LIKE \'% '.$tabMots[$i].' %\' OR p.description LIKE \'%>'.$tabMots[$i].'%\' OR p.description LIKE \'%>'.$tabMots[$i].' %\' OR p.description LIKE \'%>'.$tabMots[$i].'<%\' OR p.description LIKE \'% '.$tabMots[$i].'<%\' )';
} else {
$sql.= ' AND (p.description LIKE \'% '.$tabMots[$i].'%\' OR p.description LIKE \'% '.htmlentities($tabMots[$i]).'%\' OR p.description LIKE \'%>'.$tabMots[$i].'%\' OR p.description LIKE \'%>'.htmlentities($tabMots[$i]).'%\' )';
}
}
}
Я бы не хотел добавлять текстовое поле, чтобы не изменять базу данных dolibarr. Спасибо.
РЕДАКТИРОВАТЬ: Предлагаемый ответ не годится, потому что проблема заключается в текстовом формате HTML текстового описания, а не в критериях поиска.
2 ответа
Для тех, кто не задумываясь поставил -1, я хочу сказать, что подготовленные запросы не решили мою проблему, потому что они форматируют искомое слово. Здесь проблема заключалась в формате текста описания, и я провел исследования и увидел, что после вставки
htmlentities() сохраняет \n и другие символы. Однако я не знаю, что символ хранится в начале текста. Спасибо за помощь, но все же реализовал подготовленные запросы. Итак, вы должны добавить этот поиск для
вставленного, когда вам нужен пробел между% и словом '%\n'.$ Word.'%'. Здесь у вас есть корень слова
до.
Я думаю, что ваша ошибка будет в том, что'
войдите в слово d'options
экранирует строку в движке SQL.
$tabMots[0] = "d'options";
$sql.= ' WHERE (p.description LIKE \'% '.$tabMots[0].'%\'';
echo $sql;
Вышеупомянутое напечатает это:
WHERE (p.description LIKE '% d'options%'
Даже по выделению Stackru можно увидеть, что от этого получает SQL-движок.
Настоятельно рекомендую перейти к подготовленным заявлениям. Об этом читайте здесь:
Как я могу предотвратить SQL-инъекцию в PHP?
редактировать
Как перейти на подготовленные выписки? Пример:
$param = $tabMots[$i];
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE CONCAT('%',?,'%') ");
$stmt->bind_param("s", $param);
$stmt->execute();
Скопировано из этого ответа: php mysqli подготовил оператор LIKE