eddi: Seltsames verhalten von mysql

Hai,

mit PHP schreibe ich ständig in eine mysql Datenbanktabelle und lösche Einträge.
Wenn ich nun vor einem neuen Eintrag in der Tabelle eine Abfrage sende, ob der Eintrag schon vorhanden ist, um dann nur upzudaten statt neu anzulegen, bekomme ich oft (nicht immer!) einen Eintrag angezeigt, obwohl definitiv feststeht, dass der Eintrag eben gelöscht wurde.
Selbst, wenn ich vorher die gesamte Tabelle via phpMaAdmin geleert habe.

Ich bin mir auch "fast" sicher, dass das nur passiert, wenn ich die Abfrage mit dem IE sende während bei FF alles so läuft, wie es sein soll.

Kann sich irgendjemand den Effekt erklären?

Ich glaub langsam schon an Geister.

total frustrierter Gruß

  1. Hi,

    Wenn ich nun vor einem neuen Eintrag in der Tabelle eine Abfrage sende, ob der Eintrag schon vorhanden ist, um dann nur upzudaten statt neu anzulegen, bekomme ich oft (nicht immer!) einen Eintrag angezeigt, obwohl definitiv feststeht, dass der Eintrag eben gelöscht wurde.

    Kann sich irgendjemand den Effekt erklären?

    Caching?

    eine Abfrage sende, ob der Eintrag schon vorhanden ist, um dann nur upzudaten statt neu anzulegen

    Damit handelst du dir ohne Kapselung sowieso ein TOCTTOU-Problem ein.

    INSERT ... ON DUPLICATE KEY UPDATE oder REPLACE könnten helfen.

    MfG ChrisB

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

      Wäre auch mein erster Gedanke gewesen.

      INSERT ... ON DUPLICATE KEY UPDATE oder REPLACE könnten helfen.

      Mein 2. Gedanke.

      Und mein 3. Gedanke: Vorsicht, wenn Dein Festplattenpltz zur neige geht. Dann spinnt mysql manchmal.

      4. Gedanke: Bei mir spinnt mysql, wenn mein Laptop kurz vor dem Hitzetod steht immer komplett und macht nur noch Unsinn...

      Gruß, Kai

      1. an Caching dachte ich natürlich auch schon.
        Die Frage wär dann "was dagegen tun?".

        zu 3. und 4. Nöö, kann nicht sein. Der Fehler tritt sowohl auf meinem Produktionsserver sowie auch Online beim Hoster auf.

    2. INSERT ... ON DUPLICATE KEY UPDATE oder REPLACE könnten helfen.

      Wenn ich das richtig verstanden habe dann wäre das so:

      Angenommen ich habe  z.b. einen Warenkorb da steht drinne:

      Id = 10; UserId = 12; ArtikelId = 123; Menge = 5; NochnFlag = 'ja';

      Jetzt legt der User 12 den Artikel 3x dazu, wenn der Flag 'ja' ist.

      Statt

      SELECT * FROM warenkorb WHERE UserID = '12' AND ArtikelID = '123' AND NochnFlag = 'ja';

      Wenn der Eintrag vorhanden ist
      UPDATE warenkorb SET Menge = Menge+3 WHERE ID = '10;

      sonst

      INSERT INTO warenkorb SET usw.

      Was ja offensichtlich masnchmal in die Hose geht, jetzt:

      INSERT INTO warenkorb SET das ganze gedöns ON DUPLICATE KEY UPDATE menge= Menge+3;

      ÖÖÖHM, wo ist mein WHERE geblieben?

      So ganz raff ich das noch nicht :o(

      1. ÖÖÖHM, wo ist mein WHERE geblieben?

        So ganz raff ich das noch nicht :o(

        An der Stelle wird kein vollständiges UPDATE-Statement mehr benötigt.
        Das where kann ja deshalb schon fehlen, weil die bedingung doch bereits bekannt ist (durch den gesetzten Index).

        Kai

        1. An der Stelle wird kein vollständiges UPDATE-Statement mehr benötigt.
          Das where kann ja deshalb schon fehlen, weil die bedingung doch bereits bekannt ist (durch den gesetzten Index).

          OK soweit klar.
          Und ich dachte schon ich spinn total....

          Nur der Vollständigkeit halber:
          Wenn ich aber z.B. an einer anderen Stelle des Projektes auf 4 Felder nen Index brauchen würde, der mir hier in die Suppe spuckt, dann hätt ich n Problem.

          1. Nur der Vollständigkeit halber:
            Wenn ich aber z.B. an einer anderen Stelle des Projektes auf 4 Felder nen Index brauchen würde, der mir hier in die Suppe spuckt, dann hätt ich n Problem.

            Nöö, du kannst beliebig viele Indexe haben.
            ON DUPLICATE KEY ...
            bezieht sich nur auf UNIQUE Keys.

            Gast

      2. hi,

        INSERT INTO warenkorb SET das ganze gedöns ON DUPLICATE KEY UPDATE menge= Menge+3;

        ÖÖÖHM, wo ist mein WHERE geblieben?

        Im Design.

        So ganz raff ich das noch nicht :o(

        Ein 'INSERT ... ON DUPLICATE KEY UPDATE...' will wissen, wann der Fall 'Duplicate Key' eintritt, das musst Du nur festlegen und dann funktioniert das alles wie von Geisterhand ;)

        Hotti

        1. Ein 'INSERT ... ON DUPLICATE KEY UPDATE...' will wissen, wann der Fall 'Duplicate Key' eintritt, das musst Du nur festlegen und dann funktioniert das alles wie von Geisterhand ;)

          So wird er das nicht verstehen.Du benötigst im Design Deiner Tabelle einen (ggf. auch kombinierten) Indexeintrag.

          kai

          1. Ein 'INSERT ... ON DUPLICATE KEY UPDATE...' will wissen, wann der Fall 'Duplicate Key' eintritt, das musst Du nur festlegen und dann funktioniert das alles wie von Geisterhand ;)

            So wird er das nicht verstehen.Du benötigst im Design Deiner Tabelle einen (ggf. auch kombinierten) Indexeintrag.

            Achso, Du meinst dann ein Statement '... on duplicate index...' oder so. Das kannte ich noch nicht ;)

            Hotti

            --
            Gänsekeule, Rezept für 10 Personen: Man nehme 5 Gänse...
  2. Wenn ich nun vor einem neuen Eintrag in der Tabelle eine Abfrage sende, ob der Eintrag schon vorhanden ist, um dann nur upzudaten statt neu anzulegen, bekomme ich oft (nicht immer!) einen Eintrag angezeigt, obwohl definitiv feststeht, dass der Eintrag eben gelöscht wurde.
    Selbst, wenn ich vorher die gesamte Tabelle via phpMaAdmin geleert habe.

    Nochmal ich.
    Ich hatte solch einen Effekt auch mal, bis ich merkte, dass ich parallel auf 2 Datenbanken arbeitete und dort löschte und einfügte.
    Stell also sicher, dass Du nur in einer einzigen DB und Tabelle arbeitest.

    Kai