Как лучше всего это сделать?

  • Автор темы atlantias
  • 105
  • Обновлено
  • 17, May 2024
  • #1
Как лучше всего это сделать?

Привет,

У меня получилась такая таблица:

идентификатор, заголовок, другие поля

Я хочу выбрать только те записи, в которых «заголовок» не содержит конкретных слов.

пример:

выберите * из таблицы, где заголовок не похож на '%$word%', ограничение 5

Это работает, если нужно проверить только одно слово, но если список большой, скажем, 150 слов, тогда этот запрос может стать очень длинным...

пример:

выберите * из таблицы, где (заголовок не похож на «%word1%» или заголовок не похож на «%word2%» или заголовок не похож на «%word3%»...) предел 5

Есть ли лучший способ сделать это?

Слова взяты из другой таблицы, структура такая:

таблица_заблокированных слов:

идентификатор, слово

Я выбираю все слова в этой таблице, затем сохраняю их в массиве, а затем предоставляю их для запроса, как указано выше.

Есть ли другой более чистый способ сделать это?

Спасибо

atlantias


Рег
06 Mar, 2013

Тем
1

Постов
1

Баллов
11
  • 19, May 2024
  • #2
Если вы ищете в существующих заголовках ненормативную лексику, то эффективность поиска не важна. Вам нужен хороший фильтр каждый раз, когда заголовок сохраняется в вашей базе данных. Что-то вроде этого? https://www.hashbangcode.com/article/simple-swear-filter-php
 

mikosvell


Рег
07 Feb, 2013

Тем
0

Постов
3

Баллов
3
  • 19, May 2024
  • #3
Если это частый запрос, я бы подумал о добавлении дочерней таблицы, называемой чем-то вроде слов. идентификатор, родительский_ид, тип, слово индекс: слово поэтому, если бы мой заголовок был «Apple AirPods 3-го поколения», я бы вставлял каждое слово в отдельную строку.

Это небольшие накладные расходы, позволяющие сэкономить время, что позволит выполнить такой запрос.

выберите * из таблицы, которой не существует (выберите * из слов, где words.parent_id = table.id и type = 'title' и слово в ('word1', 'word2', 'word3')

Существует «двойной отрицательный результат»: подзапрос ищет совпадение, а основной запрос отбрасывает запись, если есть совпадение.

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

Добавляя столбец «Тип» в таблицу, вы разрешаете использовать его для других полей в будущем.

И, наконец, у вас есть 150 слов, которые вы не хотите видеть в заголовке??? Что движет этим поиском???
 

Super_Puper


Рег
01 Jan, 2011

Тем
0

Постов
2

Баллов
2
  • 01, Jun 2024
  • #4
@sarahk Это хорошая идея. Меня беспокоит только то, что сохранение каждого слова в заголовке как отдельной записи во второй таблице значительно увеличит размер этой таблицы. И я думаю, вы правы, список из 150 слов мне, наверное, не понадобится... 10-20 тоже может подойти. @c1lonewolf Да, это цель.
 

vasiliy1221


Рег
09 Sep, 2012

Тем
0

Постов
3

Баллов
3
  • 01, Jun 2024
  • #5
Фильтры следует применять, когда форма публикует данные для новой записи.

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

Заменять ненормативную лексику кучей символов или пустыми местами — это просто фигня.

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

Появляются спам-сообщения.

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

а если вы не собираетесь проверять каждое сообщение, вам нужен кто-то, кто будет это делать.

, код.

Не говоря уже о том, что на разных языках существует ненормативная лексика, которую необходимо учитывать (поиск слов для фильтров ненормативной лексики). Несколько лет назад группа матерей со всего мира начала составлять список, посмотрите.

В любом случае, JEET, отправил вам код в виде «Беседы». Я думаю, что это PM в наши дни, не совсем уверен.
 

taranovic


Рег
27 Sep, 2013

Тем
1

Постов
2

Баллов
12
  • 03, Jun 2024
  • #6
Если вы просто проверяете ненормативную лексику, вы можете придерживаться текущего запроса, пока находитесь в режиме очистки, и включать проверку ненормативной лексики при создании или обновлении записи. Нет необходимости в запросе, просто пропустите текст через функцию проверки.
 

katushka1


Рег
18 Mar, 2013

Тем
1

Постов
2

Баллов
12
  • 04, Jun 2024
  • #7
Итак, вы пытаетесь сделать что-то вроде фильтра ненормативной лексики для полей ввода текста? В этом случае ваш список ненормативной лексики должен представлять собой блок, в котором слова и фразы разделяются запятой. Посмотрим, смогу ли я найти для вас свои старые фильтры и коды.

Если я правильно помню, у меня было три разных типа фильтров, прежде чем поле ввода стало действительным.
 

metalcorvus


Рег
02 Aug, 2013

Тем
0

Постов
2

Баллов
2
  • 06, Jun 2024
  • #8
@sarahk Вот и вся проблема, не могу сделать проверку при входе сама. Все записи должны попасть в БД, несмотря ни на что. Придется делать спам-проверку от этих и отображать. Пользователи базы данных также могут просмотреть все записи без реализации проверки на спам.
 

notHumane


Рег
01 Jan, 2011

Тем
0

Постов
3

Баллов
3
  • 08, Jun 2024
  • #9
@sarahk Вот и вся проблема, не могу сделать проверку при входе сама. Все записи должны попасть в БД, несмотря ни на что. Придется делать спам-проверку от этих и отображать. Пользователи базы данных также могут просмотреть все записи без реализации проверки на спам.
 

khurtsiya


Рег
23 Jul, 2012

Тем
0

Постов
3

Баллов
3
  • 09, Jun 2024
  • #10
Я думаю, вы можете попробовать это:
 <?PHP

$s_query = $_POST['query'];

$s_ar = explode(' ',$s_query);

$sql = 'SELECT * FROM table WHERE title IS NOT NULL';

if($s_ar < 1){

echo 'empty query.';

}else{

$ts = implode('|',array_values($s_ar)).'';

$sql = ' '.$ts;

}

echo $sql;

?>
PHP:
 

Cerre Ne


Рег
21 Sep, 2011

Тем
1

Постов
4

Баллов
14
Тем
49554
Комментарии
57426
Опыт
552966

Интересно