Vordefinierte Wörter ersetzen (aus Array bzw. aus DB auslesen)

Neo2400

Mitglied
Hi Leute, ich habe ein Problem. Sicherlich kam die Frage schon des öfteren, doch ich habe bei meiner Suche keine Lösung gefunden.

Ich möchte für ein Kontaktformular einen Wortfilter einbauen.
Absätze, unnötige HTML-Tags und Schimpfwörter sollen vor dem Absenden durch andere ersetzt werden.

Ich habe das ganze an die Stelle im Code eingebaut, bevor die Daten in die MYSQL Datenbank geschrieben werden (logisch...)

Da ich diesen Wortfilter noch mehrfach auf der Website verwenden will, habe ich eine extra Datei mit Funktionen erstellt. Diese enthält folgenden Code:

Code:
<?php


function verifydata($message) {
include("server.php");
$db_link = mysql_connect($host,$user,$pw);
$db_sel = mysql_select_db($db)
or die("Verbindung fehlgeschlagen!");

$query1 = mysql_query("SELECT * FROM wordfilter ORDER BY id ASC");
#$zumbruch1 = "\n";
#$zumbruch2 = "<br>";

while ($row = mysql_fetch_array($query1)) {
        $message = str_replace($row['word'],$row['newword'],$message);
       # $message = str_replace($zumbruch1,$zumbruch2,$message);
      }

return $message;
}

Funktionier soweit auch. Ich rufe die Funktion von der anderen Seite auf, und Übergebe die Variable $message.

Jetzt scheitere ich an der Umwandlung von Zeilenumbrüchen... Wenn ich in der Datenbank den Eintrag \n durch < br > ersetzen will, funktioniert es nicht.
Benutze ich stattdessen Variablen (im Code als kommentar), funktioniert es!

über die nl2br() funktion weis ich bescheid, damit funktioniert es auch. Aber wieso funktioniert es nicht durch meine Datenbank? Ferner möchte ich auch, das alle HTML Tags rausgefiltert werden aus der Nachricht. Gibts dafür vllt auch ne universelle Funktion?

Was ist falsch?

Ferner möchte ich die Funktion Variablen unabhängig machen. Wie realisiere ich das? Das ich die Funktion einfach nur aufrufe , z. B. funktion($variable1, $variable2); und das er diese Variable dann verarbeitet und auch wieder ausgibt.
 
Zuletzt bearbeitet:

Flex

(aka Felix Jacobi)
Also gut, so wie du es gemacht hast, ist es nicht die performanteste Methode.
Plaziere [phpf]str_replace[/phpf] außerhalb der while Schleife und füttere es mit einem Array. So hast du nicht mehrere Hundert Funktionsaufrufe.

Wegen der Zeilenumbrüche könnte ich mir vorstellen, dass gpc_magic_quotes aktiviert ist? Was sagt deinen php.ini dazu?

Die Funktion würde ich so aufbauen:

PHP:
function badwords($text, &$db)
{
  $query = mysql_query("SELECT * FROM wordfilter ORDER BY id ASC", $db);
  while($row = mysql_fetch_assoc($query))
  {
    $badwords[] = $row['word'];
    $replacement[] = $row['newword'];
  }
  $text = str_replace($badwords, $replacement, $text);
  return $text;
}

Für deine Tags gibt es noch die wundervolle Funktion:
[phpf]strip_tags[/phpf]
Wobei ich grundsätzlich dagegen bin, diese zu verwenden. Was wenn jemand die eckigen Klammern im Text verwendet? Oder aus sonstigen Gründen?
Nimm doch lieber [phpf]htmlspecialchars[/phpf].
 

Neo2400

Mitglied
Ok.

Was genau ist jetzt an "mysql_fetch_assoc" besser als "mysql_fetch_array"?
Das hab ich schon oft gesehen, jedoch konnte ich keinen Unterschied feststellen...

Hab mein Script dementsprechend geändert, danke für den Tipp!
 

Flex

(aka Felix Jacobi)
[phpf]mysql_fetch_array[/phpf] gibt nicht nur einen assoziativen Array zurück, wie es mysql_fetch_assoc() tut, sondern auch einen numerischen, da standardmäßig MYSQL_BOTH eingestellt ist.
D. h. du verbrauchst den doppelten Speicherplatz, obwohl du meist nur den assoziativen Array benutzt.

Hier gibt es einen aktuellen Artikel darüber:

Einen Datensatz aus einem Result-Set laden