Worrel: SQL - Resultate mehrmals durchlaufen ?

Hallo,
Ich möchte das Ergabnis einer SQL-Abfrage mehrmals durchlaufen und habe dazu folgendes Konstrukt in PHP erdacht (welch Wortwahl!) :

$sql = "select * from liste where artnr = $artnr";
    $result = odbc_exec($conn, $sql);
    odbc_fetch_row($result);

while (odbc_fetch_row($result)) {
        ... ;
    }

odbc_fetch_row($result, 0);
    do {
        ... ;
    }
    while (odbc_fetch_row($result));

Jedoch durchläuft der Rechner nur die erste Zeile der zweiten Schleife.
Wie kann ich es erreichen, daß er die zweite Schleife durchläuft ?

Thx for help,
Worrel

  1. Hallo,

    Ich möchte das Ergabnis einer SQL-Abfrage mehrmals durchlaufen und habe dazu folgendes Konstrukt in PHP erdacht (welch Wortwahl!) :

    $sql = "select * from liste where artnr = $artnr";
        $result = odbc_exec($conn, $sql);
        odbc_fetch_row($result);

    // --------------------------------------------------------
    // warum willst Du denn die Ergebnisse wegschmeißen?

    while ($Satz = odbc_fetch_row($result))
    {
      Satzauswerten($satz, 1);
    }
    reset($result);

    //und dann das ganze nochmal

    while ($Satz = odbc_fetch_row($result))
    {
      Satzauswerten($satz, 2);
    }
    reset($result);

    // das kannst Du so oft wiederholen, bis der Strom ausfällt

    // -------------------------------------------

    while (odbc_fetch_row($result)) {
            ... ;
        }

    das hier unten muss ne Fehlermeldung geben!

    odbc_fetch_row($result, 0);

    do {
            ... ;
        }
        while (odbc_fetch_row($result));

    Jedoch durchläuft der Rechner nur die erste Zeile der zweiten Schleife.
    Wie kann ich es erreichen, daß er die zweite Schleife durchläuft ?

    Du musst den Array-Datensatzzeiger auf den Anfang zurücksetzen.

    Gruß

    Tom

    1. Hi,
      danke für die Antwort.
      Diese Zeile:

      odbc_fetch_row($result);

      gehört da nicht hin, die hab ich aus Versehen mitkopiert (Schande über mein Haupt ...)

      reset($result);

      Das hab ich gesucht. Danke !

      // das kannst Du so oft wiederholen, bis der Strom ausfällt

      Das wird aber auf die Dauer auch langweilig ... ;-)

      das hier unten muss ne Fehlermeldung geben!

      odbc_fetch_row($result, 0);

      do {
              ... ;
          }
          while (odbc_fetch_row($result));

      Äh, nö. Es passiert nach dem 'odbc_fetch_row($result, 0);' halt nichts mehr ...
      Welche Fehlermeldung sollte denn kommen ?

      rya,
      Worrel

      1. Hi,
        jetzt hab ich eine Fehlermeldung

        Variable passed to reset() is not an array or object

        bei der Zeile

        reset($result);

        da $result das Ergebnis einer SQL-Abfrage ist. Gibt es dafür auch eine Möglichkeit, den Zeiger zurückzusetzen ?

        rya,
         Worrel

        1. Hi,
          jetzt hab ich eine Fehlermeldung

          Variable passed to reset() is not an array or object

          bei der Zeile

          reset($result);

          da $result das Ergebnis einer SQL-Abfrage ist. Gibt es dafür auch eine Möglichkeit, den Zeiger zurückzusetzen ?

          rya,
          Worrel

          anstatt row versuch mal einen array
          also
          odbc_fetch_array
          dann hast du deinen array.

          1. Moin!

            jetzt hab ich eine Fehlermeldung

            Variable passed to reset() is not an array or object

            bei der Zeile

            reset($result);

            da $result das Ergebnis einer SQL-Abfrage ist. Gibt es dafür auch eine Möglichkeit, den Zeiger zurückzusetzen ?

            anstatt row versuch mal einen array
            also
            odbc_fetch_array
            dann hast du deinen array.

            Das Problem liegt tiefer: reset() setzt den PHP-internen Zeiger eines Arrays zurück auf den Anfang, aber nicht den Datenquellenzeiger einer Datenbankabfrage - deshalb klappt reset() hier nicht.

            Besser wäre doch, eine Datenbankfunktion zu nehmen:

            mysql_field_seek()
            msql_field_seek()
            mssql_field_seek()
            sybase_field_seek()

            Das einzige, was fehlt, ist odbc_field_seek - vermutlich, weil man diese Funktion mit ODBC nicht benutzen kann, weil es keine allgemeine Datenbankfunktion ist. Und so bleiben nur zwei Möglichkeiten: Entweder die Ergebnisse der Datenbankabfrage beim ersten Mal gleich in ein Array einlesen und beim zweiten Mal darauf zugreifen, oder zweimal die Datenbank abfragen.

            - Sven Rautenberg

            1. Hi,
              danke für die Antworten.
              @Norx:
              Ich wollte eigentlich gar kein Array verwenden, ich wollte nur eine SQL-Abfrage zweimal verwenden.

              Ich werde erstmal folgendes verwenden :

              $sql = "select * from liste where artnr = $artnr";
                 $result = odbc_exec($conn, $sql);

              while (odbc_fetch_row($result)) {
                     ... ;
                 }
                 $result = odbc_exec($conn, $sql);

              while (odbc_fetch_row($result)) {
                     ... ;
                 }

              rya,
              Worrel