Ankündigung

Einklappen
Keine Ankündigung bisher.

2x Foreach-Schleife

Einklappen

Neue Werbung 2019

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

  • 2x Foreach-Schleife

    Hallo zusammen,

    ich habe ein kleines problemchen mit den schleifen wobei ich nicht weiter komme....

    PHP-Code:
    foreach ($pid as $pid){
    foreach (
    $oid as $oid){
             
    $abfrage "SELECT * FROM vorlage WHERE Vorlagename = '$vname' && option_id = '$oid'";
             
    $ergebnis mysql_query($abfrage);
             while(
    $row mysql_fetch_object($ergebnis))
             {
             if (
    $row->required == 1){
                     
    $required[$i] = 1;
             }


             }

                     
    $eintrag "INSERT INTO oc_product_option
                     (product_id, option_id, required)
                     VALUES
                     ('
    $pid','$oid', '$required[$i]')";
                     
    $eintragen mysql_query($eintrag);


    }


    Ich bin ratlos wie das geht

    Schleife 1 (pid) hat product_id's
    schleife 2 (oid) hat option_id's

    bei pid kann man halt auswählen, wieviele produkte geändert werden sollen, wobei jedes produkt unterschiedlich viele oid's hat.

  • #2
    Wenn du jetzt noch verrätst, was das Problem ist, haben alle hier auch eine Chance dir zu helfen.

    Zu deinem Code wäre folgendes anzumerken:
    mysql_* ist veraltet, nutze besser mysqli_*
    Datenbankabfragen haben in Schleifen nichts verloren
    Select * ist schlecht für die Performance, immer nur die Spalten selecten, die man tatsächlich braucht.
    [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
    [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

    Kommentar


    • #3
      foreach (array_expression as $value)
      So
      PHP-Code:
      foreach ($pid as $pid){ 
      geht es schonmal gar nicht bzw. du überschreibst dein array.

      Edit: "So geht es schonmal gar nicht" ist schlecht formuliert, besser "So was macht man nicht".
      Siehe Hinweis Blar #6

      Kommentar


      • #4
        Von wo kommt denn da $i?
        [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
        [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

        Kommentar


        • #5
          Query-Mörser in Schleifen sind eine ganz Dumme Idee.

          http://php.net/manual/de/mysqli.quic...statements.php
          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

          Kommentar


          • #6
            Zitat von jspit Beitrag anzeigen
            So
            PHP-Code:
            foreach ($pid as $pid){ 
            geht es schonmal gar nicht bzw. du überschreibst dein array.
            Funktionieren kann es schon, es ist aber absolut nicht zu empfehlen. Erstens empfinde ich es als unübersichtlich und das Array $foo in diesem Beispiel nach dem foreach mit dem letzten Wert des Arrays überschrieben.

            PHP-Code:
            $foo range(19);

            foreach(
            $foo as $foo) {
                
            var_dump($foo);
            }

            int(1)
            int(2)
            int(3)
            int(4)
            int(5)
            int(6)
            int(7)
            int(8)
            int(9

            Kommentar


            • #7
              Hey zusammen,

              sorry für die späte Antwort aber nicht sehr viel Zeit im moment


              @ChrisvA:
              Das Problem ist, das ich eine Fehlermeldung erhalte (kann ich gerade leider nicht posten, da ich nicht Zuhause bin).
              Ich denke das es daran liegt, das ich 2x eine Foreach laufen lassen möchte.

              mysqli.... hab ich leider noch nichts von gehört, werde ich mir aber danach auf jeden fall anschauen (Für dieses Script, ist die Auslastung vom Script so wie dauer der Verarbeitung relativ, da es nicht für Besucher sondern intern ist.)

              Mit dem Select *, haste recht, muss ich mir echt mal angewöhnen xD

              Danke

              @jspit:

              Leider schreib ich nicht sehr oft/viel mit PHP sodass ich noch nicht wirklich viel mit foreach gemacht habe. In diesem Fall brauche ich diesen Array nur für diese Situation, was bedeutet das ich diese dann von mir aus auch überschreiben kann (oder hab ich evtl. ein denkfehler ? Bitte gerne korrigieren...)

              @VPh $i=0; ist vor den Schleifen definiert und dient dazu "required" hochzuzählen....
              Natürlich müsste auch vor der ersten "}" ein $i++; stehen... (war gestern abend leider schon ein wenig spät, das verusacht aber leider nicht den Fehler, die 2 Sachen hatte ich bereits geschrieben)

              @tr0y:
              "Query-Mörser in Schleifen sind eine ganz Dumme Idee."
              Bitte erklären, meinst du damit, in einer Schleife eine SQL abfrage zu machen (sprich ein Select) ?

              Wenn ja, leider habe ich hierfür keine andere Möglichkeit gefunden... Kannst du mir ein Tipp geben wie ich das machen kann...

              @Blar:
              Ich versuche gerade dein Code zu verstehen, aber ich gebe zu es gelingt mir nicht ganz




              @All
              Ich weiß nicht ob meine Frage richtig verstanden wurde... Ich versuche ein Template zu erstellen, indem ich mehrere Produkte direkt bearbeiten kann (Optionen löschen und wieder hinzufügen)

              Hierfür habe ich einmal $pid (abhängig von der Anzahl der Produke die man ausgewählt hat) und $oid (Anzahl der Optionen die man der Vorlage hinzugefügt hat)

              Wenn ich alles auf ein Produkt mache, geht alles Prima, doch nun möchte ich es so umschreiben, das man es auf viele Produkte anwenden kann (Ladezeit ist egal ).

              Deshalb:

              PHP-Code:
              foreach($pid as $pid){ //Anzahl der Produkte (z.B. 2x)
              foreach($oid as $oid){
              // An dieser Stelle möchte ich gerne alle Optionen des Produktes in die Datenbank schreiben... Danach halt das vom 2. Produkt etc.
              }



              Ohje... wenn ich den Text so sehe, hab ich jetzt nicht gerade wenig geschrieben... ich hoffe hier sind nicht nur progger sondern auch Leseratten (wobei das eine mit sicherheit das andere nicht ausschließt )


              Danke schonmal für eure Antworten

              Kommentar


              • #8
                Zu mysql: Der Punkt ist, dass die mysql-Erweiterung (nicht das Datenbanksystem, nur eine Bibliothek für den Zugriff) veraltet ist und wohl (hoffentlich) in absehbarer Zeit aus den „offiziellen“ PHP-Releases rausfliegt. Deshalb ist es stark zu empfehlen, mysqli zu nutzen oder PDO. Ein entsprechender Hinweis ist auch auf jeder Dokuseite zu einer mysql_*-Funktion zu finden.


                Das hier…

                Zitat von Blar
                Funktionieren kann es schon, es ist aber absolut nicht zu empfehlen. Erstens empfinde ich es als unübersichtlich und das Array $foo in diesem Beispiel nach dem foreach mit dem letzten Wert des Arrays überschrieben.
                …wird zumindest eine Problemursache sein, denn du führst die innere Schleife ja mehrfach aus. Da ist es dann blöd, wenn in $oid beim Beginn des zweiten Durchlaufs nicht mehr der richtige Wert steht.

                Bau es zumindest mal grob so um:

                PHP-Code:
                foreach ($productIds as $pid) {
                    foreach (
                $optionIds as $oid) { 
                Warum ist dein Code eigentlich so eigenartig eingerückt?

                Kommentar


                • #9
                  Das ganze lässt sich auch ohne doppelte Schleife realisieren.
                  Wie tr0y schon sagte, ist es keine gute Idee SQL-Anweisungen in Schleifen auszuführen.

                  Über WHERE IN kannst Du Dir alle benötigten option_id's ziehen, die Du brauchst ( schaue Dir hierzu implode an ).
                  Das Ergebnis erlaubt Dir dann die Values für ein MultiInsert zu definieren.

                  Die Begriffe musst Du mal googlen, da ich aufm Tablet kein Bock habe, die Links mühselig zu setzen. Vielleicht hole ich das morgen nach...
                  Competence-Center -> Enjoy the Informatrix
                  PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                  Kommentar


                  • #10
                    Hallo zusammen,

                    vielen Dank nochmal für eure Hilfe, ich habe das Problem wie folgt gelöst:

                    PHP-Code:
                             $soid implode(', ' $oid);
                             
                    $i=0;
                             
                    $abfrage "SELECT * FROM vorlage WHERE Vorlagename = '$vname' && option_id IN ($soid)";
                             
                    $ergebnis mysql_query($abfrage);
                             while(
                    $row mysql_fetch_object($ergebnis))
                             {
                                     if (
                    $row->required == 1){
                                             
                    $required[$i] = 1;
                                     
                    $i++;
                                     }
                             }

                    foreach(
                    $pid as $productid){
                    $i=0;

                       foreach(
                    $oid as $optionid){
                             
                    $eintrag "INSERT INTO oc_product_option
                             (product_id, option_id, required)
                             VALUES
                             ('
                    $productid','$optionid', '$required[$i]')";
                             
                    $eintragen mysql_query($eintrag);
                       
                    $i++;
                       }

                    Das größte Problem war wirklich, das ich unter anderem mit $pid as $pid überschrieben habe und es dadurch nur probleme gab...

                    wie ich bereits sagte, werde ich mir die bereits genannten sachen nochmal gründlich durchlesen.... Aber Hauptsache dies funktioniert erst einmal

                    Vielen Dank nochmal.

                    Kommentar


                    • #11
                      Und trotzdem ist es käse, die Query in einer doppelt geschachtelten schleife aufzurufen... Das ganze kann man mit einer Insert Query lösen.
                      Current Projects: http://www.welten-buch.de, http://neu.zooadoo.de

                      Kommentar


                      • #12
                        leider habe ich gerade keine Ahnung wie ich das mit einer Insert Query lösen kann. Hast du eventuell ein Lösungsansatz für mich ?

                        Kommentar


                        • #13
                          Klar:
                          Code:
                          INSERT INTO `universe`
                             ( `a`, `b`, `c`, `d` )
                          VALUES
                             ( 1, 2, 3, 4 ),
                             ( 5, 6, 7, 8 ),
                             ( 9, 10, 11, 12)
                          Alternative Prepared statements.
                          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                          Kommentar

                          Lädt...
                          X