PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Badword-Funktion


midgard
13.10.2005, 11:00:34
Hallo,

möchte gern eine Badword-Funktion in mein Gaestebuchform. einbauen.
Habe aber keinen Plan wie ich das am besten realisiere.
Mein Ansatz ist die mit Sternen versehenen Wörter schon mit dem "submit" an das Script zu senden, das den Eintrag in die DB vornimmt,
also dort die Funktion aufzurufen (noch keine Ahnung wie).
Ist das überhaupt möglich, es schon beim absenden zu filtern, indem ich die Eingabe an eine Variable übergebe, auswerte und filter?
Oder ist es besser den Eintrag erst in der eintrag-einfuegen.php auszuwerten und dann mit Sternen zu versehen?
Kann ich bei dieser Version mit dem name='Eintrag' arbeiten, oder ist es notwendig eine neue Variable zu benutzen?

eintrag.php

require_once "func.inc.php";

echo "<form action='eintrag-einfuegen.php' method='post'>";
echo "<input class='gb' name='Name' maxlength='30' type='text'
value='Name' onFocus=\"this.style.backgroundColor='#663300'\"
onBlur=\"this.style.backgroundColor='#808080'\">";
echo "<input class='gb' name='Titel' maxlength='50' type='text'
value='Thema' onFocus=\"this.style.backgroundColor='#663300'\"
onBlur=\"this.style.backgroundColor='#808080'\">";
echo "<textarea class='gb' cols='100' name='Eintrag' rows='3'
wrap='hard' onFocus=\"this.style.backgroundColor='#663300'\"
onBlur=\"this.style.backgroundColor='#808080'\">Euer Eintrag im G&auml;stebuch</textarea><br>";
echo "<input class='button butt' type='submit' name='senden' tabindex='9'
value='Senden' onMouseover=\"this.style.backgroundColor='#663300'\"
onMouseout=\"this.style.backgroundColor='#808080'\">";
echo "<input class='button butt' type='reset' name='zur&uuml;cksetzen'
value='L&ouml;schen' onMouseover=\"this.style.backgroundColor='#663300'\"
onMouseout=\"this.style.backgroundColor='#808080'\">";
echo "</form>";

Wie die Funktion hier einbauen ??



eintrag-einfuegen.php


$DatabasePointer=mysql_connect("localhost", "***", "***");
mysql_select_db("***", $DatabasePointer);

$SQL = "INSERT INTO gaestebuch (Datum, Name, Titel, Eintrag)
VALUES (NOW(''), '".$_REQUEST['Name']."', '".$_REQUEST['Titel']."', '".$_REQUEST['Eintrag']."')";
mysql_query($SQL, $DatabasePointer);

if(mysql_affected_rows($DatabasePointer)==1)
{
echo"<div id='danke'>";
echo"Vielen Dank f&uuml;r Deinen Eintrag im G&auml;stebuch.";
echo"<a href='guestbook.php'>Zur&uuml;ck zum G&auml;stebuch</a>";
echo"</div>";
}



func.inc.php


function BadwordFilter($Nachricht)
{
$Badwords = array("bush", "sau", 'arsch', 'ficken');
foreach($Badwords as $Badword)
{
$Nachricht = str_replace($Badword, str_repeat("*", strlen($Badword)), $Nachricht);
}
return $Nachricht;
}


Vielen Dank an alle Helfer !!!

midgard
13.10.2005, 11:23:41
Hab es jetzt so gelöst:


require_once "func.inc.php";
$DatabasePointer=mysql_connect("localhost", "***", "****");
mysql_select_db("***", $DatabasePointer);

$SQL = "INSERT INTO gaestebuch (Datum, Name, Titel, Eintrag) VALUES (NOW(''), '".$_REQUEST['Name']."',
'".$_REQUEST['Titel']."', '".BadwordFilter($_REQUEST['Eintrag'])."')";
mysql_query($SQL, $DatabasePointer);
...


Es funktioniert. Gibt es noch eine bessere/elegantere Lösung die ich verwenden könnte?

Stevie B.
13.10.2005, 11:37:22
Du kannst die Funktion aufrufen, wann immer Du willst. Es gibt entweder die Möglichkeit, die Wörter bereits zu ersetzen, bevor sie überhaupt in die Datenbank geschrieben werden oder erst den Eintrag komplett in die Datenbank schreiben und erst bei der Ausgabe zu "formatieren". Das wiederum hat den Vorteil, dass Du als Webmaster weißt, welche bösen Wörter die User geschrieben haben.

hier mal ein Beispiel:
function BadwordFilter($Nachricht) {
//entweder in einem Array, wie Du schon hast oder in einer Tabelle in der DB
$Badwords = array('arsch','wichser','ficken');
foreach ($Badwords as Badword) {
$Nachricht = str_replace($Badword,'*',$Nachricht);
}
return $Nachricht;
}

//vor dem Eintrag formatieren
if ($_POST['senden'] == "Senden") {
$timestamp = time();
$name = trim($_POST['name']);
$title = trim($_POST['title']);
$entry = trim($_POST['eintrag']);
$entry = BadwordFilter($entry);
$result = "INSERT INTO $table (Datum, Name, Titel, Eintrag) VALUES ('$timestamp','$name','$title','$entry')";
if (mysql_query($result)) {
echo "Vielen Dank für Ihren Eintrag!";
} else {
echo "Beim Senden Ihres Eintrages ist leider ein Fehler aufgetreten.";
}
} //usw...

//bei der Ausgabe formatieren
$sql = mysql_query("SELECT * FROM $table ...");
if (mysql_num_rows($sql) > 0) {
echo "<table border=0>";
while ($tmp = mysql_fetch_array($sql)) {
echo "<tr>";
echo "<td>";
echo "Eintrag von ".$tmp[Name]." am ".date("d.m.Y",$tmp[Datum])."<br>";
echo BadwordFilter($tmp[Eintrag]);
echo "</td>";
echo "</tr>";
}
echo "</table>";
} else {
echo "Es sind noch keine Einträge vorhanden.";
}

Gruß,
Stevie B.

xabbuh
13.10.2005, 14:07:26
Da str_replace() auf mit Arrays als Argument klar kommt, kannst du dir die Schleife übrigens schenken:

<?php
function BadwordFilter($Nachricht)
{
$Badwords = array('arsch', 'wichser', 'ficken');
return str_replace($Badwords, '*', $Nachricht);
}
?>


Ich würde auf jeden Fall den Filter in die Ausgabe einbauen, da du dann die Liste der zu filternden Worte beliebig verändern kannst, ohne den Inhalt der Datenbank zu ändern.

midgard
14.10.2005, 22:51:36
Vielen Dank an beide Helfer !!!

Gruss