2009-08-08 16 views
0

Ich versuche, ein Suchergebnis für jemandes Namen explodierte dann den Vornamen und Nachnamen jede Suche gegen jedes Feld 'erste' und 'letzte'.mysql mehrere Abfragen mit PHP

Aber muss Raum verlassen was, wenn jemand nach dem ersten letzten midle-Namen wie = $ who = James David Smith sucht, wird es explodieren und jeden der Namen gegen die erste Spalte und die letzte Spalte durchsuchen. In dem Fall gibt der Benutzer zuerst den Namen Nachname ein oder fügt einen zweiten Namen hinzu.

Hier ist was ich bisher habe aber ich bin stecken. Hilfe. Bitte.

<? 

$search = explode(' ', $who); 

$limit=verify($get['page'])?" limit ".($get['page']*10).",10":" limit 10"; 

$q="select * from users where (first IN('%$search[]%') or last IN('%$search[]%') or full_name LIKE '%".$get['who']."%') AND (city LIKE '%".$get['where']."%' or province LIKE '%".$get['where']."%') order by province";   

$rows=get_recordset($q); 

if(count($rows)){ 
    foreach($rows as $row){ 

echo $q; 

?> 

Antwort

2

Ich bin nicht sicher, ich habe Sie aber, wenn Sie das meinen ist:

Wenn Sie drei Namen dann - überprüfen Sie alle Namen gegen alle drei Felder (erste, letzte, Fullname).

Wenn Sie nur zwei Namen haben dann - prüfen Vornamen gegen erstes Feld und Nachnamen gegen letztes Feld

dann sollte es getan:

 
$search = explode(' ', $who); 
if (count($search) >2) { // in case we do got a middle name - 
    $whereNameStringsArr = array(); 
    foreach ($search as $val) { 
     $whereNameStringsArr[] = " first LIKE '%$val%' 
         OR last LIKE '%$val%' 
         OR full_name LIKE '%$val%' "; 
    } 
    $whereNameClause = implode(" OR ",$whereNameStringsArr); 
} else { // in case we don't got a middle name 
    $whereNameClause = " first LIKE '%{$search[0]}%' 
       OR last LIKE '%{$search[1]}%' "; 
} 
$limit=verify($get['page'])?" limit ".($get['page']*10).",10":" limit 10"; 
$q="select * from users where ($whereNameClause) 
       AND (city LIKE '%".$get['where']."%' or province LIKE '%".$get['where']."%') 
       order by province 
       $limit";   

$rows=get_recordset($q); 
.... 

Natürlich - stellen Sie sicher, validieren Sie alle Daten, die Sie von der Benutzereingabe erhalten

+0

Schließen. Ich mag, wo du gehst, aber nicht funktioniert. Wenn Sie die Reihenfolge des Personennamens umkehren und den Nachnamen zuerst suchen. Gibt nichts zurück. –

0

Warum also nicht eine unscharfe Suche tun? Wenn Sie die Daten explodieren, tun Sie etwas wie folgt aus:

$name = $_POST['name'] // John Michael Smith 

$first_name = substr($name, 0, strrpos($name, ' ')); //Returns everything before last space, ie John Michael 

$last_name = strstr($name, ' '); //Returns everything after first space, ie John Michael 

Jetzt laufen Sie nur die Abfrage mysql sondern setzen es für irgendetwas zu suchen, die die oben genannten Werte (Teilzeichensuche) enthält mit LOCATE:

$results = mysql_query("SELECT * FROM names 
       WHERE LOCATE(firstname, '$first_name') > 0 OR 
         LOCATE(lastname, '$last_name') > 0 
       ORDER BY lastname 

Ich nehme an, Sie wissen, was mit den Ergebnissen zu tun ist.


Quick Update, Wenn Sie sich Sorgen über Benutzer in Nachname Vorname Mittel Eingabe, oder was Sie haben, Sie immer die oben verwenden könnte, sondern ein orten auf der gesamten Zeichenfolge tun:

$results = mysql_query("SELECT * FROM names 
       WHERE LOCATE(firstname, '$name') > 0 OR 
         LOCATE(lastname, '$name') > 0 
       ORDER BY lastname 

Dies überprüft beide Spalten auf beliebige Instanzen der Zeichenfolge. Sie sollten wahrscheinlich (nachdem Sie die Zeichenkette saniert haben, wie bereits richtig vorgeschlagen wurde) auch alle Kommas (aber keine Bindestriche) entfernen, falls jemand als Letzter eintritt, oder was Sie zuerst haben. Ersetzen Sie sie durch Leerzeichen, und reduzieren Sie dann alle Multi-Leerzeichen auf ein Leerzeichen, um doppelt sicher zu sein.


Tut mir leid. Hier ist der Weg, um die Namen (durch Leerzeichen) zu teilen. Da ein Problem mit meiner substr Syntax:

$name = $_POST['name'] // John Michael Smith 

$first_name = substr($name, 0, strrpos($name, ' ')); //Returns everything before last space, ie John Michael 

$last_name = strstr($name, ' '); //Returns everything after first space, ie John Michael 
+0

Syntaxfehler in Zeile $ first_name = substr (0, strrchr ($ name, "")); // Gibt alles vor dem letzten Leerzeichen zurück, dh John Michael –

+0

Parse-Fehler: Syntaxfehler, unerwartet T_VARIABLE –

+0

Entschuldigung. Das ist, was ich zum Kopieren und Einfügen von Dokumentationsbeispielen bekomme.So erhalten Sie den Vornamen: '$ first_name = substr ($ name, 0, strrpos ($ name," "));' – Anthony

Verwandte Themen