Ankündigung

Einklappen
Keine Ankündigung bisher.

Array liefert Murks

Einklappen

Neue Werbung 2019

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

  • Array liefert Murks

    Hallo Ihr,

    ich habe aus einer Datenbank-Tabelle 3 aufeinander folgende Datensätze in einen Array '$data_meta_3' eingelesen.

    Jetzt benötige ich aus dem ersten Datensatz die Variablenwerte
    $id_meta_1 = $data_meta_3['id_meta'];
    $scriptpath_1 = $data_meta_3['scriptpath'];
    $scriptname_1 = $data_meta_3['scriptname'];

    Aus dem zweiten Datensatz benötige ich alle Variablenwerte
    $id_meta = $data_meta_3['id_meta'];
    $scriptpath = $data_meta_3['scriptpath'];
    $scriptname = $data_meta_3['scriptname'];
    $sort_nr = $data_meta_3['sort_nr'];
    $freigabe = $data_meta_3['freigabe']; usw. usw. usw. ...

    Aus dem dritten Datensatz benötige ich wieder nur einen Teil
    $id_meta_3 = $data_meta_3['id_meta'];
    $scriptpath_3 = $data_meta_3['scriptpath'];
    $scriptname_3 = $data_meta_3['scriptname'];

    Mein Versuch ging folgendermaßen:
    Code:
    $i = 1;
    while($data_meta_3 = mysql_fetch_assoc($result_meta_3)) {
        switch ($i) {
          case 1:
              $id_meta_1 = $data_meta_3['id_meta']; 
              $scriptpath_1 = $data_meta_3['scriptpath'];
     ...
          case 2:
              $id_meta = $data_meta_3['id_meta']; 
              $scriptpath = $data_meta_3['scriptpath']; 
              $scriptname = $data_meta_3['scriptname']; 
     ...
          case 3:
              $id_meta_3 = $data_meta_3['id_meta']; 
              $scriptpath_3 = $data_meta_3['scriptpath']; 
              $scriptname_3 = $data_meta_3['scriptname']; 
     ...
        }
        $i = $i+1;
    }
    Mal abgesehen davon, daß ich auch gern wüßte, wie man das eleganter (schneller / in weniger Schritten) macht,
    mein eigentliches Problem besteht darin, daß im zweiten Durchlauf die
    Werte ab der 7. Variablen nicht mehr zugewiesen werden. Sprich: mitten in der Schleife bleiben die Variablen leer.

    Was mache ich falsch?

    Danke und cu
    states


  • #2
    Ich verstehe dein Problem nicht ganz, aber irgendwie ist eher deine Vorgehensweise Murks. Wenn ich per Schleife die Datenbankergebnisse in Variablen einlese, dann tue ich das in der Regel so mithilfe eines mehrdimensionalen Arrays:
    PHP-Code:
    $data = array();
    while (
    $row mysql_fetch_assoc($result)) {
        
    $data[] = $row;

    Damit hast du alle Ergebnisse in einem Array. Wenn du die einzelnen Datensätze vorher noch bearbeiten willst und dafür den aktuellen Index brauchst, kannst du auch eine for-Schleife nutzen:
    PHP-Code:
    for ($index 0$row mysql_fetch_assoc($result); ++$index) {
        
    $data[$index] = $row;
        
    // tue sonst etwas mit $index

    Wenn du unbedingt einzelnen Variablen haben willst, dann musst du es halt so machen, wie du es bisher gemacht hast. Man könnte es zwar noch vereinfachen und variable Variablen (${$varname}) nutzen, aber dann besteht halt die Gefahr, dass du am Ende nicht mehr weißt, welche Variablen du überhaupt hast. Aber wie es aussieht, weißt du das hier anscheinend auch nicht.
    Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

    Kommentar


    • #3
      Zitat von states Beitrag anzeigen
      Mal abgesehen davon, daß ich auch gern wüßte, wie man das eleganter (schneller / in weniger Schritten) macht,
      mein eigentliches Problem besteht darin, daß im zweiten Durchlauf die
      Werte ab der 7. Variablen nicht mehr zugewiesen werden. Sprich: mitten in der Schleife bleiben die Variablen leer.

      Was mache ich falsch?

      Danke und cu
      states
      Vielleicht sind ab der siebten Spalte die Werte in der Datenbank einfach leer für den zweiten Datensatz?
      "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

      Kommentar


      • #4
        Ich versteh die "Verteilung" der Daten eh nicht: Es handelt sich doch in alle Fällen um die gleichen Werte - wozu auf verschiedene Variablen verteilen?
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Zitat von Manko10 Beitrag anzeigen
          Ich verstehe dein Problem nicht ganz
          O.K. neuer Versuch

          Zunächst einmal hätte es natürlich heißen müssen:
          "ich habe aus einer Datenbank-Tabelle 3 aufeinander folgende Datensätze in einen Array '$result_meta_3' eingelesen."
          Sorry.
          Konkret:
          Code:
          //  Array mit 3 Datensätzen schreiben
          $query_meta_3  = "SELECT * FROM 4y_meta
                                     WHERE sort_nr >= ' ". ($sort_nr-1) ." '
                                     AND sort_nr <= ' ". ($sort_nr+1) ." '
                                     ORDER BY sort_nr ASC
                                     "; 
          //  Array: '$result_meta_3'
          $result_meta_3  = mysql_query($query_meta_3, $link);
          Das mehrdimensionale Array '$result_meta_3' besteht aus 3 Datensätzen (gechecked, Inhalte vorhanden) bzw. 3 eindimensionalen Arrays.
          Wenn ich jetzt wie beschrieben aus dem ersten ein paar Werte, aus dem zweiten alle Werte und aus dem dritten wieder nur einen Teil der Werte benötige,
          muß ich mit 3 Schleifen durch '$result_meta_3'.
          Das macht while mit fetchassoc() automatisch, weil das Array halt nur 3 Indizes hat.
          Code:
          $i = 1;
          while($data_meta_3 = mysql_fetch_assoc($result_meta_3)) {
           ...
          $i = $i++;
          }
          Wenn ich in jeder Schleife andere Variablen befüllen will, lasse ich '$i' hochzählen und tausche diese mittels 'case' aus:
          1. Schleife z.B. '$scriptname_1',
          Code:
              switch ($i) {
                case 1:
                    $scriptname_1 = $data_meta_3['scriptname']; ...
          2. Schleife: z.B. '$scriptname',
          3. Schleife: z.B. '$scriptname_3'.

          So kann ich (möchte ich ) in einer PHP-Datei Meta-Daten dieser Datei (aus DB) anzeigen und mit Pathname / Scriptname Links zu 'Nachbar'-Dateien legen.

          Kommentar


          • #6
            wie sieht denn dein schleifeninhalt konkret aus? ich könnte mir zum beispiel vorstellen das du ein break vergessen hast, aber da du den code nicht gepostet hast kann man hier nur raten

            Kommentar


            • #7
              Wenn du wirklich immer Dreierpäärchen hast, dann ruf diese Daten doch auch gemeinsam ab, d.h. schreib halt drei mal "mysql_fetch_assoc()" hintereinander.

              PHP-Code:
              $countRows mysql_num_rows(); // oder per SQL die Gesamt-Anzahl Datensätze ermitteln
              // die Anzahl müsste glatt durch drei teilbar sein...
              while ($countRows 0) {
                
              $res1 mysql_fetch_assoc(...);
                
              $res2 mysql_fetch_assoc(...);
                
              $res3 mysql_fetch_assoc(...);

                
              // mach was mit den drei Datensätzen
                
                
              $countRows -= 3;

              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                Zitat von lstegelitz Beitrag anzeigen
                Ich versteh die "Verteilung" der Daten eh nicht: Es handelt sich doch in alle Fällen um die gleichen Werte - wozu auf verschiedene Variablen verteilen?
                3 Datensätze, 3 verschiedene Werte je Variable.
                Ich brauche halt nicht nur alle Variablen eines Datensatzes, sondern auch noch ein paar des vorigen und ein paar des nächsten.

                Kommentar


                • #9
                  Zitat von cycap Beitrag anzeigen
                  wie sieht denn dein schleifeninhalt konkret aus? ich könnte mir zum beispiel vorstellen das du ein break vergessen hast, aber da du den code nicht gepostet hast kann man hier nur raten
                  Wollte es Euch übersichtlicher machen aber wenn's der Wahrheitsfindung dient:
                  Code:
                  $i = 1;
                  while($data_meta_3 = mysql_fetch_assoc($result_meta_3)) {
                  
                      switch ($i) {
                        case 1:
                            $scriptpath_1 = $data_meta_3['scriptpath']; 
                            $scriptname_1 = $data_meta_3['scriptname']; 
                            $title_1 = $data_meta_3['title'];
                            $description_1 = $data_meta_3['description'];
                            $keywords_1 = $data_meta_3['keywords']; 
                            break;
                        case 2:
                            $id_meta = $data_meta_3['id_meta']; 
                            $scriptpath = $data_meta_3['scriptpath']; 
                            $scriptname = $data_meta_3['scriptname']; 
                            $sort_nr = $data_meta_3['sort_nr'];
                            $freigabe = $data_meta_3['freigabe']; 
                            $title = $data_meta_3['title'];
                            $description = $data_meta_3['description'];
                            $keywords = $data_meta_3['keywords']; 
                            $pagetopic = $data_meta_3['pagetopic']; 
                            $heading1 = $data_meta_3['heading1']; 
                            $text_firstcontent = $data_meta_3['text_firstcontent']; 
                            $id_firstcontent = $data_meta_3['id_firstcontent']; 
                            $robots = $data_meta_3['robots']; 
                            $kategorie = $data_meta_3['kategorie']; 
                            break;
                        case 3:
                            $title_3 = $data_meta_3['title'];
                            $description_3 = $data_meta_3['description']; 
                            $scriptpath_3 = $data_meta_3['scriptpath']; 
                            $scriptname_3 = $data_meta_3['scriptname'];
                            break;
                      }
                      $i = $i+1;
                  }

                  Kommentar


                  • #10
                    Mein Gott, ich schrieb ja: Murks.
                    Aber ich habe dir doch auch schon einen Code gepostet, mit dem du das alles ganz einfach machen kannst. Aber wie das hier immer ist, werden diese Codes stets überlesen.
                    Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                    Kommentar


                    • #11
                      Mal abgesehen davon das ich deine Variablennamen nicht kenne sehe ich keinen Fehler in deinem Code.

                      Mal ne Frage: Wozu musst du die Werte alle in einzelnen Variablen haben? Bzw. was bringt es dir wenn du bei case 1 und 3 nicht alle Werte hast? Bekommen tust du sie von der Datenbank doch sowieso, ob du sie benutzt ist eine andere Frage. Ich kann mir momentan keinen Anwendungfall für eine solche Schleife vorstellen.

                      Kommentar


                      • #12
                        Zitat von Manko10 Beitrag anzeigen
                        Mein Gott, ich schrieb ja: Murks.
                        Wieso ist das Murks?

                        Dein Code (abstrakt):
                        Code:
                        $data = array();
                        while ($row = mysql_fetch_assoc($result)) {
                            $data[] = $row;
                        }
                        Danach brauchst Du noch ein zusätzliches 'For',
                        um die Werte aus der 2. Ebene herauszuholen.

                        Mein Code (konkret):
                        Code:
                        while($data_meta_3 = mysql_fetch_assoc($result_meta_3)) {
                          $scriptname = $data_meta_3['scriptname'];
                         ...
                        $i = $i++;
                        }
                        Mit 'Case' splitte ich schnell und einfach die drei Durchläufe der 'while' auf unterschiedliche Variablen, die ich an verschiedenen späteren Stellen der PHP-Datei zur Ausgabe benötige => 1 'While' mit 3 Durchgängen - fertig.

                        BTW: Das Ganze klappt mittlerweile prächtig. Den 'Murks' erkläre ich mir mittlerweile mit einem irgendwie mangelhaften Refresh, so daß das Skript immer mit alten - und tatsächlich unvollständigen - DB-Daten arbeitete.
                        Was ein Browser-Neustart so alles bewirkt ...

                        Zitat von Manko10 Beitrag anzeigen
                        Aber ich habe dir doch auch schon einen Code gepostet, mit dem du das alles ganz einfach machen kannst.
                        Vielleicht erschien mir Deine Antwort zu unkonkret?
                        Zitat von Manko10 Beitrag anzeigen
                        Aber wie das hier immer ist, werden diese Codes stets überlesen.
                        Wenn das "hier immer" bei Dir so ist, müßte man sich vielleicht überlegen, woran das liegen könnte ...
                        Versteh' meine Kritik jetzt bitte möglichst konstruktiv:
                        Einem Anfänger ein paar abstrakte Lehrbuch-Textbausteine um die Ohren zu hauen und sich anschließend über mangelhaften Beifall zu wundern, ist nicht wirklich fruchtbar.

                        Kommentar


                        • #13
                          Mal ne Frage: Wozu musst du die Werte alle in einzelnen Variablen haben? Bzw. was bringt es dir wenn du bei case 1 und 3 nicht alle Werte hast? Bekommen tust du sie von der Datenbank doch sowieso, ob du sie benutzt ist eine andere Frage.
                          Gute Frage!
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar


                          • #14
                            Hallo cycap,
                            Zitat von cycap Beitrag anzeigen
                            Mal abgesehen davon das ich deine Variablennamen nicht kenne sehe ich keinen Fehler in deinem Code.
                            Danke, das ist doch was
                            Sorry, für Euren Aufwand - die Ursache des 'Murks' war offenbar doch ein Problem mit nicht aktuellen (daher nicht vollständigen) Daten aus der DB (sh. mein anderes Posting, Stichw.: "Refresh").
                            Zitat von cycap Beitrag anzeigen
                            Mal ne Frage: Wozu musst du die Werte alle in einzelnen Variablen haben? Bzw. was bringt es dir wenn du bei case 1 und 3 nicht alle Werte hast? Bekommen tust du sie von der Datenbank doch sowieso, ob du sie benutzt ist eine andere Frage. Ich kann mir momentan keinen Anwendungfall für eine solche Schleife vorstellen.
                            Zweite Frage zuerst: Ich benötige in Case1 und 3 nur einen Teil der Werte, für die anderen wollte ich keine Ressourcen / Variablen verschwenden.
                            Erste Frage: Für Links auf 'Nachbar-Dateien' inkl. Linktext benötige ich Case1 und 3, Case 2 beinhaltet Daten für die aktuelle Datei.

                            Gruß
                            state

                            Kommentar


                            • #15
                              Zitat von states
                              Danach brauchst Du noch ein zusätzliches 'For',
                              um die Werte aus der 2. Ebene herauszuholen.
                              Das kommt auf den Anwendungsfall an, den wir ja nicht kennen.

                              Jedenfalls ist die Lösung mit einem Array viel eleganter. Selbst wenn du bestimmte Werte eines Datensatzes nicht benötigst, kannst du sie ruhig mit in das Array schreiben, sie stören ja nicht und ausgelesen sind sie ohnehin schon.
                              So eine variable Anzahl an Variablen, die irgendwie zur Laufzeit zusammen kommt, ist wirklich keine schöne Sache. Die Pflege des Codes ist alles andere als einfach.

                              Und wenn du den geposteten Codeschnipsel nicht verstehst, der nun wirklich keine großen Kenntnisse voraussetzt, solltest du dich vielleicht noch mal mit den Grundlagen von PHP beschäftigen. Arrays sind praktische Konstrukte, die man als Entwickler beherschen und einsetzen können sollte.
                              Zitat von states
                              Code:
                              //  Array: '$result_meta_3'
                              $result_meta_3  = mysql_query($query_meta_3, $link);
                              Das mehrdimensionale Array '$result_meta_3'[...]
                              Es ist keins!
                              http://hallophp.de

                              Kommentar

                              Lädt...
                              X