[PHP] Dynamisches SQL Statement

Ind0r

Lieutenant
Registriert
März 2008
Beiträge
585
Hallo zusammen,

ich stehe voll auf den Schlauch.
Ich habe eine Suche programmiert die 3 Parameter 1-3 Parameter bekommt.
Nun sollte wenn 3 oder 2 Parameter mit angegeben werden, als Schlüssel fungieren.
Ich habe eine foreach Schleife die in 2 Tabellen sucht aber jeder einzelne Parameter
wird in jeder Spalte gesucht. Ich möchte aber wenn 1-3 Parameter mit angegeben werden,
auch nur ein Ergebnis das die Parameter auch verbindet z.b. Hans, Maier, Stuttgart.
Und nicht so:

Hans Maier Stuttgart <-- RICHTIG
Hans Schmidt Berlin
Hans Klaus London
Hans Schäfer Paris
...

Hans Maier Stuttgart <-- RICHTIG
Jürgen Maier Karlsruhe
Claudia Maier Bonn
Abdulah Maier Hannover
....

Hans Maier Stuttgart <-- RICHTIG
Claudia Schäfer Stuttgart
Heiko Schäfer Stuttgart


Das Problem ist in meinem Ergebnis stehen jetzt alle oben genannten Personen.
Obwohl ich eigentlich nur Hans Maier Stuttgart haben möchte. Da er als Schlüssel ein Ergebnis abliefert oder die 3 Parameter zusammenhängen und ein Ergebnis liefern.
Mein Code sieht so aus

PHP:
 public function searchForAccounting($mixValue){
      
      if(!empty($mixValue)){
         
         $arrMixValues = explode(' ',$mixValue);

         $objDB = new Database();
         $arrOrderIds = array();
         
         if(count($arrMixValues) <= 3){
         
            foreach($arrMixValues as $mixValue){
            
               $strSQL = 'SELECT o.orders_id
                            FROM '.TABLE_ORDERS.' o
                            JOIN '.TABLE_ORDERS_TOTAL.' ot
                              ON o.orders_id = ot.orders_id
                           WHERE ot.class = \'ot_total\'
                             AND o.banktransfer_owner LIKE '.$objDB->prepareInput('%'.$mixValue.'%').' 
                             AND o.banktransfer_number = '.$objDB->prepareInput($mixValue).'
                             AND value = '.$objDB->prepareInput(str_replace(',','.',$mixValue));                          
               
               $objDB->read($strSQL);
               

               
               while($row = $objDB->fetchArray()){
                  $arrOrderIds[] = $row['orders_id'];
               }
            
            
            
            
            }
            
            return $arrOrderIds;
         }
         else{
            die("to much parameter");
         }
      }         
   }

Hoffe mir kann jem. helfen.



Gruß
Mridul
 
Hallo,

ich vermute der Feld VALUE in der OT Tabelle? Dann könnte es so klappen.
Je Variable einen weiteren Join hinzufügen.

Das Drumherum habe ich mal gelöscht. Unten fehlt noch für jeden MixValue ein Oder, kannst du sicher selber korrigieren.

Gruß,
Natto

PHP:
            $strSQL = 'SELECT o.orders_id
                            FROM '.TABLE_ORDERS.' o
                            JOIN '.TABLE_ORDERS_TOTAL.' ot1 ON o.orders_id = ot1.orders_id AND ot1.class = \'ot_total\' AND ot1.value = '.$objDB->prepareInput(str_replace(',','.',$mixValue[ 0 ])).'
                            JOIN '.TABLE_ORDERS_TOTAL.' ot2 ON o.orders_id = ot2.orders_id AND ot2.class = \'ot_total\' AND ot2.value = '.$objDB->prepareInput(str_replace(',','.',$mixValue[ 1 ])).'
                            JOIN '.TABLE_ORDERS_TOTAL.' ot2 ON o.orders_id = ot3.orders_id AND ot3.class = \'ot_total\' AND ot3.value = '.$objDB->prepareInput(str_replace(',','.',$mixValue[ 2 ])).'
                           WHERE 
                             AND o.banktransfer_owner LIKE '.$objDB->prepareInput('%'.$mixValue.'%').' 
                             AND o.banktransfer_number = '.$objDB->prepareInput($mixValue);
               
            $objDB->read($strSQL);
               

               
            while($row = $objDB->fetchArray()){
                $arrOrderIds[] = $row['orders_id'];
            }
            
            return $arrOrderIds;
 
Zuletzt bearbeitet:
Hallo,

Danke für deinen Tipp.
Aber ich glaub das wird so nicht funktionieren.
Ich meinte es so:

SQL:

SELECT ...
JOIN....
WHERE ...


und genau jetzt kommts. Wenn 3 Parameter übergeben wurden soll er in dem WHERE alle Kombinationen ausprobieren also so in etwa

-----

wert 1, wert2, wert3 = Kein Treffer

ok dann nochmal versuchen

wert 2, wert 3, wert 1 = Kein Treffer

ok dann nochmal versuchen

Und immer so weiter bis entweder alle Kombinationen ausgeschöpft sind oder eine Beziehung der 3 Schlüssel gefunden wurde und somit der Kunde eingetragen wird.

Gruß
Mridul.
 
Also nur dass ich das richtig verstehe: Du übergibst drei Parameter namens x, y und z. Man muss nun schauen ob in allen 3 Feldern o.banktransfer_owner, o.banktransfer_number und value x vorkommt (wirklich in allen 3 gleichzeitig!) und dasselbe für y und z wiederholen. Bist du sicher, dass das in deinem Anfangspost nicht ein "Or" sein sollte? Denn dann kann man das Ganze einfach mit einem entsprechenden "OR"- und "AND"-Konstrukt (mit Klammern) in der Where-Bedingung lösen...
 
Ich versteh nicht so ganz was du willst, aber geb dir einen Tipp.
Das was du im ersten Post als Code hast kann gar nicht funktionieren, du willst nur den Hans Maier Stuttgart, startest aber 3 Queries, einer sucht nach Hans der andere nach Maier und der dritte nach Stuttgart.

Was du brauchst ist EIN Query welcher dynamisch erstellt wird. Das Foreach solltest du also nur für einen Teil des Querys ausführen und nicht für den ganzen.

PS: Es hilft meistens ungemein wenn man den Query erstmal ohne PHP erstellt, so weißt du mindestens wie das Ergebnis mit PHP letztendlich aussehen soll...
 
muppler schrieb:
Ich versteh nicht so ganz was du willst, aber geb dir einen Tipp.
Das was du im ersten Post als Code hast kann gar nicht funktionieren, du willst nur den Hans Maier Stuttgart, startest aber 3 Queries, einer sucht nach Hans der andere nach Maier und der dritte nach Stuttgart.

Was du brauchst ist EIN Query welcher dynamisch erstellt wird. Das Foreach solltest du also nur für einen Teil des Querys ausführen und nicht für den ganzen.

PS: Es hilft meistens ungemein wenn man den Query erstmal ohne PHP erstellt, so weißt du mindestens wie das Ergebnis mit PHP letztendlich aussehen soll...


Genau das ist mir auch klar :p und das passiert auch. Aber werd mal meine grauen Zellen anstrengen und weiter grübeln wie ich das mache
 
Zurück
Oben