Chorus: Kann man DB-Results "ergänzen"?

Hallo,

kann ich einen Query-Result per PHP "ergänzen"?

Grund: Ich durchlaufe einmal die gefundenen Sätze, um eine XML-Datei zu erzeugen. Dann setze ich den Zeiger mit  mysql_data_seek zurück und durchlaufe die Sätze nochmal für die Anzeige.

Beim ersten Durchlauf prüfe ich, ob die URL, die im Satz angegeben ist, erreichbar ist. Das ist ziemlich zeitaufwändig mit

if ( $test_handle = @fopen( $row['url'], 'rb' ))

Diese Zeit möchte ich beim zweiten Durchlauf nicht nochmal verschwenden.

Dass ich ein PHP-Array einrichten kann, weiss ich.

Gruß, Chorus

  1. Hi,

    Dass ich ein PHP-Array einrichten kann, weiss ich.

    Na und warum tust du’s dann nicht …?

    Gleich im ersten Durchlauf des Result-Sets die Datensätze in ein Array packen – und dann gar nicht noch mal über’s Result, sondern beim zweiten Mal gleich über’s Array iterieren. (Dürfte unter normalen Umständen auch performanter sein.)

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hi,

      Dass ich ein PHP-Array einrichten kann, weiss ich.

      Na und warum tust du’s dann nicht …?

      Ich denke, der result **ist** bereits ein Array, weiss nur nicht, wie ich schreibend darauf zugreifen kann.

      Verständnisfrage:
      In einem anderen Fall ist die DB auf einem anderen Server. Wo befindet sich dann der result nach

      $result = mysql_query( $q, $conn_id );

      Noch auf dem Server der DB oder schon auf dem abfragenden Server?

      Gleich im ersten Durchlauf des Result-Sets die Datensätze in ein Array packen – und dann gar nicht noch mal über’s Result, sondern beim zweiten Mal gleich über’s Array iterieren. (Dürfte unter normalen Umständen auch performanter sein.)

      Früher galt die Regel, dass Zeiger bewegen schneller ist als Daten bewegen. Gut, ich muss die Daten beim zweiten Mal ja nochmal mit fetch_array holen ...

      Gruß, Chorus

      1. Tach!

        Dass ich ein PHP-Array einrichten kann, weiss ich.
        Na und warum tust du’s dann nicht …?
        Ich denke, der result **ist** bereits ein Array, weiss nur nicht, wie ich schreibend darauf zugreifen kann.

        Jeder Datensatz an sich ist ein Array, wenn du mit mysql_fetch_assoc() die Daten holst. Ansonsten ist die Ergebnismenge irgendwo in den Eingeweiden PHPs zwischengelagert. Darauf kannst du nicht direkt zugreifen, also ist es nicht wirklich wichtig, wie die Daten da abgelegt sind,

        Verständnisfrage:
        In einem anderen Fall ist die DB auf einem anderen Server. Wo befindet sich dann der result nach
        $result = mysql_query( $q, $conn_id );
        Noch auf dem Server der DB oder schon auf dem abfragenden Server?

        PHP holt bei mysql_query() - im Gegensatz zu mysql_unbuffered_query() - im Hintergrund bereits die Ergebnismenge ab und lagert sie wie gesagt zwischen. Fetchen greift auf diese Zwischenlagerung zu. Du kannst da jedenfalls nichts hinzufügen, sondern musst dir deine eigene Datenstruktur aufbauen, wenn du da Änderungen vornehmen willst.

        Gleich im ersten Durchlauf des Result-Sets die Datensätze in ein Array packen – und dann gar nicht noch mal über’s Result, sondern beim zweiten Mal gleich über’s Array iterieren. (Dürfte unter normalen Umständen auch performanter sein.)
        Früher galt die Regel, dass Zeiger bewegen schneller ist als Daten bewegen. Gut, ich muss die Daten beim zweiten Mal ja nochmal mit fetch_array holen ...

        Der mit PHP 5.3 hinzugekommene MySQL Native Driver behandelt den Zwischenpuffer cleverer, und zwar im PHP-Style. Solange an Daten keine Änderungen vorgenommen werden, werden diese bei Zuweisungen an andere Variablen nicht sofort kopiert. Stattdessen wird eine Art Referenz angelegt. Erst wenn die Daten geändert werden, werden sie wirklich dupliziert. Genauso arbeitet der MySQL ND. Fetchen bringt sozusagen unsichtbare Referenzen auf den Zwischenpuffer. Wenn man ein solches Fetch-Datensatz-Array in einem eigenen Array ablegt, dann wird intern ebenfalls zunächst nur eine Referenz erstellt - bis zur ersten Änderung.

        Es sollte sich also performancetechnisch wenig nehmen, ob du nochmal fetchen gehst oder die Daten "kopierst" und dann da durchläufst.

        dedlfix.