WinFuture-Forum.de: [php] For-schleife Wird Nicht Korrekt Ausgefuehrt - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

[php] For-schleife Wird Nicht Korrekt Ausgefuehrt ... oder was anderes ist schief gelaufen


#1 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 20. Dezember 2004 - 20:36

Moin,

ich habe ein Problem und das schon seit gestern. Ich habe schon alles probiert und viele Freunde gefragt. Keiner wusste Rat. Nun post ich hier in der Hoffnung, dass jemand weiter weiss.

Situation:

Ich habe ein Pizza-Bestell-System mit User-Frontend und Admin-Oberflaeche. Ich habe jeweils eine index.php und benutze das Template-System Smarty. Der Benutzer kann Bestellungen einsenden und der Administrator kann diese verwalten.

Problem:

Das Problem liegt bei der Auflistung aller in der Datenbank enthaltenen Bestellungen. Ich lese die Bestellungen folgendermassen aus der Datenbank aus:

$sql->query('SELECT * FROM '.$mysql['table']['rdrs'].' WHERE processed != 1');
if ($sql->error()) {echo $sql->display_error(); die;}

$orders = array();
while ($order = $sql->fetch_assoc()) {
    $orders[] = $order;
}


Da funktioniert auch soweit. Ich bekomme ein Array ($orders) mit allen Bestellungen. Elemente beginnen bei 0.

Nun moechte ich fuer jede Bestellung diverse Aktionen ausfuehren. Welche ist uninteressant, da das nicht Teil des Problems ist. Ich verwende also eine for-Schleife.

for ($i=0; $i<count($orders); $i++) {
    // ...
}


Hier liegt nun das Problem. Bei mehr als einer vorhandenen Bestellung laeuft alles sauber bis auf die Tatsache, dass ein Eintrag zu viel aufgefuehrt wird. Bei nur einem Eintrag wird dieser aufgelistet aber die Aktionen innerhalb der for-Schleife werden nicht korrekt ausgefuehrt. Ich denke, dass es an einem fehlerhaften Wert fuer $i liegt. Also, dass die for-Schleife nicht richtig funktioniert.

Weiss jemand von euch, wie ich es richtig mache bzw. was ich falsch mache?

Viele Gruesse und Dank schonmal im Vorraus,
Pelziges Waldtier
0

Anzeige



#2 Mitglied ist offline   ænima 

  • Gruppe: aktive Mitglieder
  • Beiträge: 62
  • Beigetreten: 30. Oktober 03
  • Reputation: 0

geschrieben 20. Dezember 2004 - 23:59

also deine for-schleife sieht soweit richtig aus...

sieht zwar blöd aus, aber ich würd einfach mal so testhalber meine while-schleife so schreiben:

$i = 0;
while ($order = $sql->fetch_assoc()) {
   $orders[$i] = $order;
   $i++;
}

0

#3 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 21. Dezember 2004 - 19:50

Ich glaube, dass die while-Schleife korrekt ist. Wenn ich direkt danach mit

print_r($orders);


das Array ausgeben lasse, dann sieht es so aus, als ob alles korrekt ausgelesen und gespeichert worden waere. Ich habe deinen Vorschlag aber trotzdem mal verwirklicht und es kommt aufs Gleiche raus.

Weiterhin:

Ich bearbeite innerhalb der for-Schleife $orders wiefolgt...

$orders[$i]['global']['order_string'] = $orders[$i]['order_str'];
unset($orders[$i]['order_str']);

// Bestellung formatieren
$sets = explode('|', $orders[$i]['global']['order_string']);

und noch vieeeel mehr.


Ich denke, dass, wenn er auf $orders[$i] zugreifen will und damit arbeiten will aber kein Element mit der Nummer $i vorhanden ist, einfach ein neues erzeugt wird. Und das sehe ich dann spaeter als ueberfluessiges. Nur warum ist das so? Es kann doch eigentlich nur an einer falschen for-Schleife liegen, oder nicht?

PW
0

#4 Mitglied ist offline   ænima 

  • Gruppe: aktive Mitglieder
  • Beiträge: 62
  • Beigetreten: 30. Oktober 03
  • Reputation: 0

geschrieben 21. Dezember 2004 - 21:32

ich hab mal ein bisschen rumprobiert, das ist echt mal wieder so ein typischer fehler, der einen zur verzweiflung bringt...

Zitat

Ich habe deinen Vorschlag aber trotzdem mal verwirklicht und es kommt aufs Gleiche raus.


dacht ich mir schon, aber nen versuch war´s wert...

Zitat

Ich denke, dass, wenn er auf $orders[$i] zugreifen will und damit arbeiten will aber kein Element mit der Nummer $i vorhanden ist, einfach ein neues erzeugt wird.


das stimmt schon, aber es dürfte ja eigentlich nicht vorkommen, dass kein element mit der nummer $i vorhanden ist, das ergibt sich aus der logik der schleife. die array-einträge sind ja immer richtig geordnet und ohne lücken...

Zitat

Es kann doch eigentlich nur an einer falschen for-Schleife liegen


also die syntax der for-schleife ist richtig, da gibt´s nix dran zu rütteln... so wie ich das sehe, kann´s eigentlich nur an dem inhalt der for-schleife liegen. nur innerhalb der for-schleife kann der ablauf gestört werden, da vorher noch alles stimmt und die syntax der schleife auch stimmt...

so ein fehler ist eigentlich ein typischer fall für nen debugger. hier gibt´s beispielsweise einen ganz brauchbaren, ansonsten gibt´s je nach entwicklungsumgebung verschiedene lösungen...
0

#5 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 22. Dezember 2004 - 02:28

Guten Abend,

ich kann den Fehler einfach nicht finden. Der Debugger meldet auch keine Fehler. Ich poste jetzt einfach mal den Code in der Hoffnung, dass jemand mir helfen kann.

     // TABELLENANZEIGE
     // Dies ist eine Übersicht über alle vorhandenen Bestellungen

     $sql->query('SELECT * FROM '.$mysql['table']['rdrs'].' WHERE processed != 1');
     if ($sql->error()) {echo $sql->display_error(); die;}

     $orders = array();
     while ($order = $sql->fetch_assoc())
         {
          $orders[] = $order;
         }

     for ($i=0; $i<count($orders); $i++)
         {

          $orders[$i]['global']['order_string'] = $orders[$i]['order_str'];
          unset($orders[$i]['order_str']);

          // Bestellung formatieren
          $sets = explode('|', $orders[$i]['global']['order_string']);

          // Wenn das erste Set 'valid-0' ist
          if ($sets[0] == 'valid-0')
              {
               // Gesamtpreisvariable initialisieren
              $orders[$i]['global']['prize'] = 0;

               // Fuer jedes Set folgende Aktionen ausfuehren
               for ($b=0; $b<count($sets); $b++)
                   {
                    // Die Felder trennen
                    $fields = explode('-', $sets[$b]);


                    // Wenn das erste Feld jedes Sets nicht valid enthaellt
                    // (folglich nicht das erste Set des Eintrags ist)
                    // Das erste Feld eines jeden Eintrags dient ledigleich zur
                    // Verifikation

                    if ($fields[0] !== 'valid')
                        {
                      for ($c=0; $c<count($fields); $c++)
                             {
                              // Debuginfo:
                               echo 'Entry '.$i.', Set '.$b.', Field '.$c.': '.$fields[$c].'<br />';

                              // Array (orders) zusammensetzen
                              if ($c == 0)
                                  {
                                   $sql->query('SELECT * FROM '.$mysql['table']['typs'].' WHERE id='.$fields[$c]);
                                   if ($sql->error()) {echo $sql->display_error(); die;}

                                   $infos = array();
                                   while ($info = $sql->fetch_assoc())
                                       {
                                        $infos[] = $info;
                                       }

                                   $orders[$i]['sets'][$b]['fields']['type'] = $infos[0];
                                   unset($infos);
                                  }
                              else if ($c == 1)
                                  {
                                   $orders[$i]['sets'][$b]['fields']['count'] = $fields[$c];
                                  }
                             }
                         $orders[$i]['sets'][$b]['fields']['result']['prize'] = ($orders[$i]['sets'][$b]['fields']['count'] * $orders[$i]['sets'][$b]['fields']['type']['prize']);
                         $orders[$i]['global']['prize'] += $orders[$i]['sets'][$b]['fields']['result']['prize'];
                         $orders[$i]['debug']['id'] = $i;

                        }
                   }

              }
          $orders['global']['count'] = count($orders);
          unset($sets);
          unset($fields);
         }


PelzigesWaldtier
0

#6 Mitglied ist offline   MaliMaster 

  • Gruppe: aktive Mitglieder
  • Beiträge: 907
  • Beigetreten: 10. April 02
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Deutschland

geschrieben 22. Dezember 2004 - 06:55

counte mal das array und gebe den wert aus, vielleicht stimmt ja da irgentwas nich, es kann ja im prinzip nur an der bedingung der scgleifen liegen..

hast du zufällig ne id am anfang jedes tupel?

wenn du nähmlich eine zeile mal gelöscht hast, geht er von da an nich weiter oder du musst mit ner for each schleife arbeiten.. dann is das kein prob und ich würd die datenbank auch anders auslesen:

$i = 0;
while ($order = $sql->fetch_assoc())
{
$orders[$i]['order_str'] = $order['order_str'];
$i++;
}

zb... usw
0

#7 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 22. Dezember 2004 - 18:54

 $i = 0;
while ($order = $sql->fetch_assoc())
{
$orders[$i]['order_str'] = $order['order_str'];
$i++;
}


Das kommt aufs Gleiche raus. Der counter ist unnoetig, da das die while-Schleife automatisch macht und ich will ja nicht nur den Order-String auslesen, ich will alle Spalten auslesen unabhaengig davon wieviele vorhanden sind. Sonst muesste ich ja, sobald ich eine neue Spalte in die Tabelle einfuege, meinen Code aendern. Ich wills aber gerne mal so machen wie du es sagst...

Ich habe mal die Elemente gezaehlt. Es sieht folgendermassen aus:

Anzahl der Elemente am Anfang: 3

Entry 0, Set 1, Field 0: 9
Entry 0, Set 1, Field 1: 5
Entry 0, Set 2, Field 0: 12
Entry 0, Set 2, Field 1: 1
Entry 0, Set 3, Field 0: 19
Entry 0, Set 3, Field 1: 6
Anzahl der Elemente in Schleifendurchgang 0: 3

Entry 1, Set 1, Field 0: 6
Entry 1, Set 1, Field 1: 1
Anzahl der Elemente in Schleifendurchgang 1: 4

Entry 2, Set 1, Field 0: 17
Entry 2, Set 1, Field 1: 1
Entry 2, Set 2, Field 0: 19
Entry 2, Set 2, Field 1: 1
Anzahl der Elemente in Schleifendurchgang 2: 4


Die Saetze mit Entry 2, Set 2, Field 0: 19 sagen welcher Typ und welche Anzahl bestellt wurde.

Wieso wird das in allen Schleifendurchgaengen nach 0 die Zahl der Elemente mehr?

PW

Dieser Beitrag wurde von PelzigesWaldtier bearbeitet: 22. Dezember 2004 - 18:55

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0