Zur Navigation

Einen String mit einträgen aus DB vergleichen

1 darkfr3ak

Hallo...

Ich hab hier ein kleines Problem mit einer Datenbankabfrage...
Also... ein User gibt in ein Textfeld (Name "message") einen Text ein.
Der wird dann per $_POST abgeschickt und überprüft. Bisher muss ich aber im Quelltext den übergebenen String auf Schlüsselwörter überprüfen.

Das möchte ich jetzt vereinfachen, aber ich bekomm einfach die Datenbankabfrage nicht hin.

Die Datenbank sieht so aus:

strSearch - das Schlüsselwort
strReplace - Die Ausgabe

Wie bekomm ich das hin, dass das Script die Datenbank nach den Schlüsselwörtern durchforstet und bei Fund die "Antwort" ausgibt?

Beispiel:
das Fettmarkierte ist das Schlüsselwort

Der eingegebene Text lautet:

Jörgs Forum ist super

Die Ausgabe sollte dann halt lauten:

Hast du was anderes erwartet? :-)

ich scheitere immer an der wortweisen Überprüfung der Tabelle.
Es ist kein Problem, wenn in einem Satz mehrere Schlüsselwörter vorkommen, die Ausgabe kann man ja dann unterdrücken.

LG und thx schonmal

16.12.2008 12:37

2 Jörg Kruse

Probier's mal mit INSTR():

$query = "SELECT strReplace FROM table WHERE INSTR('" . $text . "', strSearch)";

16.12.2008 13:27 | geändert: 16.12.2008 13:27

3 darkfr3ak

Hallo Jörg,

auf INSTR() bin ich natürlich nicht gekommen. Aber es klappt leider auch nicht.

Hab den Verdacht, dass es mit der Datenbank-Klasse zusammenhängt, die der eigentliche Entwickler des Chats nutzt.
Im Script sieht eine Abfrage so aus:

$sml = $db->sql("SELECT smileys_sign, smileys_img FROM {$prefix}smileys", false);

Diese Abfrage liefert mir aber ein Array zurück, welches ich dann mit
$sml[0][0]
auslesen kann (bezogen auf obige Abfrage, ist nur ein Beispiel, hat nichts mit meinem Problem zu tun).

In der Variable {$prefix} steht der vom user festzulegende Prefix der Tabellen in der DB.

Die Abfrage von dir mal ausprobiert. Es greift zwar auf die DB zu, aber eine Ausgabe erfolgt nicht... dieselbe Abfrage für die Ausgabe funktioniert aber, wenn ich die Schlüsselwörter im Quelltext prüf...

16.12.2008 15:23

4 Jörg Kruse

Die Abfrage von dir mal ausprobiert. Es greift zwar auf die DB zu, aber eine Ausgabe erfolgt nicht...

Gibt es eine Fehlermeldung (die du dir mit mysql_error() ausgeben lassen kannst)? Oder gibt die Abfrage nur ein leeres Ergebnis wieder?

16.12.2008 15:49

5 darkfr3ak

Habs nochmal probiert... es kommt nur ein leerer eintrag. Und da die sowieso geblockt werden, gibt es mir nichts aus...

Es dürfte aber keinen leeren Eintrag geben, da in der Datenbank zu Testzwecken eh nur ein Eintrag ist. und in dem übergebenen String dieses Schlüsselwort vorkommt...

16.12.2008 21:48

6 Jörg Kruse

Ich habe die Query mal getestet - bei mir funktioniert sie.

Also wenn in der Tabelle table ein Datensatz steht mit dem Wert 'bla' in der Spalte strSearch, wird dieser durch diese Abfrage gefunden:

$query = "SELECT strReplace FROM table WHERE INSTR('blablub', strSearch)";

17.12.2008 10:06

7 darkfr3ak

Hallo Jörg,

Hab mir mal die Query in ne einfach PHP-datei kopiert und die Abfrage machen lassen. da gibt es mir auch ohne probleme die gewünschte antwort aus. Muss also am Script an sich liegen... aber das is mir zu hoch...über die gleiche klasse kann ich werte in ne Datenbank einfügen. Auch Abfragen über SELECT gehen... nur halt diese spezielle Abfrage will nicht gehen.

$blacklist=$db->sql("SELECT etchat_blacklist_time FROM {$prefix}etchat_blacklist WHERE etchat_blacklist_ip = '".$user_param_all."' and etchat_blacklist_time > ".date('U'), false);

Die obige abfrage zum Beispiel funktioniert einwandfrei.

und mehr ist die von dir genannte ja auch nicht...

Und so in etwa sieht jetzt eine Prüfung auf ein Schlüsselwort im Quelltext aus:
if (strpos($_POST['message'],".time")!==false){
$db->sql("INSERT INTO {$prefix}etchat_messages ( etchat_user_fid , etchat_text, etchat_text_css, etchat_timestamp, etchat_fid_room, etchat_privat) VALUES ( 1, 'Es ist jetzt ".date('H:i')."', 'color:#".$_SESSION['etchat_v3_syscolor'].";font-weight:normal;font-style:normal;', ".date('U').", ".(int)$_POST['room'].", 0)", false);
}

und stell dir das jetzt mal vor mit ungefähr 20 Abfragen nach schlüsselwörtern...das sind an die 130 zeilen code, die ich mir gern sparen würde...

17.12.2008 16:08 | geändert: 17.12.2008 16:10

8 Jörg Kruse

Wie schaut denn die nicht funktionierende Abfrage genau aus?

17.12.2008 17:08

9 darkfr3ak

die sieht genau so aus:

if (!empty($_POST['message'])){
$db->sql("SELECT strReplace FROM {prefix}etchat_bot WHERE INSTR('" . $_POST['message'] . "', strSearch)", false);
}

das
if (!empty($_POST['message'])){
muss ich leider drinhaben, da sonst gar nichts passiert...

17.12.2008 19:11

10 Jörg Kruse

$_POST['message'] sollte nicht direkt in eine SQL-Abfrage eingebaut werden, da es SQL-Steuerzeichen enthalten könnte. Diese können mit mysql_real_escape_string() maskiert werden.

if (!empty($_POST['message'])){
$db->sql("SELECT strReplace FROM {prefix}etchat_bot WHERE INSTR('" . mysql_real_escape_string($_POST['message']) . "', strSearch)", false);
}

Weitere Fehler sehe ich allerdings nicht

17.12.2008 22:04