ChrisL: mysql fetch array / PHP - doppelte Anzahl Spalten

Hallo

Folgendes Beispiel:

$qry1 = mysql_query( "SELECT * FROM tb WHERE fd1='$var'");

while($ar = mysql_fetch_array($qry1)) {
echo count($ar);
}

Die Query und alles funktioniert, nur bekomme ich die doppelte Anzahl Spalten mit Count. Z.b. hat meine Tabelle 3 Spalten:

"DatenSpalte1","DatenSpalte2","DatenSpalte3"
Als Resultat erhalte ich nun aber 6 Spalten, beispielhaft:
"DatenSpalte1","DatenSpalte2","DatenSpalte3","","",""

Die überschüssigen Felder sind also immer leer und es ist immer genau die doppelte Anzahl.

Ich frage mich jetzt wo die Ursache liegt und hoffe jemand hat eine Idee. Früher im Code habe ich schonmal mysql_fetch_array benutzt, allerdings war die Query nicht identisch (gleiche Tabelle, aber anderes Kriterium). Ich vermute daher, dass ein Zusammenhang auszuschliessen ist, oder doch nicht?

Bin für Hinweise dankbar.

Gruss
Chris

  1. Hello,

    $qry1 = mysql_query( "SELECT * FROM tb WHERE fd1='$var'");

    while($ar = mysql_fetch_array($qry1)) #?? Das sit soch falsch.  $ar[] = ...
      {

    echo count($ar);
    }

    Die Query und alles funktioniert, nur bekomme ich die doppelte Anzahl Spalten mit Count. Z.b. hat meine Tabelle 3 Spalten:

    Ultrakurzantwort: RTFM

    Etwas länger:

    echo "<pre>\n";
    print_r($ar);
    echo "</pre>\n";

    Noch etwas länger:

    Vergleiche im PHP-Manual die Funktionen:
    http://www.php.net/manual/en/function.mysql-fetch-array.php
    http://www.php.net/manual/en/function.mysql-fetch-assoc.php
    http://www.php.net/manual/en/function.mysql-fetch-row.php

    Die Ultralangversion überlasse ich dem Thread...

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. Hallo,

      while($ar = mysql_fetch_array($qry1)) #?? Das sit soch falsch.  $ar[] = ...

      Was soll daran falsch sein? Ich bin der Meinung es stimmt so wie er es geschrieben hat.

      Ultrakurzantwort: RTFM

      Was heißt das? Read the fu**ing manual?

      Die Ultralangversion überlasse ich dem Thread...

      Geht doch ganz kurz. Siehe https://forum.selfhtml.org/?t=158992&m=1034223.
      Oder noch einfacher: mysql_fetch_array($gry1, MYSQL_ASSOC)löst sein Problem. Oder er teilt durch 2 ;)

      Grüße, Matze

      1. Hello,

        while($ar = mysql_fetch_array($qry1)) #?? Das ist doch falsch.  $ar[] = ...

        Was soll daran falsch sein? Ich bin der Meinung es stimmt so wie er es geschrieben hat.

        Die Ultralangversion überlasse ich dem Thread...

        Geht doch ganz kurz.

        Nö, Du scheinst ja die von mir vorgeschlagenen Tests nicht einmal durchgeführt zu haben.

        Nochmal zur Wiederholung:

        echo "<pre>\n";
        print_r($ar);
        echo "</pre>\n";

        Ich hatte angenommen, dass Du das ganze Resultset abholen wolltest.
        Dann sollte man auch besser so schreiben.

        $_result = Array();   # Gesamt-Array für das ganze Rresultset
         $_ar     = Array();   # Hilfs-Array

        while($ar = mysql_fetch_assoc($qry1)  # einen Datensatz abholen
         {
           $_result[] = $_ar;                  # und an das Gesamt-Array übertragen
         }

        echo count $_result;    # liefert die Anzahl der Datensätze
         echo count $_result[0]  # liefert die Anzahl der Elemente (Spalten) eines Datensatzes
                                 # vorausgesetzt, es gab überhaupt einen.
                                 # Man müsste also vorher fragen
                                 # (isset($_result[0]) and is_array($_result[0]))

        Wenn es ein Ergebnis gab, sollten alle $_result[0] bis result[n] dieselbe Anzahl Elemente haben

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        1. Hallo Tom,

          while($ar = mysql_fetch_array($qry1)) #?? Das ist doch falsch.  $ar[] = ...

          Was soll daran falsch sein? Ich bin der Meinung es stimmt so wie er es geschrieben hat.

          Ich auch. Es ist richtig.

          Nö, Du scheinst ja die von mir vorgeschlagenen Tests nicht einmal durchgeführt zu haben.

          Chris läßt sich die Anzahl der Spalten ausgeben. Das ist etwas ganz anderes
          als das, was Du schreibst.

          Ich hatte angenommen, dass Du das ganze Resultset abholen wolltest.

          Tom, achte doch bitte darauf, wem Du antwortest:
          Matze ist nicht der Verfasser des Ausgangspostings. Sein konkreter Hinweis
          darauf, dass mysql_fetch_array() ein Array mit assoziativen _und_ numerischen
          Indizes zurückliefert, war in meinen Augen hilfreicher als Deine Ausführungen.

          Der OP fragte nicht danach, wie er die Daten abholen kann, das scheint ihm
          geläufig zu sein, er war nur verwundert, warum er zweimal soviele Spalten hatte.

          Freundliche Grüße

          Vinzenz

          1. Hello Vinzenz,

            sas wird also schon wieder ein Geschäftsordnungs-Thread.
            Schade eigentlich.

            while($ar = mysql_fetch_array($qry1)) #?? Das ist doch falsch.  $ar[] = ...

            Was soll daran falsch sein? Ich bin der Meinung es stimmt so wie er es geschrieben hat.

            Ich auch. Es ist richtig.

            Nein es ist auf jeden Fall falsch.

            Wenn er die Anzahl der Spalten des vorhandenen Resultsets haben will, muss er nicht das gesamte Resultset durchnuddeln mit while...

            Es reicht dann, mit

            if($res)         ## (Nut BTW: er benutzt $qry1,
                               ## aber das wäe für mich ein Name für einen Querysting)
              {
                $ar = mysql_fetch_assoc();
                $count = count ($ar);
              }

            abzufragen.

            Wenn ich ein Resultset mit while durchlaufen lasse, und dann aber nur in jeder Zeile dieselbe Antwort erhalte, bis auf die letzte, dann ist das für mich falsch aufgebaut.

            Die einzgie Möglichkeit, Euch beide zu retten (*g*) sehe ich darin, dass der OP sich nun nochmal meldet und kundtut, dass er doch nur überprüfen wollte, ob das Resultset tatsächlich immer genauso viele Spalten pro Zeile enthält, also die Prüfung tatsächlich für _alle_ Zeilen vornehmen wollte.

            Das Ergebnis dann aber nur auf der Standardausgabe zu verewigen und es sonst ins Nirwana zu senden, lässt nicht unbedingt auf Sinnhaftigkeit schließen.

            Warten wir das also ab.

            Harzliche Grüße vom Berg
            http://bergpost.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        2. Hallo,

          Ich hatte angenommen, dass Du das ganze Resultset abholen wolltest.

          Sorry, ich bin nicht der OP gewesen. Trotzdem danke für die Nachhilfestunde!

          Grüße, Matze

          1. Hello,

            Sorry, ich bin nicht der OP gewesen. Trotzdem danke für die Nachhilfestunde!

            Der OP hat eine Frage gestellt, die vermuten ließ, dass er nicht genau wusste, was er wollte.
            Du hast meine Antwort bemängelt, scheinbar ohne meinen dazugehörigen Hinweis zu berücksichtigen.

            Dass dieser Thread nicht einfach mit einem hingeworfenen Zitat geführt werden kann, haben wir neulich schon einmal ausführlich disktutiert (das geht jetzt auch an Vinzenz).

            Die Quellen zur Information ahbe ich ganannt und gehe nach wie vor davon aus, dass wir hier nicht bei "getScript" sind, sondern bei _S_E_L_F_  (das geht auch an Vinzenz)

            Und da ich gerade feststelle, dass ich immer saurer werde, je mehr ich schreibe, steige ich hjier lieber aus. Ich empfehle den anderen Stammpostern und den "Machern", dass sie sich vielleicht erstmal klar darüber werden, was sie eigentlich wollen. Schnelle, hingeworfenene Hilfe (der OP sagt dann meistens noch nichtmal Danke und kommt auch nicht wieder, um die weitere Diskussion zum thema zu verfolgen), oder einen einen Dialog, der schrittweise zur Lösung führt und das Mitdenken fördert?

            Bei den Dialogthreads habe ich jedenfalls immer mehr gelernt, als bei hingeschmissenen vermeintlichen Schnelllösugen.

            Also bis (viel) später dann.

            Mich seid Ihr jetzt erstmal los.

            Harzliche Grüße vom Berg
            http://bergpost.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

            1. Hallo,

              Und da ich gerade feststelle, dass ich immer saurer werde(...)

              Entschuldige bitte, das wollte ich nicht erreichen.
              Entschuldige bitte auch, falls meine Posts dich dazu veranlasst haben so zu reagieren. Auch das war nicht meine Absicht.

              So, das von mir verwendete Zitat von php.net beantwortet nur leider trotzdem exakt und ausführlich die Frage des OP.
              Deine Antworten sind IMHO etwas am Thema vorbei. Fachlich und sachlich sicher korrekt.

              Cool down please, ich wollte keinen Streit provozieren.

              Grüße, Matze

              1. echo $begrüßung;

                So, das von mir verwendete Zitat von php.net beantwortet nur leider trotzdem exakt und ausführlich die Frage des OP.
                Deine Antworten sind IMHO etwas am Thema vorbei. Fachlich und sachlich sicher korrekt.

                Es gibt da einen Spruch: Gib einem Mann einen Fisch und er ist für einen Abend satt. Zeige ihm, wie er eine Angel verwendet, und er kann sich in Zukunft selbst ernähren. (oder so ähnlich)

                Deine Antwort war der Fisch. Tom hat versucht, dem OP zu zeigen, wie man solchen Rätseln auf die Spur kommt, wie dem, vor dem der OP stand. Denn solche Rätsel trifft man im Laufe seines Programmiererlebens immer wieder an. Eine Kontrollausgabe von Variableninhalten ist die wichtigste Methode zu ihrer Lösung. Ebenfalls sollte das Handbuch eine der ersten Anlaufstellen bei Problemen mit bestimmten Dingen einer Programmierumgebung (z.B. Funktionen) sein. Jemand der Fragen wie der OP stellt, zeigt damit im Grunde auch, dass er diese Handwerkszeuge noch nicht genügend beherrscht. Es ist also keinesfalls falsch, ihm diese ebenfalls mit auf den Weg zu geben.

                echo "$verabschiedung $name";

                1. Es gibt da einen Spruch: Gib einem Mann einen Fisch und er ist für einen Abend satt.
                  Zeige ihm, wie er eine Angel verwendet, und er kann sich in Zukunft selbst ernähren.
                  (oder so ähnlich)

                  Der Spruch ging so ähnlich, ja.

                  Entzünde einem Frierenden ein Feuer und er wird für eine Nacht gewärmt werden.
                  Zünde ihn selbst an und er wird es für den Rest seines Lebens warm haben.

                  Roland°

                  --
                  Aquahu akbar!
                  1. Hallo,

                    jaja, Nachts ists kälter als draussen.^^

                    Die überschüssigen Felder sind also immer leer und es ist immer genau die doppelte Anzahl. Ich frage mich jetzt wo die Ursache liegt(..)

                    Entschuldigung noch einmal. Der OP hat eine _eindeutige_ Frage gestellt.
                    Keine die irgendwelche 'Vermutungen' zuließe.

                    Meine Antwort war IMHO kein Fisch. Meine Antwort hat dem OP IMHO deutlich erklärt warum er das "Problem" hat (Angel) und hab ihm auch die Lösung genannt (gratis Fisch). Zusätzlich bekam er noch eine 'Rutenverlängerung' ;) inform der Quelle des Zitats^^

                    Jemand der Fragen wie der OP stellt, zeigt damit im Grunde auch, dass er diese Handwerkszeuge noch nicht genügend beherrscht. Es ist also keinesfalls falsch, ihm diese ebenfalls mit auf den Weg zu geben.

                    1. Hab ich das und dann: sicher kann ich Links erstellen, aber ob das nun besser ist, als die relevante Stelle zu zitieren sei dahin gestellt.
                    Ich habe ihm IMHO sehr gutes Handwerkszeug mit auf den Weg gegeben. Beachte bitte auch den Zeitpunkt der Posts, meiner kam deutlich nach Tom seinem. Tom zu wiederholen wär Blödsinn gewesen.

                    Grüße, Matze

  2. Hallo,

    von PHP.net:

    Das optionale zweite Argument Ergebnistyp in mysql_fetch_array() ist eine Konstante und kann die folgenden Werte annehmen: MYSQL_ASSOC, MYSQL_NUM und MYSQL_BOTH. Diese Eigenschaft steht seit PHP 3.0.7 zur Verfügung. MYSQL_BOTH ist der Standard für diesen Paramater.

    Verwenden Sie MYSQL_BOTH, erhalten Sie ein Array mit assoziativen und numerischen Indizes.

    Grüße, Matze

  3. Hallo an alle

    Eure Beiträge haben mir geholfen, herzlichen Dank.

    Der Hinweis RTFM ist nicht unberechtigt, aber ich dachte das Problem liegt bei mir und nun weiss ich, dass die Funktion defekt ist :-))

    MfG aus Australien
    Chris

    1. Hallo,

      Der Hinweis RTFM ist nicht unberechtigt, aber ich dachte das Problem liegt bei mir und nun weiss ich, dass die Funktion defekt ist :-))

      Was veranlasst dich zu diesem Urteil? Die Funktion macht genau das, was man von ihr verlangt.
      Das Problem liegt bei dir. Du musst die Funktion richtig anwenden oder die richtige Funktion verwenden, dann erhälst du auch das gewünschte Ergebnis.

      Grüße, Matze