Поисковые слова в тексте 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

Другие вопросы по тегам