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

  • Iago
    hat ein Thema erstellt Verständnidproblem bei Wertezuweisung in foreach.

    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

  • Gast-Avatar
    Ein Gast antwortete
    Cool, danke für die Antworten!!
    ...naja INNER JOIN macht die Sache nicht grade weniger komplex

    Einen Kommentar schreiben:


  • Dark Guardian
    antwortet
    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); 

    Einen Kommentar schreiben:


  • Asipak
    antwortet
    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?

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:


  • Asipak
    antwortet
    Schraube mal dein error_reporting rauf! Das Array $items scheint undefiniert und eine bessere Erklärung des Problems wäre wirklich wünschenswert.

    Einen Kommentar schreiben:


  • Manko10
    antwortet
    Hi,

    sorry, aber ich verstehe leider nicht, was du nicht verstehst. Wo genau liegt dein Verständnisproblem?

    Einen Kommentar schreiben:

Lädt...
X