uwe_l: Abfrage 2 mal ausgeben (mysql_data_seek ?)

Guten Tag,

ich lese Daten aus einer Tabelle mit einer Abfrage aus.
Bisher habe ich es so gemacht, sollte ich die gleiche Tabelle an einer anderen Stelle in der Php-Datei brauchen, machte ich eine Neue Abfrage.

Jetzt habe ich von der Funktion mysql_data_seek gelesen. Aber nichts verstanden.

Meine Vorgehensweise war diese
<?php
mysql_select_db($database_test, $test);
$query_testabfrage = "SELECT vorname, name FROM dynamik";
$testabfrage = mysql_query($query_testabfrage, $test) or die(mysql_error());
$row_testabfrage = mysql_fetch_assoc($testabfrage);
$totalRows_testabfrage = mysql_num_rows($testabfrage);

do {
 echo  $row_testabfrage['vorname'].'<br>';
  } while ($row_testabfrage = mysql_fetch_assoc($testabfrage));
?>

Wenn ich jetzt diesen Teil
do {
 echo  $row_testabfrage['vorname'].'<br>';
  } while ($row_testabfrage = mysql_fetch_assoc($testabfrage));
an einer anderen Stelle in der Datei brauche, wie muss ich das machen?

Was hier steht :
http://www.php.net/manual/de/function.mysql-data-seek.php
habe ich nicht verstanden

Besten Danke
Uwe

  1. Moin!

    Was hier steht :
    http://www.php.net/manual/de/function.mysql-data-seek.php
    habe ich nicht verstanden

    Lies die Seite und schreibe hier ins Forum in deinen eigenen Worten, was auf der Seite beschrieben wird über die Funktion.

    Nur wenn wir wissen, was du an Informationen aufgenommen hast, können wir Mißverständnisse korrigieren.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hallo

      in diesem Beispiel, was ich versucht habe anzuwenden, werden doch die Daten in umgekehrter Reighenfolge ausgelesen.

      Ich habe gedacht, das diese Funktion mir erlaubt ein Zweites
      do/while für eine vorhandene Abfrage zu ertellen.

      Danke Uwe

      Lies die Seite und schreibe hier ins Forum in deinen eigenen Worten, was auf der Seite beschrieben wird über die Funktion.

      Nur wenn wir wissen, was du an Informationen aufgenommen hast, können wir Mißverständnisse korrigieren.

      • Sven Rautenberg
      1. Moin!

        in diesem Beispiel, was ich versucht habe anzuwenden, werden doch die Daten in umgekehrter Reighenfolge ausgelesen.

        Ich habe gedacht, das diese Funktion mir erlaubt ein Zweites
        do/while für eine vorhandene Abfrage zu ertellen.

        Ja. stimmt.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Ja. stimmt.

          • Sven Rautenberg

          Aha, das ist also ein Forum für die Wissenden.

          Entschuldige, das ich fragte. Kommt nicht mnehr vor !!!

          1. Moin!

            Ja. stimmt.

            • Sven Rautenberg

            Aha, das ist also ein Forum für die Wissenden.

            Entschuldige, das ich fragte. Kommt nicht mnehr vor !!!

            Ich kann die Doku für dich lesen. Aber ich kann die Doku nicht für dich verstehen, das mußt du schon selbst tun.

            Wenn du mir aber nicht sagst, was du bisher verstanden hast, kann ich nirgendwo ansetzen, dein Bild der Funktion zu korrigieren. Bislang hast du einfach nur gesagt, dass du _nichts_ verstanden hast. Bei Null Verständnis kann ich aber nicht anfangen. Außerdem glaube ich dir nicht, dass du nichts verstanden hast.

            Ich hatte dich gebeten, die Doku-Seite in eigenen Worten wiederzugeben. Hast du ja nicht wirklich getan - aber das, was du gesagt hast, stimmt. Das habe ich dir bestätigt.

            Lernen ist Arbeit. Wenn du nicht mitarbeiten willst, ist das ok. Erwarte aber bitte nicht, dass ich deinen Part freiwillig mitübernehme.

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Lernen ist Arbeit. Wenn du nicht mitarbeiten willst, ist das ok. Erwarte aber bitte nicht, dass ich deinen Part freiwillig mitübernehme.

              • Sven Rautenberg

              Hallo,

              man muss mir nicht meine Arbeit machen, dass kann ich alleine.
              Aber ein Tipp wie

              • schau mal hier
                http://www.selfphp.info/funktionsreferenz/mysql_funktionen/mysql_data_seek.php

              da ist es etwas besser erklärt als in der Doku-

              wäre hilfreich.

              Uwe

              1. Moin!

                man muss mir nicht meine Arbeit machen, dass kann ich alleine.
                Aber ein Tipp wie

                • schau mal hier
                  http://www.selfphp.info/funktionsreferenz/mysql_funktionen/mysql_data_seek.php

                da ist es etwas besser erklärt als in der Doku-

                wäre hilfreich.

                Bei SelfPHP steht dasselbe, wie bei php.net. Es ist minimalst anders formuliert, und effektiv gesehen nicht besser, als die Originaldoku, von der du ja behauptet hast, dass du darin nichts verstehen würdest. Wie soll ich da erwarten, dass du dann mit SelfPHP zurechtkommst?

                Abgesehen davon steht SelfPHP in dem Ruf, nur eine schlechte Kopie der Original-Doku zu sein.

                - Sven Rautenberg

                --
                "Love your nation - respect the others."
  2. Hello Uwe,

    Meine Vorgehensweise war diese

    da habe ich jezt mal ein wenig drin herumgepfuscht.
    Vielleicht hilft Dir das weiter, als die eigentlich angefragte Handbuchseite

    <?php

    # [...]

    $con = mysql_connect('localhost', $user, $passwort);

    if (!con)
      {
        ## Fehlerbehandlung
      }

    if !(mysql_select_db($database_test, $con))

    {
        ## Fehlerbehandlung
      }

    $query = "SELECT vorname, name FROM dynamik";
    $testabfrage = mysql_query($query, $con);

    if($testabfrage)
      {
        $row_testabfrage = mysql_fetch_assoc($testabfrage);
        $totalRows_testabfrage = mysql_num_rows($testabfrage);

    $_gesabfrage = array();

    while($row_testabfrage = mysql_fetch_assoc($testabfrage))
        {
          $_gesabfrage[] = $row_testabfrage;
        }

    mysql_free_result($testabfrage);  ## das Originalergebnis von MySQL benötigen
                                          ## wir jetzt nicht mehr und geben den Speicher frei
      }
      else
      {
        ## Fehlerbehandlung
      }

    ## kontrollausgab fürs debuggen:

    echo "<pre>\n";
      if (isset($_gesabfrage))
      {
        echo htmlspecialchars(print_r($_gesabfrage,1));
      }
      else
      {
        echo "kein Abfrageergebnis verfügbar<br />\n";
      }

    echo "</pre>\n";

    ?>

    MySQL liefert nach der erfolgreichen Abfrage mit mysql_query() ein Datenset, quasi eine formatierte lineare Tabelle, die vomn PHP zwischengepuffert wird. Mit den API-Funktionen von PHP kannst Du darauf zugreifen. Du kannst auch darin navigieren.

    Anders, wenn Du kein reines mysql_unbufferd_query() durchführst. Da kannst Du, ähnlich einer klassischen Textdatei, nur vorwärts drin lesen. Es ist ein FiFo-Speicher, der von Dir vollständig geleert werden muss.
    Du musst dann auf jeden Fall die Übernahme _aller_ gelieferten Datensätze garantieren, da die Schnittstelle sonst für ein weiteres Query nicht zur Verfügung steht.

    Im obigen Beispiel haben wir das aber auf jeden Fall durch die Übertragung der Daten in ein PHP-Array vorgenommen. Beim bufferd Query ist das eigentlich nicht notwendig, aber es ist bequemer.

    Vermutlich ist es aber genauso obsolete, wie das typische   $name = $_POST['name'];
    Allerdings ist der Zugriff auf einzelne Speicherzellen im gepufferten resultset eben recht funktionslastig.

    1. Schritt: schauen, ob ein Datensatz vorhanden sit mit mysql_num_rows()
    2. Schritt: in dem Objekt den Zeiger auf den Datensatz einstellen mit mysql_data_seek()
                das muss im Bereich von 0 bis mysql_num_rows() -1 sein
    3. Schritt: auf den Datensatz mit den mysql_fetch_*() Funtionen zugreifen
    4. Schritt: nicht vergessen, den Speicher des Objektes wieder freizugeben

    Ein Überschreiben des Objekt-Kennzeichners (mit einer neuen Abfrage) hat bisher
                den Speicher der alten Abfrage nicht wieder freigegeben.

    Mit PHP-Arrays geht das alles etwas bequemer.

    Darum überlege ich, ob es nicht konsequenter ist, nur noch unbufferd Queries durchzuführen, da ich die Ergebnismenge sowieso immer in ein PHP-Array überführe.

    Ob dann aber auch noch ein mysql_free_result() notwendig ist, ist mir noch nicht klar...

    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. Hello @ all,

      Anders, wenn Du kein reines mysql_unbufferd_query() durchführst. Da kannst Du, ähnlich einer klassischen Textdatei, nur vorwärts drin lesen. Es ist ein FiFo-Speicher, der von Dir vollständig geleert werden muss.

      Du musst dann auf jeden Fall die Übernahme _aller_ gelieferten Datensätze garantieren, da die Schnittstelle sonst für ein weiteres Query nicht zur Verfügung steht.

      Mit PHP-Arrays geht das alles etwas bequemer.

      Darum überlege ich, ob es nicht konsequenter ist, nur noch unbufferd Queries durchzuführen, da ich die Ergebnismenge sowieso immer in ein PHP-Array überführe.

      Ob dann aber auch noch ein mysql_free_result() notwendig ist, ist mir noch nicht klar...

      Und diese Frage haben sich auch Andere schon gestellt
      http://marc.info/?l=php-db&m=108860967625179&w=3

      Leider finde ich in den offiziellen PHP-Manuals nichts darüber.
      Bleibt nun also, die Quellen von MySQL zu den APIs zu durchforsten.

      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. Hello,

        Und diese Frage haben sich auch Andere schon gestellt
        http://marc.info/?l=php-db&m=108860967625179&w=3

        Leider finde ich in den offiziellen PHP-Manuals nichts darüber.
        Bleibt nun also, die Quellen von MySQL zu den APIs zu durchforsten.

        und diese Stelle in der Online-Dokumentation liefert die notwendigen Hinweise
        http://dev.mysql.com/doc/refman/5.1/de/mysql-store-result.html
        http://dev.mysql.com/doc/refman/5.1/de/mysql-use-result.html

        Zumidest beantwortet es (per Doku) die Frage, ob beim (auf C-API-Ebene) ungepufferten Query auch mysql_free_result() aufgerufen werden muss.

        Mit dem Funktionen der C-API von MySQL muss man nun wohl wieder in die PHP-Sources einsteigen, und schauen, wo sie benutzt werden.

        Danach kann dann dann wohl eine Aussage getroffen werden, ob phps mysql_unbuffered_query() noch etwas anderes macht, als mysqls mysql_use_result() zu verwenden.

        Kann eine längere Nacht werden

        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. Hello,

          Mit dem Funktionen der C-API von MySQL muss man nun wohl wieder in die PHP-Sources einsteigen, und schauen, wo sie benutzt werden.

          Danach kann dann dann wohl eine Aussage getroffen werden, ob phps mysql_unbuffered_query() noch etwas anderes macht, als mysqls mysql_use_result() zu verwenden.

          PHP-Source:

          /* {{{ proto resource mysql_unbuffered_query(string query [, int link_identifier])
             Sends an SQL query to MySQL, without fetching and buffering the result rows */
          PHP_FUNCTION(mysql_unbuffered_query)
          {
           php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_USE_RESULT);
          }

          Die MySQL-C-API-Funktion wird einfach nur "durchgereicht", also muss auch in PHP das für die API geforderte (php)mysql_free_result() ausgeführt werden, wenn nicht irgendwann der Speicher auf dem MySQL-Server verbraucht sein soll.

          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

      Ist die doppelte Ausführung von $row_testabfrage = mysql_fetch_assoc($testabfrage) ein Schussligkeitsfehler deinerseits oder gewollt?

        
      
      >   if($testabfrage)  
      >   {  
      >     $row_testabfrage = mysql_fetch_assoc($testabfrage);  
      >     // ...  
      >     while($row_testabfrage = mysql_fetch_assoc($testabfrage))  
      >     {  
      >       $_gesabfrage[] = $row_testabfrage;  
      >     }  
      >     // ...  
      >   }
      
      

      Davon abgesehen, wenn ich es richtig verstehe, will uwe_l das Ergebnis _einer_ Abfrage zwei- bzw. grundsätzlicher: _mehrfach_ innerhalb einer Seite verwenden. Was spricht dagegen, das _einmal_ per $row_testabfrage = mysql_fetch_assoc($testabfrage) erzeugte Array _mehrfach_ zu verwenden?

      _Eine_ Abfrage, _eine_ Umwandlung, deren Ergebnis _mehrfach_ benutzt wird.

      Tschö, Auge

      --
      Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
      (Victor Hugo)
      Veranstaltungsdatenbank Vdb 0.2
      1. Hallo

        nochma:

        ... Was spricht dagegen, das _einmal_ per

        while ($row_testabfrage = mysql_fetch_assoc($testabfrage))  
           {  
           $_gesabfrage[] = $row_testabfrage;  
           }
        

        erzeugte Array _mehrfach_ zu verwenden?

        Tschö, Auge

        --
        Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
        (Victor Hugo)
        Veranstaltungsdatenbank Vdb 0.2
        1. Moin!

          nochma:

          ... Was spricht dagegen, das _einmal_ per

          while ($row_testabfrage = mysql_fetch_assoc($testabfrage))

          {
             $_gesabfrage[] = $row_testabfrage;
             }

          
          >   
          > > erzeugte Array \_mehrfach\_ zu verwenden?  
            
          Der Speicherverbrauch.  
            
           - Sven Rautenberg
          
          -- 
          "Love your nation - respect the others."
          
          1. Hallo

            ... Was spricht dagegen, das _einmal_ per

            while ($row_testabfrage = mysql_fetch_assoc($testabfrage))

            {
               $_gesabfrage[] = $row_testabfrage;
               }

            
            > >   
            > > > erzeugte Array \_mehrfach\_ zu verwenden?  
            >   
            > Der Speicherverbrauch.  
              
            Verstehe ich nicht. Das Durchlaufen bei der Ausgabe des Arrays `$_gesabfrage`{:.language-php} an sagen wir mal zwei verschiedenen Stellen einer zu generierenden HTML-Seite verbraucht mehr Speicher, als die beispielhaft zweimalige Umwandlung des Ergebnisses der SQL-Abfrage in mehrere Arrays und deren Ausgabe an den verschiedenen Stellen der Seite?  
              
            Tschö, Auge  
            
            -- 
            Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.  
            (Victor Hugo)  
              
            [Veranstaltungsdatenbank Vdb 0.2](http://termindbase.auge8472.de/)
            
            1. Moin!

              ... Was spricht dagegen, das _einmal_ per

              while ($row_testabfrage = mysql_fetch_assoc($testabfrage))

              {
                 $_gesabfrage[] = $row_testabfrage;
                 }

              
              > > >   
              > > > > erzeugte Array \_mehrfach\_ zu verwenden?  
              > >   
              > > Der Speicherverbrauch.  
              >   
              > Verstehe ich nicht. Das Durchlaufen bei der Ausgabe des Arrays `$_gesabfrage`{:.language-php} an sagen wir mal zwei verschiedenen Stellen einer zu generierenden HTML-Seite verbraucht mehr Speicher, als die beispielhaft zweimalige Umwandlung des Ergebnisses der SQL-Abfrage in mehrere Arrays und deren Ausgabe an den verschiedenen Stellen der Seite?  
                
              Nein. Das ERZEUGEN des Arrays verbraucht bzw. benötigt mehr Speicher, als wenn man das SQL-Ergebnis in seinem Pufferspeicher beläßt. Mindestens punktuell beim Erzeugen des Arrays, weil das Kopieren den Bedarf grob verdoppelt.  
                
               - Sven Rautenberg
              
              -- 
              "Love your nation - respect the others."
              
              1. Hello,

                Nein. Das ERZEUGEN des Arrays verbraucht bzw. benötigt mehr Speicher, als wenn man das SQL-Ergebnis in seinem Pufferspeicher beläßt. Mindestens punktuell beim Erzeugen des Arrays, weil das Kopieren den Bedarf grob verdoppelt.

                Das könnte dann Leute, die generell mittels "Select * from table" _alle_ Spalten und _alle_ Zeilen einer Tabelle einlesen (warum auch immer?), dann schon an den rand der in vielen Installationen üblichen 8MB Speicher bringen...

                Aber darum schrieb ich ja schon: Das Abfrageergebnis bereits in der Datenbank so kompakt wie möglich halten. Dazu gehört auch, dass man z.B. für eine Listendarstellung (Jeder Satz eine Zeile) abgefragte (große) Textfelder nicht vollständig aus der DB holt, wenn man sie später sowieso nur bis zum 30ten Zeichen anzeigen lassen will.

                Angenommen, so eine Liste schafft in der Breite 120 Zeichen (damit man nicht horizontal scrollen muss)  und hat 20 Spalten, dann benötigt man für jedes Zeilenarray ca.  1.440 + 160 = 1.600 Bytes
                Das macht dann bei 50 Zeilen auf dem Schirm ca. 3600 + 80.000 = 83.600 Bytes

                Alleine die interne Speicherverwaltung für die Arrays kostet schon 75.600 Bytes.
                Hinzu kommt noch weiterer Speicherbedarf für die Verwaltung, den ich hier nicht berücksichtigt habe.

                Das sind nur Ergebnisse aus einem kurzen Versuch.
                Ein leeres Arrayelement brauchte meistens 72 Bytes zusätzlich, Datenspeicher wurden immer 4-Byte-weise allokiert.

                Wenn man wissen will, was da wirklich passiert, muss man reingucken in den Source-Code für die Arrays.

                Resultat des Tests ist aber, dass die "Arrays" in PHP bezüglich des Speicherverbrauches sehr teuer sind. Der meiste Speicher (gut 90%) ging hier für die Verwaltung drauf. Die Datenfelder waren zwischen 28 und 40 Bytes lang.

                Wenn man also "nur" 8MB zur Verfügung hat, muss man damit bei größeren Scripten schon sorgsam umgehen. Das script selber benötigt ja auch noch Speicher. Ob die Instanz für den Parser auch von den 8MB abgeht, die mit memory_limit eingestellt werden können, weiß ich (noch) nicht.

                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. Hello,

          nochma:

          ... Was spricht dagegen, das _einmal_ per

          while ($row_testabfrage = mysql_fetch_assoc($testabfrage))

          {
             $_gesabfrage[] = $row_testabfrage;
             }

          
          >   
          > > erzeugte Array \_mehrfach\_ zu verwenden?  
            
          nichts, darum habe ich es ja erzeugen lassen und anschließend das Resultset des bufferd Query freigegeben, als Ausgleich für den Speicherverbrauch in PHP habe ich den Speicher in MySQL wieder freigegeben. :-) Könnte natürlich nur relaevant sein, wenn die beiden Server auf einem Host laufen.  
            
          Man muss ja auch nicht das gesamte Ergebnisarray aufbewahren, sondern nur die Sätze daraus, die man noch häufiger braucht. Und außerdem sollte das Ergebnis immer so knapp wie möglich gehalten werden. Das kann man über intelligente Abfragen regeln.  
            
            
            
            
            
            
          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 :-)  
            
          ![](http://bitworks.de/~selfHTML/Virencheck.gif)  
          
          
          1. Hallo

            ... Was spricht dagegen, das _einmal_ ... erzeugte Array _mehrfach_ zu verwenden?

            nichts, darum habe ich es ja erzeugen lassen und anschließend das Resultset des bufferd Query freigegeben, als Ausgleich für den Speicherverbrauch in PHP habe ich den Speicher in MySQL wieder freigegeben. :-) Könnte natürlich nur relaevant sein, wenn die beiden Server auf einem Host laufen.

            Damit sollte sich auch Svens Posting erklären, auf das ich soeben mit einer -nunmehr offensichtlich gegenstandslosen- Nachfrage antwortete.

            Man muss ja auch nicht das gesamte Ergebnisarray aufbewahren, sondern nur die Sätze daraus, die man noch häufiger braucht. Und außerdem sollte das Ergebnis immer so knapp wie möglich gehalten werden. Das kann man über intelligente Abfragen regeln.

            Davon (Hole dir nur das, was du brauchst!) sollte _eigentlich_ ausgegangen werden können.

            Tschö, Auge

            --
            Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
            (Victor Hugo)
            Veranstaltungsdatenbank Vdb 0.2
      2. Hello,

        Ist die doppelte Ausführung von $row_testabfrage = mysql_fetch_assoc($testabfrage) ein Schussligkeitsfehler deinerseits oder gewollt?

        Ja

        if($testabfrage)
          {

        ##> >     $row_testabfrage = mysql_fetch_assoc($testabfrage);

        // ...
            while($row_testabfrage = mysql_fetch_assoc($testabfrage))
            {
              $_gesabfrage[] = $row_testabfrage;
            }
            // ...
          }

          
          
          
          
        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 :-)  
          
        ![](http://bitworks.de/~selfHTML/Virencheck.gif)