Mailinglisten-Archive |
Udo Mueller schrieb > Es soll in der Form +auto -verkauf gehen so das alles was mit > auto zu tun hat aber nicht mit verkauf kommt (Wie eben bei > allen suchmaschinen) > > Weis jemand wie ich das anstellen muß das dies auch funktionier? Ja, Du mußt den Suchstring, den Du vom Client bekommst in SQL Umwandeln. Ich hatte mal ansatzweise eine kleine Funktion dafür geschrieben. Versteht ansatzweise folgende Operatoren " +, -, AND, OR" und zusätzlich Phrasen. Recyceltes Mail: Nachfolgendes als Anfang mal schnell zusammengetippt. Das hat allerdings noch einige gravierende Nachteile, u.a: - kann keine Klammern auflösen, wodurch komplexere Statements nicht möglich sind - Fehlerbehandlungsroutinen fehlen vollständig - standardmäßig wird per AND verknüpft function generateDbQuery($table, $field, $string) { $string = preg_replace("= {2,}=", " ", trim($string)); preg_match_all("=((((AND )|(OR )|(NOT ))|([+-]))?((\"[^\"]+\")|([^\" ])) +)=", $string, $back); $query = "SELECT $field FROM $table WHERE"; $flag = 0; $max = count($back[1]); for($i = 0; $i < $max; $i++) { $val = $back[1][$i]; // debug-Ausgabe: // echo "|$val|<br>\n"; if(preg_match("=^((AND )|(\+))\"?([^\"]+)\"?$=", $val, $matches)) { if($flag == 0) { $query .= " ($field LIKE '%$matches[4]%')"; } else { $query .= " AND ($field LIKE '%$matches[4]%')"; } } elseif(preg_match("=^((NOT )|(\-))\"?([^\"]+)\"?$=", $val, $matches)) { if($flag == 0) { $query .= " ($field NOT LIKE '%$matches[4]%')"; } else { $query .= " AND ($field NOT LIKE '%$matches[4]%')"; } } elseif(preg_match("=^(OR )(.*)$=", $val, $matches)) { if($flag == 0) { $query .= " ($field LIKE '%$matches[4]%')"; } else { $query .= " OR ($field LIKE '%$matches[4]%')"; } } else { if($flag == 0) { $query .= " ($field LIKE '%$val%')"; } else { $query .= " AND ($field LIKE '%$val%')"; } } $flag = 1; } return $query; } echo generateDbQuery("table", "field", 'sdffd +"A B" -C +D -"E F" AND hurz NOT purz'); Ausgabe: SELECT field FROM table WHERE (field LIKE '%sdffd%') AND (field LIKE '%A B%') AND (field NOT LIKE '%C%') AND (field LIKE '%D%') AND (field NOT LIKE '%E F%') AND (field LIKE '%hurz%') AND (field NOT LIKE '%purz%') Guido Haeger
php::bar PHP Wiki - Listenarchive