sql >> Databasteknik >  >> RDS >> Mysql

dåligt ordfilter skrivet inbyggt i MYSQL utan php

Jag lägger upp det som ett nytt svar, eftersom jag använder en annan teknik här. Jag tror att vi bara kan använda en MySQL-funktion och en BEFORE INSERT-utlösare. Funktionen för att dela en sträng är hämtad från detta andra svar .

CREATE FUNCTION strSplit(x VARCHAR(1000), delim VARCHAR(12), pos INTEGER) 
RETURNS VARCHAR(1000)
BEGIN
  DECLARE output VARCHAR(1000);
  SET output = REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos)
                 , CHAR_LENGTH(SUBSTRING_INDEX(x, delim, pos - 1)) + 1)
                 , delim
                 , '');
  IF output = '' THEN SET output = null; END IF;
  RETURN output;
END

och INSERT-utlösaren skulle vara så här:

CREATE TRIGGER change_words
BEFORE INSERT ON sentences
FOR EACH ROW
BEGIN
  DECLARE i INT;
  DECLARE s VARCHAR(1000);
  DECLARE r VARCHAR(1000);
  SET i = 1;
  SET s = '';
  REPEAT
    SET s = (
      SELECT
        REPLACE(split, COALESCE(bad, ''), good)
      FROM
        (SELECT strSplit(new.sentence, ' ', i) AS split) s
        LEFT JOIN words w ON s.split = w.bad
      LIMIT 1
      );
    SET r = CONCAT_WS(' ', r, s);
    SET i = i + 1;
    UNTIL s IS NULL
  END REPEAT;
  SET new.sentence = r;
END

detta kommer att gå snabbare, eftersom meningen bara konverteras en gång när du infogar den i databasen. Fortfarande finns det några förbättringar som vi behöver, samma som tidigare:

LEFT JOIN words w ON s.split = w.bad

det kommer inte att matcha ord som innehåller separator , . ! ? och ersätt-funktionen

REPLACE(split, COALESCE(bad, ''), good)

kommer att vara skiftlägeskänslig. Det går enkelt att fixa om du vill. Se en fiol här .



  1. Rälsmodell med främmande nyckel till sig själv

  2. Skicka flera fält i ett formulär (PHP)

  3. Ska jag använda PreparedStatements för alla mina databasinlägg i Java?

  4. DATEFROMPARTS() Exempel i SQL Server (T-SQL)