Ankündigung

Einklappen
Keine Ankündigung bisher.

Verständnidproblem bei Wertezuweisung in foreach

Einklappen

Neue Werbung 2019

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

  • Verständnidproblem bei Wertezuweisung in foreach

    Hallo,

    ich versuche mich hier an einem Warenkorb. In folgendem Script wird das
    Array $items gefüllt um dann in einem nächsten Schritt ausgegeben zu
    werden. Die SQL-Abfrage (welche es in einem nächsten Schritt gilt Injection-Sicher zu machen!!!!!) ist klar, jedoch nicht Befüllung des Arrays.

    PHP-Code:
    Hier zunächst das Script:
    $order_number $_SESSION['order_number'];   /*Übernimmt die Auftragsnummer von einer Sitzungsvariablen.
        Die Auftragsnummer kennzeichnet den jeweiligen Auftrag in der Datenbank*/

    $table_name $order_number;
    $cxn connect_to_db('Vars.php');
    $sql_1 'SELECT * FROM order_item WHERE order_number="'.$order_number.'"';
    $result mysqli_query($cxn,$sql_1)
        or die (
    'sql_1: '.mysqli_error($cxn));
    $n_row mysqli_num_rows($result);      /*liefert die Anzahl der Datensätze einer
                                            Ergebnismenge. Diese Funktion ist nur gültig für SELECT Befehle*/
    if($n_row 1)
        {
            echo 
    'Warenkorb ist leer<br/><a href="Catalog.php">Einkauf fortsetzen</a>';
            exit();
        }
        
    $n=1;   /*Setzt einen Zähler für die Anzahl der Elemente im Warenkorb*/
        
    while($row mysqli_fetch_assoc($result))
        {
            foreach(
    $row as $field => $value)
            {
                if(
    $field != 'order_number')
                {
                    
    $items[$n][$field]=$value;
                    if(
    $field == 'catalog_number')
                    {
                    
    $sql_2 'SELECT name,type FROM food WHERE catalog_number = "'.$row['catalog_number'].'"';;
                    
    $result2 mysqli_query($cxn,$sql_2)
                                or die (
    'sql_2: '.mysqli_error($cxn));
                    
    $row mysqli_fetch_row($result2);
                    
    $items[$n]['name']=$row[0]." ".$row[1];

                    }
                }
            }
            
    $n++;
        } 
    Erst werden alle Datendsätz mit einer bestimmten order_number geholt. Dann,
    wenn es zumindest einen Datensatz gibt, wird dieser oder diese in einem assoziativen
    Array gespeichert. Jetzt wird aber plötzlich der Wert $value mit
    $items[$n][$field]=$value; wiederum in der neuen Array- Varibalen $items gespeichert. Also, wie werden denn allein durch das Inkrement von $n
    alle Felder durchlaufen?? Was hat [$n] mit [$field] zu tun.
    Außerdem ist es doch grade durch das assoziative Array gewünscht
    $key (also hier $field) und $value getrennt zu halten. Jetzt wird plötzlich
    dies wiederum aufgegeben.
    Vielen Dank für einen Anhaltspunkt.

    Gruß, Iago

  • #2
    Hi,

    sorry, aber ich verstehe leider nicht, was du nicht verstehst. Wo genau liegt dein Verständnisproblem?
    Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

    Kommentar


    • #3
      Schraube mal dein error_reporting rauf! Das Array $items scheint undefiniert und eine bessere Erklärung des Problems wäre wirklich wünschenswert.
      [URL]http://hallophp.de[/URL]

      Kommentar


      • #4
        O.k., endlich kühler draußen!!

        $items[$n][$field]=$value; erzeugt das 2-dimensionale Array, dass alle Elemente
        mit der gleichen order_number ausgibt. (alle Elemente im Warenkorb)

        Ist es dann so, dass in
        while($row = mysqli_fetch_assoc($result));

        der Zeiger (ich hoff, ich drücke mich richtig aus) bei jedem Druchlauf automatisch auf dem nächsten Datensatz hält,
        denn die Zählvariable $n ist ja nur für das zu befüllende Array $items relevant?

        Danke,
        Gruß, Iago

        Kommentar


        • #5
          der Zeiger (ich hoff, ich drücke mich richtig aus) bei jedem Druchlauf automatisch auf dem nächsten Datensatz hält,
          Wenn ich dich richtig verstehe: Ja!

          Du kannst dir ja auch mal
          Code:
          echo '<pre>', print_r($row), '</pre>';
          innerhalb der Schleife ausgeben lassen.

          Aber wo liegt genau dein Problem?
          [URL]http://hallophp.de[/URL]

          Kommentar


          • #6
            Im Prinzip passiert da folgendeS:

            Die while-Schleife durchläuft alle Datensöätze welche der Query mit der $order_number zurück gegeben hat.

            Zuvor wird noch eine Zählvariable $n mit 0 initialisiert.

            $row hat ja z.B. diesen Aufbau:

            $row['id'], $row['name']....

            $row ist also ein Array, dieses wird mit foreach() durchlaufen und die Werte werden nach $items übertragen.

            Am Ende der While Schleife wird der Zähler $n erhöht damit in $items nicht jedesmal $items[0] überschrieben wird.

            Dies geschieht zugegebenermaßen extrem kompliziert.

            $items sieht dann später so aus:

            $items[0]['id'], $items[0]['name']...
            $items[1]['id'], $items[1]['name']...

            Das hätte man aber auch mit

            $items[] = $row;

            erreicht, ohne eine foreach() Schleife benutzen zu müssen.

            Innerhalb der foreach() Schleife wird für jeden Datensatz ein neuer SQL-Query ausgeführt um für die catelogue_number den dazugehörigen Namen zu holen und dem array $items[$n] hinzuzufügen. Dies hätte man aber bereits im ersten Query mit einem INNER JOIN lösen können und somit ein ganzes Stück Code und Abfragen gespart.

            Das könnte z.B. so aussehen:

            PHP-Code:
            $order_number $_SESSION['order_number'];  

            $cxn connect_to_db('Vars.php');

            //wir joinen auf die tabelle food und holen uns 
            //hierraus zusätzlich die felder name und type
            $sql_1 'SELECT *, f.name, f.type 
                                   FROM order_item oi
                                   INNER JOIN food f ON oi.catalog_number = f.catalog_number
                         WHERE oi.order_number="'
            .$order_number.'"';


            $result mysqli_query($cxn,$sql_1)
                or die (
            'sql_1: '.mysqli_error($cxn));

            $n_row mysqli_num_rows($result); 

            if(
            $n_row 1)
                {
                    echo 
            'Warenkorb ist leer<br/><a href="Catalog.php">Einkauf fortsetzen</a>';
                    exit();
                }

                
            $items = array();
                while(
            $row mysqli_fetch_assoc($result))
                {
                     
            //wir hängen $row als neues element an $items an
                     
            $items[] = $row;
                }  

                
            //falls $n später noch woanders benötigt wird setzen wir es auf die anzahl items
                
            $n count($items); 
            "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

            Kommentar


            • #7
              Cool, danke für die Antworten!!
              ...naja INNER JOIN macht die Sache nicht grade weniger komplex

              Kommentar

              Lädt...
              X