Wie schreibt man eine Suchfunktion?

ciberjoerg

Erfahrenes Mitglied
Hi an alle.
Ich hab mal eine frage, wie kann ich mit php eine Suchfunktion die aus mehreren Datenbanken Informationen holt Schreiben ohne das nichtausgefüllte Felder Berücksichtigt werden.

Meine felder Haben die namen nic (usernamen) soll aus der Datenbank auch ähnliche Namen anzeigen bsp: ich gebe joerg ein sollen mir alle usernamen die joerg enthalten angezeigt bekommen.
alter von bis. Ich hab in der Datenbank 3Felder für Geburtsdatum, dd, mm und jjjj alsoTag, Monat und Jahr. wenn nun jemand imAlter von 16 bis 22 eingibt, müssten die Daten vom 01.03.1994 - 01.03.1988 ausgelesen werden und angezeigt werden.

dann hab ich noch das feld Geschlecht mit der Auswahl "Alle, Männlich, Weiblich"

der Username befindet sich in db1 (user_login) und die anderen daten in db 2 (user_data).

Wie muss ich denn nun eine sql abfrage stellen damit mir die richtigen angaben angezeigt werden, und die Nichtausgefüllten Textfelder Ignoriert werden?
(hab noch nie ein suchformular geschrieben)
 
mir ist da noch eine andere Variante gekommen, wenn ich nun abfrage ob ein textfeld angegeben ist, das ich dann den sql suchbefehl via variable erstellen kann.

beispiel ist nic gewählt
$nic = "t1.nic='".$_GET['nic'];
und ist plz gewählt
$plz = "t2.plz='".$_GET['plz'];
dann alter abfragen mit einer berechnung
und anschliesend noch geschlecht
$sex="t2.sex='".$_GET['sex'];

$age = "t2.jjjj='".$_GET['jjjj'].", t2.dd='$tag', t2.mm='$monat'";
ne abfrage ob plz gegeben ist wenn ja
$kom1=",";
else $kom1="";
ne abfrage ob alter gegeben ist wenn ja
$kom2=",";
else $kom2="";
und ne abfrage ob geschlecht gegeben ist wenn ja
$kom3=",";
else $kom3="";


$suche = "$nic $kom1 $plz $kom2 $age $kom3 $sex";

dann die suche
$res=$faDB->fobject("SELECT t1.user_id, t1.nic, t2.DD, t2.MM, t2.JJJJ, t2.plz, t2.sex FROM $conf_pass->db_user_login as t1 JOIN $conf_pass->db_user_data as t2 ON t1.user_id=t2.user_id WHERE $suche LIMIT $limit");
 
Du musst aber das ' AND ' im Where-Bereich mit einbauen, aber nur wenn vorher schon was steht.
Mein Script macht ja genau das. Es prüft die einzelnen Bedinungen und schmeisst sie in einen Array. Aus diesem Array wird ein String mit ' AND ' als Trennzeichen generiert.

PHP:
<?php
    //Testdaten erstellen. $numArg3 darf nicht im Where-Teil des SQLs erscheinen
    $numArg1 = 123;
    $numArg3 = NULL;
    $stringArg3 = 'ab"c';
   
    //Die Connection baue ich hier nur auf, um den mysql_real_escape_string() zu
    //ermöglichen. Diese sollte gerade bei WHERE-Feldern unbedingt genutzt werden
    $conn = mysql_connect('localhost', 'root', '') or die(mysql_error);
    
    //Die einzelnen Variablen prüfen und dem Argumententopf $args mit der genauen 
    //SQL-Syntax hinzufügen
    if(isset($numArg1)) $args[] = 'arg1 = '.mysql_real_escape_string($numArg1);
    if(isset($numArg2)) $args[] = 'arg2 = '.mysql_real_escape_string($numArg2);
    if(isset($stringArg3)) $args[] = "arg3 = '".mysql_real_escape_string($stringArg3)."'";
   
    
    
    //Den Where-String aus dem Argumententopf erstellen
    $where = implode(' AND ', $args);
   
    //Das Sql ohne Where erstellen
    $sql = "SELECT * FROM table";
   
    //Falls wir einen Where-String haben, diesen mit dem Schlüsselwort 'WHERE? an den 
    //Sql-String anhängen
    if(isset($where)) $sql = $sql." WHERE ".$where;

    //TODO Auswertend des SQLs
    //Für deises Testscript reicht jedoch die Ausgabe unseres Sqls
    echo $sql;
   
    //Datenbankconnection wieder schliessen
    mysql_close($conn);
?>

Noch besser ist natürlich, wenn du noch mysql_escape_string() (oder noch besser mysql_real_escape_string) verwendest. (muss gleich mein Beispiel dahingehend ändern *g*)
 
Zuletzt bearbeitet:
noch versteh ich das ganze script nicht ganz, wenn ich jetzt zum beispiel
PHP:
$numArg1 = 123;
    $numArg3 = NULL;
    $stringArg3 = 'ab"c';
in
PHP:
$numArg1 = $_GET['nic'];
    $numArg2 = $_GET['plz'];
    $numArg3 = $_GET['age'];
    $stringArg3 = $_GET['sex'];
ändere würde ich damit dann die daten so nageben können oder?
ich muss eben sagen ich hab mich mit sql noch nie komplett auseinander gesetzt und bin im grunde anfänger in php uns sql.
 
Das sind Beispieldaten.

Du kannstr den Array folgendermassen füllen:
PHP:
if(isset($_GET['nic'])) $args[] = "nic = '".mysql_real_escape_string($_GET['nic'])."'";
if(isset($_GET['plz'])) $args[] = "plz= '".mysql_real_escape_string($_GET['plz'])."'";
if(isset($_GET['age'])) $args[] = 'age = '.mysql_real_escape_string($_GET['age']);
//etc.


Wennd u PHP noch nicht so gut kennst, empfehle ich dir das PHP-Hilfefile von der PHP-Seite herunterzuladen und alle Befehle die du nicht kennst nachzuschauen.
 
ich werde mich da nachher mal drann machen bei fragen schreib ich einfach wieder^^
aber vorerst mal danke für den tip werd nachher gleich probieren
 
So hab das ganze grad mal getestet, funktioniert bisher schon mal sehr gut. jetzt brauch ich nur noch ne gescheite einführung zum auslesen mehrerer Datenbanken. denn das blick ich leider auch noch nicht so ganz. denn 2mal ne db auslesen ist etwas doof
 
Zurück