Andy A.: Datensätz werden zu spät gelöscht

Hi,

ich habe folgende schleife:

$result = mysql_query("SELECT * FROM s_timer WHERE U_id=$useid");
while($row = mysql_fetch_array($result)){
    $tid=$row['T_id'];
// Verarbeitung
    $resultd = mysql_query("Delete FROM s_timer where T_id=$tid");
}

Nun sind bzw. 3 Datensätze mit der U_id=$userid in der Datenbank.
Allerdings wird die schleife manchmal 6mal ausgeführt.

Kann sein, dass MySQL den Datensatz erst zu spät löscht?
Oder hab ich da irgendeinen technischen Fehler.

Andy

  1. Hallo Andy!

    $result = mysql_query("SELECT * FROM s_timer WHERE U_id=$useid");

    Hier schreib doch besser "SELECT T_id FROM", wenn Du nur T_id brauchst ;)

    Nun sind bzw. 3 Datensätze mit der U_id=$userid in der Datenbank.
    Allerdings wird die schleife manchmal 6mal ausgeführt.

    Laß Dir doch erstmal das Ergebnis von $result ausgeben, und bau noch weitere Debug-Ausgaben rein, daß Du immer genau siehst, was MySQL Dir zurückgibt.

    Kann sein, dass MySQL den Datensatz erst zu spät löscht?

    Weiß ich nicht, aber ich kann es mir nicht vorstellen, und vor allem inwiefern "zu spät"?
    Deine Lösch-Statements werden ja genau so oft ausgeführt, wie die erste Abfrage Ergebnisse hat.

    MfG
    Götz

    --
    Losung für Freitag, 23. April 2004
    Friede, Friede denen in der Ferne und denen in der Nähe, spricht der Herr; ich will sie heilen. (Jesaja 57,19)
    Den Frieden lasse ich euch, meinen Frieden gebe ich euch. Nicht gebe ich euch, wie die Welt gibt. Euer Herz erschrecke nicht und fürchte sich nicht. (Johannes 14,27)
    (http://www.losungen.de/heute.php3)
    1. Hallo Götz!

      $result = mysql_query("SELECT * FROM s_timer WHERE U_id=$useid");

      Hier schreib doch besser "SELECT T_id FROM", wenn Du nur T_id brauchst ;)

      Ich brauch schon noch mehr, aber ich wollte hier nicht zuviel Code hier posten.

      Nun sind bzw. 3 Datensätze mit der U_id=$userid in der Datenbank.
      Allerdings wird die schleife manchmal 6mal ausgeführt.

      Laß Dir doch erstmal das Ergebnis von $result ausgeben, und bau noch weitere Debug-Ausgaben rein, daß Du immer genau siehst, was MySQL Dir zurückgibt.

      Kann sein, dass MySQL den Datensatz erst zu spät löscht?

      Weiß ich nicht, aber ich kann es mir nicht vorstellen, und vor allem inwiefern "zu spät"?
      Deine Lösch-Statements werden ja genau so oft ausgeführt, wie die erste Abfrage Ergebnisse hat.

      Das hab ich mir eigentlich auch gedacht!
      Aber warum wird die dann manchmal 6 mal ausgeführt, obwohl nur 3 Datensätze da sind?

      Anwendung:
      Wenn die Timer in einem kurzen Zeitabstand >1s sind gehts wunderbar, nur in dieser while Schleife nicht.

      Andy

      1. Hallo auch nochmal,

        $result = mysql_query("SELECT * FROM s_timer WHERE U_id=$useid");

        Hier schreib doch besser "SELECT T_id FROM", wenn Du nur T_id brauchst ;)

        Ich brauch schon noch mehr, aber ich wollte hier nicht zuviel Code hier posten.

        SELECT * macht man trotzdem nicht ;-)

        Uli

        1. hallo,

          SELECT * macht man trotzdem nicht ;-)

          warum nicht?

          gruss

          --
          no strict;
          no warnings;
          Über eine Rückmeldung freut sich später jeder, der das gleiche Problem hat und im Archiv nach einer Lösung sucht.
          1. Hallo Eternius,

            SELECT * macht man trotzdem nicht ;-)
            warum nicht?

            lies mal http://dclp-faq.de/q/q-sql-select.html

            Grüße aus Nürnberg
            Tobias

            --
            Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
            1. Hallo!

              Ich brauche aber ALLE Spalten!!!
              Warum darf ich das dann nicht machen?
              Es wird sich auch an der Tabelle nichts ändern!

              Außerdem war meine Frage anders gestellt!

              Andy

              1. Hallo Andy,

                Ich brauche aber ALLE Spalten!!!

                dann gebe alle Spalten an.

                Es wird sich auch an der Tabelle nichts ändern!

                vielleicht ändert sich in einem halben Jahr o.ä. doch mal was?

                Außerdem war meine Frage anders gestellt!

                ich habe ja auch nicht dir geantwortet, sondern Eternius :-)

                Grüße aus Nürnberg
                Tobias

                --
                Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
    2. Hi,

      Hallo Andy!

      $result = mysql_query("SELECT * FROM s_timer WHERE U_id=$useid");

      Hier schreib doch besser "SELECT T_id FROM", wenn Du nur T_id brauchst ;)

      noch besser:
      SELECT DISTINCT T_id FROM  - denn jede id wird ja nur einmal gebraucht.

      Und statt der Schleife zum Löschen würde ich dann eher ein einziges

      DELETE FROM s_timer WHERE  T_id IN (...)

      benutzen - vorher natürlich aus den einzelnen T_id einen kommagetrennten String machen und an die mit ... markierte Stelle einsetzen.

      cu,
      Andreas

      --
      MudGuard? Siehe http://www.Mud-Guard.de/
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. Denkfehler....

    »»$result = mysql_query("SELECT * FROM s_timer WHERE U_id=$useid");
    So wenn der USer 6 mal in der Datenbank war wird die Abfrage untendran auch 6 mal ausgeführt

    $tid=$row['T_id'];
    // Verarbeitung
        $resultd = mysql_query("Delete FROM s_timer where T_id=$tid");

    Da While kannste eliminieren, da sowieso bei dem einen Mal alle Datensätze gelöscht werden

    Gruss Uli

    1. Hi

      Denkfehler....

      Was für einer?

      »»$result = mysql_query("SELECT * FROM s_timer WHERE U_id=$useid");
      So wenn der USer 6 mal in der Datenbank war wird die Abfrage untendran auch 6 mal ausgeführt

      Schon klar! Aber er steht ja nur 3mal drin!

      $tid=$row['T_id'];
      // Verarbeitung
          $resultd = mysql_query("Delete FROM s_timer where T_id=$tid");

      Da While kannste eliminieren, da sowieso bei dem einen Mal alle Datensätze gelöscht werden

      Wieso? Ich muss doch immer einen Datensetz nach dem anderen abarbeiten.

      Andy

      1. Hallo Andy A.,

        Da While kannste eliminieren, da sowieso bei dem einen Mal alle Datensätze gelöscht werden
        Wieso? Ich muss doch immer einen Datensetz nach dem anderen abarbeiten.

        Nein, musst Du nicht. Der Delete-Befehl löscht _alle_ Datensätze, auf die die Bedingung zutrifft.

        Grüße
        Andreas

        --
        "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."
        (Rich Cook)
  3. Hi,

    sobald ich das hier schreibe geht's!
    $tid=0;
    $result = mysql_query("SELECT * FROM s_timer WHERE U_id=$useid and T_id<>$tid");
                                                                  ^^^^^^^^^^^^^^^^
    while($row = mysql_fetch_array($result)){
        $tid=$row['T_id'];
    // Verarbeitung
        $resultd = mysql_query("Delete FROM s_timer where T_id=$tid");
    }

    Andy