In dem Versuch Code zu rejuvenate schrieb ich vor mehr als 14 Jahren. Ich bin gekommen, um zu sehen, dass das schöne kleine Setup, das ich damals geschrieben habe, ... an bestimmten Stellen fehlte, nämlich die Handhabung von Benutzereingaben.PHP/MySQL bessere Benutzersuche
Lektion: Unterschätzen Sie nie Benutzer Fähigkeit, Müll, Tippfehler und Betrüger vorbei Ihre Validatoren zu injizieren.
Der alte Weg erreicht die kritische Masse, da sich jetzt 470 Elemente in einem SELECT-Dropdown befinden. Ich möchte diesen Teil des Prozesses neu erfinden, damit ich mir keine Sorgen machen muss, dass es einen Bruchpunkt erreicht.
Die Idee besteht also darin, eine unscharfe Suchmethode zu entwickeln, so dass nach Eingabe der Suchzeichenfolge durch die Schreibkraft fünf Datenelemente überprüft werden, die alle in derselben Zeile liegen.
Ich muss den Namen überprüfen, der mit dem Stage-Namen, zwei ebenfalls bekannten Namen sowie deren rechtmäßigen Namen und als letzte Prüfung mit einem soundex() - Index anhand ihres Stage-Namens (dies fängt a wenige Rechtschreibfehler verpasst sonst)
Ich habe einen komplizierten Block von Code versucht, um diese Dinge zu überprüfen (und es funktioniert nicht, meistens, weil ich denke, dass ich die Vergleiche zu streng codiert) als Teil einer Do/While-Schleife .
In der folgenden Zeile würde var $Rin
den vom Benutzer angegebenen Namen enthalten.
$setr = mysql_query("SELECT ID,StageName,AKA1,AKA2,LegalName,SoundEx FROM performers");
IF ($R = mysql_fetch_array($setr)) {
do {
$RT = substr(trim($Rin), 5);
$RT1 = substr($R[1], 5);
$RT2 = substr($R[2], 5);
$RT3 = substr($R[3], 5);
$RT4 = substr($R[4], 5);
$RTx = soundex($RT);
IF ($RT == $RT1) {
$RHits[] = $R[0];
}
IF ($RT == $RT2) {
$RHits[] = $R[0];
}
IF ($RT == $RT3) {
$RHits[] = $R[0];
}
IF ($RT == $RT4) {
$RHits[] = $R[0];
}
IF ($RTx == $R[5]) {
$RHits[] = $R[0];
}
} while ($R = mysql_fetch_array($setr));
}
Die Idee ist, dass ich ein Array der ID # 's der Nähe von Hits bauen werde, die ich in einem ausgewählten Drop-Down-bevölkern werden, die nur hoffentlich weniger Treffer, dass die gesamte Tabelle hat. Dies bedeutet, dass Sie nach einer Ergebnismenge aus dem Inhalt dieses Arrays suchen müssen, um den Namen des Performers im Dropdown-Feld SELECT anzuzeigen und die ID # als Wert für diese Auswahl zu übergeben.
Das ist, wenn ich das Problem "Ich brauche ein Array in meinem WHERE-Klausel" Hit, und nachdem ich diese Antwort gefunden habe, beginne ich zu vermuten, dass ich aufgrund der unten stehenden Nr. 2 Pech habe. Also habe ich nach alternativen Suchmethoden gesucht und bin mir nicht sicher, ob ich irgendwo anders als verwirrt bin.
Gibt es also eine bessere Möglichkeit, eine einzelne Tabelle für sechs Felder zu scannen, fünf gegen Benutzereingaben zu prüfen und die sechste für die Anzeige in einer Teilmenge der ursprünglichen Tabelle zu notieren?
Denkprozess:
gegen die gesamte Tabelle, pro Datensatz, test $ Rin gegen diese Tests in dieser Reihenfolge:
$ Rin -> stagename
$ Rin -> AKA1
$ Rin -> AKA2
$ Rin -> Namensrecht
soundex ($ Rin) -> soundEx
, wo ein Treffer bei einer der fünf Operationen die ID # zu einem Ergebnis-Array hinzufügt, das verwendet wird, um die Ergebnisse von 470 Darstellern auf eine vernünftige Liste herunterzuschränken, aus der sie auswählen können.
Festlegungen:
1) Wie schon geschrieben, ich weiß, dass das ein SQL-Injection-Angriff anfällig ist.
2) Server läuft PHP 4.4.9 und MySQL 4.0.27-Standard, ich kann es nicht aktualisieren. Ich muss beweisen, dass es funktioniert, bevor Geld ausgegeben wird.
3) Dies ist Hobby-Zeug, nicht mein Job.
4) Die Interpreten verwenden häufig nicht englische Namen oder Elemente in ihren Namen, was zu Tippfehlern und Verdoppelungen durch die Schreibkräfte geführt hat.
Ich habe eine Menge mysqli und PDO Antworten für diese Art von Sache gefunden, und ich sehe eine Menge Dinge, die nur die Hälfte sinnvoll sind (wie Link # 4 unten). Ich arbeite daran, mich über diese Dinge auf dem Laufenden zu halten, während ich versuche zu reparieren, was kaputt geht.
Orte sah bereits:
- PHP mysql using an array in WHERE clause
- PHP/MySQL small-scale fuzzy search
- MySQL SubString Fuzzy Search
- Sophisticated Name Lookup
Die ersten Dinge zuerst, "mysql_ *" sind jetzt deeperated. Verwenden Sie stattdessen "mysqli_ *" -Funktionen. :) – Ronald
Ist MySQL auf PHP v4.4.9 verfügbar? –
Mit mehreren hundert Optionen und einer Typ-Ahead, würde ich vorschlagen, Daten über Serviceaufruf (AJAX) im Hintergrund nach dem Laden der Seite zu laden, und Typahead mit einem Javascript-Tool, z. [Typaehead-Bibliothek von Twitter] (https://twitter.github.io/typeahead.js/examples/), * besonders * wenn Sie nach mehreren Spalten suchen. – alttag