Doppelausgabe (SQL / foreach)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Doppelausgabe (SQL / foreach)

    Hallo,
    ich habe das Problem das ich mir per Formular Daten an eine php übergebe
    und diese dann mit einer foreach schleife aufnehme. Mittels einer sql abfrage in der foreach schleife hole ich die Daten aus meiner DB.

    Soweit so gut.

    Das Problem ist, das ich Doppelausgaben bekomme.

    Das ausgegebene Array mittels "foreach($_GET as $key => $value)" schaut so aus:
    Array
    (
    [seiten] => 1
    [marktplatz] => 3
    [plz] => 25355
    [erstellen] => Einkaufszettel erstellen für ( 2 ) Artikel
    [menge1] => 4
    [artikel1] => Milch
    [menge2] => 3
    [artikel2] => Brot
    )

    Das Script löscht erstmal vor der Ausgabe die Variablen:
    [seiten] => 1
    [marktplatz] => 3
    [plz] => 25355
    [erstellen] => Einkaufszettel erstellen für ( 2 ) Artikel
    raus und fragt nur noch "alle weiteren" ab.

    Das Script schaut so aus:

    PHP-Code:
    /*
     $index = 0;
       $kay = $felder[$index];
        unset($felder[$index]);
        

    $kay1 =  str_replace("menge","",$kay);
    $kay2 =  str_replace("artikel","",$kay);

        $ohnezahlen =  str_replace('[0-9]',' ',$kay);  
        $ohnewort =  str_replace('[a-z]','',$kay);
    */    
    if($_SERVER['REQUEST_METHOD'] == 'GET') {
      foreach(
    $_GET as $key => $value) {

    if(
    $key != 'seiten' and $key!= 'marktplatz' and $key!= 'plz' and $key!= 'erstellen' and
     
    $key!= '0' and $key!= '' and $key!= ' ' and $value!= '0' and $value!= '' and $value!= ' '){

     echo 
    $key.' '.$value.'<br>';
     
    $valuev $value;

    $abfrage_artikel "SELECT id, Laden, PLZ, Artikel, Marke, Suchbegriffe, MIN(Preis) AS reisel 
    FROM System_Einkaufsliste WHERE Suchbegriffe LIKE '%
    $valuev%'  ORDER BY Laden"
    $ergebnis_artikel mysql_query($abfrage_artikel); 
    while(
    $row_artikel mysql_fetch_object($ergebnis_artikel)) 
        {
        if(
    $row_artikel->Artikel!=$value){
    $ohnewort =  str_replace('[a-z]','',$value);
    }else{}

    $new_string $ohnewort;
    $zusammen $ohnewort $row_artikel->reisel;

                    echo 
    '<tr><td>'.$row_artikel->Laden." ".$row_werbung_b->PLZ.'</td>';
                    echo 
    '<td>'.$row_artikel->Artikel.'</td>';
                    echo 
    '<td>'.$row_artikel->Marke.'</td>';
                    echo 
    '<td>'.$new_string.'</td>';
                    echo 
    '<td>'.$row_artikel->reisel.'</td>';
                    echo 
    '<td>'.$zusammen.'</td></tr>';    
        }
        
          }
      }
    }

    # Array ausgeben
    echo "<pre>";
    print_r($_REQUEST);
    echo 
    "</pre>";

    # error_reporting
    error_reporting(); 
    Die eigentliche Ausgabe schaut um und bei so aus:
    --------------------------------------------------------------
    Laden / PLZ | Produkt | Marke | Menge | Einzelpreis | Preis
    --------------------------------------------------------------
    | | |4 | |0
    Aldi | Milch | Milsani | 4 | 0.48 | 1.92
    | | |3 | |0
    Aldi | Brot | Bauernglück | 3 | 0.89 | 2.67
    ---------------------------------------------------------------

    Ja wenn noch Fragen zur Verständlichkeit sind, einfach posten.
    Ich hoffe ich konnte alles so gut es geht schildern damit mir jemand helfen kann.

    MFG und schon mal vielen lieben dank im voraus.

  • #2
    SQL-Abfragen in Schleifen sind nicht so gut. Mach ein Query und führ es nur einmal aus.

    Außerdem solltest du Werte vom Benutzer mit mysql_real_escape_string() escapen.

    Kommentar


    • #3
      Hi, danke für die schnelle Antwort h3ll.....
      Warum mein-en/st Sie/Du sollte ich diese datenabfrage sichern?
      Im PHP Manual steht (Die Funktion muss immer (mit wenigen Ausnahmen) verwendet werden, um Daten abzusichern, bevor sie per Query an MySQL übermittelt werden.) ha das verstehe ich nicht, das sichern macht für mich keinen sinn oder?

      Warum sind SQL-Abfragen in Schleifen sind nicht so gut?
      Würde ich es anders können würde ich das gerne mache weil es
      bestimmt eleganter währe, aber wie?

      Kommentar


      • #4
        Das sieht ja sehr nach einem Warenkorb aus. Du solltest dessen Inhalt aber nicht als GET-Parameter übertragen. Denn URLs dürfen nicht beliebig lang werden, d.h. du musst Anzahl und Menge der Artikel beschränken. Auch wenn wahrscheinlich niemals jemand so viel in den Warenkorb packt, dass die URL zu lang wird, ist es dennoch eine ziemlich kranke Einschränkung.

        Schon mal was von POST gehört?

        Übrigens ist error_reporting() ganz am Ende des Scripts völlig sinnlos. Das gehört an den Anfang.

        Kommentar


        • #5
          Hallo,

          bitte beschreib nochmal ausführlich, was das Skript machen soll und welche GET-Parameter im Normalfall übergeben werden. Hier schon mal ein Abriss, was mir aufgefallen ist:

          Zitat von Moray Beitrag anzeigen
          PHP-Code:
              if($_SERVER['REQUEST_METHOD'] == 'GET') {
                  foreach(
          $_GET as $key => $value) {

                      if(
          $key != 'seiten' and $key!= 'marktplatz' and $key!= 'plz' and $key!= 'erstellen' and
                              
          $key!= '0' and $key!= '' and $key!= ' ' and $value!= '0' and $value!= '' and $value!= ' '){ 
          Du legst fest, welche Parameternamen nicht erlaubt sind. Welche wären denn erlaubt?
          Zitat von Moray Beitrag anzeigen
          PHP-Code:

                          
          echo $key.' '.$value.'<br>';
                          
          $valuev $value
          Warum das? Keine der beiden wird verändert, daher verstehe ich den Sinn dieser Kopie nicht.
          Zitat von Moray Beitrag anzeigen
          PHP-Code:

                          $abfrage_artikel 
          "
                              SELECT id, Laden, PLZ, Artikel, Marke, Suchbegriffe, MIN(Preis) AS reisel
                              FROM System_Einkaufsliste
                              WHERE Suchbegriffe LIKE '%
          $valuev%'  ORDER BY Laden"
          Vorsicht, das ist anfällig für SQL Injections! Für jeden GET-Parameter würdest du dieses Select ausführen. Ist das beabsichtigt und wenn ja, warum? Ich vermute, dass hier der Grund für die Doppelausgaben liegt, weil bei mehreren zutreffenden GET-Parametern die Row auch mehrfach selektiert und ausgegeben wird.
          Zitat von Moray Beitrag anzeigen
          PHP-Code:
                          $ergebnis_artikel mysql_query($abfrage_artikel);
                          while(
          $row_artikel mysql_fetch_object($ergebnis_artikel))
                          {
                              if(
          $row_artikel->Artikel!=$value){
                                  
          $ohnewort =  str_replace('[a-z]','',$value);
                              }else{} 
          Wenn die Bedingung nicht erfüllt ist, ist $ohnewort undefiniert...
          Zitat von Moray Beitrag anzeigen
          PHP-Code:
                              $new_string $ohnewort;
                              
          $zusammen $ohnewort $row_artikel->reisel
          ... und dann ergibt das keinen Sinn.
          Zitat von Moray Beitrag anzeigen
          PHP-Code:

                              
          echo '<tr><td>'.$row_artikel->Laden." ".$row_werbung_b->PLZ.'</td>';
                              ...
                          }

                      }
                  }
              }
              ...
              
          # error_reporting
              
          error_reporting(); 
          Das muss wie gesagt an den Anfang.

          Gruß,

          Amica
          Zuletzt geändert von AmicaNoctis; 14.10.2009, 02:04.
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #6
            Hallo und guten morgen.

            Ich versuche mal alles genauestens zu beschreiben (Das Script und was ich eigentlich vor habe).

            Also was ich vorwegnehmen kann ist, das es sich um keinen Wahrenkorb handelt. Ich habe nur vor dem User
            die möglichkeit zu geben nach Produkten im Örtlichem (z.b.) Aldi zu suchen. Der User kann X Artikel
            eingeben, wobei es bis zu 100-200 Artikel werden können. Wer auch immer so viel kaufen möchte :-)

            Ich habe heute nacht darüber nachgedacht vieleicht erstmal die Useranfrage + SSID
            in einer DB zu speichern um diese dann mit einer Doppelabfrage (SQL) auszugeben. Obwohl
            ich dabei auch eine zu lange URL bekomme. Wie ich das umgehen kann weiß ich überhaupt
            nicht. Währe eine URL begrenzung (anhand der eingabemöglichkeiten) sinnvoll? Ich kann ja
            nicht bestimmen wie lang die einzelne eingabe wird. Macht irgendwie keinen sinn. Hm.

            OK jetzt mal zum Script, dem davor und dem danacht.

            Ich habe ein Formular welches mit hilfe von Java eine Dynamische eingabe ermöglicht.
            Der User gibt z.b. eine 3 im erstem Input und Milch im 2 Imput ein. Der erste Input
            (menge1) ist für die anzahl der Artikel und das zweite Input (artikel1) für den Artikel
            als solches gedacht. Also 3 mal Milch möchte mein User erfragen.

            Die Inputs bekommen Dynamisch ihren Namen zugegeben (Also immer menge1 - menge2 usw)
            Das alles klappt auch einwandfrei. Mittels
            PHP-Code:
            $kay1 =  str_replace("menge","",$kay);
            $kay2 =  str_replace("artikel","",$kay); 
            bekomme ich jeweils die nummer seperat und kann $kay1 mit $kay2 vergleichen, stimmt es
            überein gehören diese zusammen.

            Brauche ich nicht unbedingt weil in der
            PHP-Code:
            foreach($_GET as $key => $value) { 
            Schleife beide (menge1 und artikel1) zur abfrage automatisch sortiert zur verfügung stehen.
            Sehe ich doch richtig, weil ich ja drauf zugreifen kann, oder nicht .!?

            Nun gut jetzt nehme ich mal das Script auseinander:

            Hier fange ich die schleife an um alle in der URL übergebenen Variablen zu übernehmen.
            $_GET weil es mit $_POST leider nicht geht (In der Schleife) Sie werden per POST in dem
            Formular übergeben. $_RQUEST hatte ich auch versucht, geht auch nicht.
            PHP-Code:
            if($_SERVER['REQUEST_METHOD'] == 'GET') {
              foreach(
            $_GET as $key => $value) { 
            Hier schliesse ich einige Variablen aus weil diese mit dem eigentlichem Produkt welches
            abgefragt werden soll (auch mehrere Produkte sollten möglich sein) nichts zu tun haben.
            Wenn ich das nicht mache habe ich halt x 0 ausgaben weil diese ja auch in der SQL Abfrage
            mit durchlaufen. Das ist nicht wirklich sinnvoll.
            PHP-Code:
            if($key != 'seiten' and $key!= 'marktplatz' and $key!= 'plz' and $key!= 'erstellen' and
             
            $key!= '0' and $key!= '' and $key!= ' ' and $value!= '0' and $value!= '' and $value!= ' '){ 
            ok gebe zu das macht so kein Sinn, aber das war ja auch nur ein Denkansatz bei dem noch etwas fehlt
            und so ist dieser teil auch nicht mehr vorhanden. :-)
            PHP-Code:
            echo $key.' '.$value.'<br>';
            $valuev $value
            Was genau (Amica) meinst Du mit anfällig für SQL Injections!
            Für jeden GET-Parameter wird dieses Select ausführen. Das habe ich beabsichtigt, weil ich ja x
            Artikel einzeln abfrage. in '%$valuev%' steht ja auch immer etwas anderes.

            Ich denke nicht das der Fehler hier liegt, sondern eher in der Schleife als solchs.
            PHP-Code:
            $abfrage_artikel "SELECT id, Laden, PLZ, Artikel, Marke, Suchbegriffe, MIN(Preis) AS reisel 
            FROM System_Einkaufsliste WHERE Suchbegriffe LIKE '%
            $valuev%'  ORDER BY Laden"
            Ja hm, stimmt ist undefiniert. Warum ich das nun gerade so gemacht hatte kann ich nicht mit
            bestimmtheit sagen! Ich glaube ich hatte dort etwas angedacht bzw wollte ich den wert auf nuLL setzen.
            PHP-Code:

            $ergebnis_artikel 
            mysql_query($abfrage_artikel);

            while(
            $row_artikel mysql_fetch_object($ergebnis_artikel))

            {

            if(
            $row_artikel->Artikel!=$value){

            $ohnewort =  str_replace('[a-z]','',$value);

            }else{} 
            Das macht schon Sinn weil ich da noch Änderungen vorgesehen habe ($new_string) steht hier für die Anzahl
            der Artikel und ($zusammen) rechnet mir den gesamptpreis aus.
            Diese wird (Hier kommt eventuell noch eine Funktion hin) Dynamisch nochmal verändert wenn der Artikel
            ein Angebot sein sollte und man zum Preis von einem 2 Bekommt.
            PHP-Code:
            $new_string $ohnewort;

            $zusammen $ohnewort $row_artikel->reisel
            Oh, das war so weil ich erst ab dieser Stelle Scripte habe, Steht auch nun am
            Anfang. Sorry hatte nicht aufgepasst ;-)
            PHP-Code:
            # error_reporting
            error_reporting(); 
            So ich hoffe das hilft weiter :-)

            Kommentar


            • #7
              vieleicht erstmal die Useranfrage + SSID in einer DB zu speichern
              Was ist SSID ?
              Eine SessionID? Dann: Was willst du damit in der DB?

              Oder auch:
              Warum übergibst du massig GET Parameter, wenn du doch Sessions nutzt?
              Bei GET Parametern fangen die Probleme so ab ca 1000 Zeichen in der URL an. Die meisten Browser tun es auch noch mit 2000 Zeichen, aber keine Garantie.


              SQL Injections
              Mache dich über Google kundig.
              Auch wenn es dir nicht gefällt, es ist ein Problem.
              Wir werden alle sterben

              Kommentar


              • #8
                Hallo,

                Zitat von Moray Beitrag anzeigen
                Ich habe ein Formular welches mit hilfe von Java eine Dynamische eingabe ermöglicht.
                Bitte nicht JavaScript und Java verwechseln. Diese dynamische Nummerierung würde ich auch nochmal überdenken, weil man dieses Problem ganz leicht mit Pseudoarrays in den Griff bekommt.

                Zitat von Moray Beitrag anzeigen
                Hier fange ich die schleife an um alle in der URL übergebenen Variablen zu übernehmen.
                $_GET weil es mit $_POST leider nicht geht (In der Schleife) Sie werden per POST in dem
                Formular übergeben. $_RQUEST hatte ich auch versucht, geht auch nicht.
                Was ging denn mit POST nicht? POST muss gehen, wenn nicht, hast du irgendeinen Tippfehler drin gehabt und dann springt GET als Default-Wert ein. $_REQUEST geht auch, aber da hast du das e vergessen.

                Zitat von Moray Beitrag anzeigen
                Was genau (Amica) meinst Du mit anfällig für SQL Injections!
                Dass jemand mit ganz bestimmten Suchausdrücken deine gesamte Datenbank auslesen und ggf. auch ändern/löschen könnte.

                Zitat von Moray Beitrag anzeigen
                Für jeden GET-Parameter wird dieses Select ausführen. Das habe ich beabsichtigt, weil ich ja x
                Artikel einzeln abfrage. in '%$valuev%' steht ja auch immer etwas anderes.
                Ja, aber immer dasselbe wie in $value.

                Zitat von Moray Beitrag anzeigen
                $ohnewort = str_replace('[a-z]','',$value);
                str_replace arbeitet nicht mit Regulären Ausdrücken. Da musst du preg_replace nehmen und noch die Begrenzer einfügen.

                Gruß,

                Amica
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Ju hu,

                  also ich habe ein wenig herumgebastelt!
                  Herumgebastelt ist auch Wörtlich zu nehmen :-)

                  Also hier mein SCript was so funst wie ich es wollte bis
                  auf die einshränkung das er nicht richtig sortiert, dazu am ende mehr.

                  PHP-Code:
                  $count=1
                  foreach(
                  $_POST as $key => $value) {
                      if(
                  $key != 'seiten' and $key!= 'marktplatz' and $key!= 'plz' and $key!= 'erstellen'
                  and $key!= '0' and $key!= '' and $key!= ' ' and $value!= '0' and $value!= '' and $value!= ' '){
                          
                  $count++; 
                      }else{}

                  $zahl$count 2;
                  $durchlauf floor($zahl);

                    for(
                  $count 1$count $durchlauf+1$count++)
                      {
                          
                          
                  $diesenwert='artikel'.$count;
                          
                  $value $_REQUEST[$diesenwert];

                          
                  $diesezahl='menge'.$count;
                          
                  $menge $_REQUEST[$diesezahl];

                          
                  $abfrage_artikel "SELECT id, Laden, PLZ, Artikel, Marke, Suchbegriffe, MIN(Preis) AS reisel 
                  FROM System_Einkaufsliste WHERE Suchbegriffe LIKE '%
                  $value%' ORDER BY Laden ASC"
                  $ergebnis_artikel mysql_query($abfrage_artikel); 
                  while(
                  $row_artikel mysql_fetch_object($ergebnis_artikel)) 
                      {
                              
                  $zusammen$menge*$row_artikel->reisel;
                              
                              if(
                  $row_artikel->Laden==''){
                              
                  $wertausgabe_a "Artikel";
                              }else{
                              
                  $wertausgabe_a $row_artikel->Laden;
                              }
                              if(
                  $row_artikel->Laden==''){
                              
                  $wertausgabe_b "" ;
                              }else{
                              
                  $wertausgabe_b $row_artikel->PLZ;
                              }    
                              if(
                  $row_artikel->Laden==''){
                              
                  $wertausgabe_c $value;
                              }else{
                              
                  $wertausgabe_c $row_artikel->Artikel;
                              }    
                              if(
                  $row_artikel->Laden==''){
                              
                  $wertausgabe_d "ist noch";
                              }else{
                              
                  $wertausgabe_d $row_artikel->Marke;
                              }
                              if(
                  $row_artikel->Laden==''){
                              
                  $wertausgabe_e "nicht";
                              }else{
                              
                  $wertausgabe_e $menge;
                              }
                              if(
                  $row_artikel->Laden==''){
                              
                  $wertausgabe_f "in der";
                              }else{
                              
                  $wertausgabe_f $row_artikel->reisel;
                              }    
                              if(
                  $row_artikel->Laden==''){
                              
                  $wertausgabe_g "Datenbank";
                              }else{
                              
                  $wertausgabe_g $zusammen;
                              }    
                                  echo 
                  '<tr><td valign="top">'.$wertausgabe_a." ".$wertausgabe_b.'</td>';
                                  echo 
                  '<td valign="top">'.$wertausgabe_c.'</td>';
                                  echo 
                  '<td valign="top">'.$wertausgabe_d.'</td>';
                                  echo 
                  '<td valign="top">'.$wertausgabe_e.'</td>';
                                  echo 
                  '<td valign="top">'.$wertausgabe_f.'</td>';
                                  echo 
                  '<td valign="top">'.$wertausgabe_g.'</td></tr>';
                          
                          if(
                  $wertausgabe_g=="Datenbank" ){
                          
                  $wertausgabe_g 0;
                          }else{
                          
                  $wertausgabe_h $wertausgabe_g+$wertausgabe_h;
                          }
                      }

                  Ich möchte gerne das die Ausgabe nach Läden aufgelistet wird.
                  Mit ORDER BY Laden ASC erreiche ich das ziel aber leider nicht.
                  Gibt es eine Möglichkeit in der Wehle-Schleife quasi in der
                  Ausgabe direkt zu sortieren? An sonsten ist das ja nur ein
                  Schönheitsfehler der die Funktion nicht beeinträchtigt.

                  Vielen dank an alle die sich so viel mühe gegeben haben mir zu helfen.
                  DANKE . . . . !

                  Kommentar


                  • #10
                    MIN(Preis)
                    Aggregatfunktionen brauchen ein GROUP BY, sonst sind die anderen Values mehr oder weniger zufällig. Andere DBMS als MySQL würden dir das um die Ohren hauen und die Arbeit verweigern. Mit Recht.
                    (stimmt das wirklich?)
                    Wir werden alle sterben

                    Kommentar


                    • #11
                      Die Sortierung kann so nicht funktionieren. Das SQL Statement ist zwar diesbezüglich korrekt, aber durch deine Schleife sind es ja mehrere SQL Statements und mehrere Ergebnisarrays, die dann jeweils sequentiell ausgegeben werden, obwohl jedes einzelne sehr wohl korrekt sortiert ist.

                      Gruß,

                      Amica
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar


                      • #12
                        Zitat von AmicaNoctis Beitrag anzeigen
                        Die Sortierung kann so nicht funktionieren. Das SQL Statement ist zwar diesbezüglich korrekt, aber durch deine Schleife sind es ja mehrere SQL Statements und mehrere Ergebnisarrays, die dann jeweils sequentiell ausgegeben werden, obwohl jedes einzelne sehr wohl korrekt sortiert ist.

                        Gruß,

                        Amica
                        Oh ja stimmt, ich arbeite ja immer noch mit der schleife. Du hast recht das kann nicht gehen. aber das ist jetzt auch nicht mehr so wichtig, denn ich möchte jetzt die Ausgabe in soweit übernehmen das ich diese in ein PDF Dokument schreiben kann. Mal schauen ob ich das hin bekomme. Sollte denke ich machbar sein. :-)

                        Kommentar

                        Lädt...
                        X