[PHP / SQL] - WHERE-Abfrage splitten?



  • Hallo Zusammen

    Ich habe hier ein kleineres Problemchen.
    Über eine SQL Abfrage möchte ich alle Einträge auflisten, welche entweder PW, LW oder LKW drin stehen haben. Da dies ein Aaray-String ist also von Checkboxen her kommt wo der User PW, LW und LKW wählen kann, ist das fast unmöglich.

    Denn einige Lieferanten haben nur PW's, andere wiederum nur LKWs oder LWs. Wählt der User jetzt Auto und Lieferwagen, sollte in der DB alles aufegelistet werden, das in der Tabellenzeile "Lklasse" den String PW und LW enthält.

    Beispiel:

    Es sollten nun alle Transporteure aufgelistet werden die folgende Einträge haben:

    PW
    LW
    PW, LW
    PW, LW, LKW
    PW, LWK
    LW, LWK

    Wählt der User aber nur PW und LKW, dann sollten nur folgende ausgelesen werden:

    PW, LKW
    PW
    LKW
    PW, LW, LKW
    LW, LKW

    also müsste ich überprüfen ob in der Zeichenkette in der DATENBANK-TABELLE entweder PW, LW oder LKW vorkommt. Wie mache ich das nun?? ich kann ja kaum ein WHERE Lklasse = preg_match in eine SQL-Anweiseung einfügen oder??

    Deshalb versuchte ich es anders zu lösen, was aber leider nicht klappt da entweder die eine oder andre Firma angzeigt wird aber nicht beide oder gar keine wie es sein sollte...

    Jenachdem was angekreuzt wurde, steht in der Variable "fahrzeug" entweder NUR PW nur LW oder nur LKW oder eben PW, LKW oder PW, LW, LKW oder PW, LW und so weiter.. Aber ein Preg-Match hilft auch nichts !!

    Denn es sollten (wenn PW, LW steht) alle Einträge aufgelistet werden, die ein PW und LW, aber auch die die nur ein PW oder LW oder eben ein PW oder LW und LKW mit LW und PW drin stehen haben aufgelistet werden.

    Wie löse ich das am besten?? ich komm nach stundenlangem denken nicht weiter... Bevor ich auf "UNMÖGLICH" schliesse, frage ich hier nach. Der nachfolgende Code hat zwar keine FEhlermeldungen, bringt mich ABER NICHT ZUM GEWÜNSCHTEN ERGEBNIS.

    if(($fahrzeug == 'PW') || ($fahrzeug == 'LW') || ($fahrzeug == 'LKW'))
    	{
    	$sqlsel = "SELECT * FROM trans_db WHERE Lklasse = '".$fahrzeug."' AND Kanton = '".$_REQUEST['startkanton_4']."' AND TrsWare = '".$_REQUEST['transgut']."'";
    	}
    
    	if($fahrzeug == 'PW, LW')
    	{
    	$sqlsel = "SELECT * FROM trans_db WHERE Lklasse = 'PW' OR Lklasse = 'LW' OR Lklasse = 'PW, LW' AND Kanton = '".$_REQUEST['startkanton_4']."' AND TrsWare = '".$_REQUEST['transgut']."'";
    	}
    
    	if($fahrzeug == 'PW, LKW')
    	{
    	$sqlsel = "SELECT * FROM trans_db WHERE Lklasse = 'PW' OR Lklasse = 'LKW' OR Lklasse = 'PW, LKW' AND Kanton = '".$_REQUEST['startkanton_4']."' AND TrsWare = '".$_REQUEST['transgut']."'";
    	}
    
    	if($fahrzeug == 'LW, LKW')
    	{
    	$sqlsel = "SELECT * FROM trans_db WHERE Lklasse = 'LW' OR Lklasse = 'LKW' OR Lklasse = 'LW, LKW' AND Kanton = '".$_REQUEST['startkanton_4']."' AND TrsWare = '".$_REQUEST['transgut']."'";
    	}
    
    	if($fahrzeug == 'PW, LW, LKW')
    	{
    	$sqlsel = "SELECT * FROM trans_db WHERE Lklasse = 'PW' OR Lklasse = 'LW' OR Lklasse = 'LKW' OR Lklasse = 'PW, LW, LKW' AND Kanton = '".$_REQUEST['startkanton_4']."' AND TrsWare = '".$_REQUEST['transgut']."'";
    	}
    

    Lg
    Wolf



  • $fahrzeug ist Dein Array mit den vom User ausgewählten Fahrzeugtypen?
    Dann würde ich das ganze so machen (Vorbedingung wäre, das min. 1 Fahrzeugtyp ausgewählt wurde):

    $sql = "SELECT  * ".
    "FROM    trans_db ".
    "WHERE   (Lklasse like '%".join("%' OR Lklasse = '%", $fahrzeug)."%') ".
    "AND     Kanton = '".$_REQUEST['startkanton_4']."' ".
    "AND     TrsWare = '".$_REQUEST['transgut']."'";
    // query
    


  • Und dringend Lektüre zum Thema SQL Injection zu Gemüte führen ...

    P.s. Die Variante mit LIKE ist bei sehr großen Datensätzen äußerst ineffizient. Bei kleinen Datensätzen sollte das so denkbar sein.



  • ~Airdamn schrieb:

    $fahrzeug ist Dein Array mit den vom User ausgewählten Fahrzeugtypen?
    Dann würde ich das ganze so machen (Vorbedingung wäre, das min. 1 Fahrzeugtyp ausgewählt wurde):

    $sql = "SELECT  * ".
    "FROM    trans_db ".
    "WHERE   (Lklasse like '%".join("%' OR Lklasse = '%", $fahrzeug)."%') ".
    "AND     Kanton = '".$_REQUEST['startkanton_4']."' ".
    "AND     TrsWare = '".$_REQUEST['transgut']."'";
    // query
    

    Klappt nicht. Das E-Mail wird zwar verschickt, erhalte jedoch nach Abschluss folgende Fehlermeldung:

    Warning: join() [function.join]: Invalid arguments passed in /var/www/vhosts/transportbazar.ch/httpdocs/newtrans.php on line 317

    Dann wäre da noch folgendes:
    Die Variable $fahrzeug enthält entweder PW, LW, LKW oder eben nur PW oder nur LW oder nur LKW oder eben PW, LKW oder PW,LKW oder PW,LW und so weiter.. und ist ein ARRAY (aus checkboxen mit IMPLODE , erstellt).

    Ok soweit so gut. Das E-Mail selbst klappt trotz der Warnmeldung, allerdings kann ich da nur LKW ankreuizen (ist nur 1 Firma registriert) oder nur PW ankreuten( auch nur 1ne) dann kommen trotzdem immer BEIDE oder ALLE firmen.... Also passiert nichts, nur dass gleich alles ausgelesen wird... miau miau



  • Du solltest dir mal Gedanken zur Normalisierung machen.

    Wenn du in jedem ROW eine STING hast der nur einen aus 3 Werten enthält dann stimmt das DB-Design schon nicht.



  • Unix-Tom schrieb:

    Du solltest dir mal Gedanken zur Normalisierung machen.

    Wenn du in jedem ROW eine STING hast der nur einen aus 3 Werten enthält dann stimmt das DB-Design schon nicht.

    normalisierung??? STING??


Anmelden zum Antworten