Datensätze löschen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datensätze löschen

    Hallo,

    wie lösche ich Datensätze, die länger als 14 Tage schon in der Datenbank sind?

    Gruss
    Zocker

  • #2
    du brauchst ein datumsfeld in der tabelle und das kannst du in der DELETE-query im WHERE-teil verarbeiten.

    tipp: siehe auch INTERVAL und NOW() im mysql-manual.
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Also, ich habe das jetzt wie folgt gemacht:

      $anmeldedatum: 2003-08-26 17:02:03;

      mysql_query("DELETE FROM dhs_branchenbuch_normaleintrag WHERE status = 'nicht aktiviert' AND $anmeldedatum > DATE_SUB(now(), INTERVAL 1 day)");

      Ich möchte, nach einem Tag den Datensatz wieder löschen. Ich habe das mal lokal getestet, in dem ich in der Systemsteuerung das Datum manuell verändert habe. Aber der Datensatz wird nicht gelöscht. Wieso? Liegt es vielleicht an der Varianle $anmeldedatum? Muss es noch formatiert werden?

      Gruss
      Zocker

      Kommentar


      • #4
        das anmeldedatum muss kleiner sein.
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          Wie jetzt kleiner? Könntest du dich bitte etwas genauer ausdrücken?

          Danke!

          Kommentar


          • #6
            Original geschrieben von Zocker
            Also, ich habe das jetzt wie folgt gemacht:

            $anmeldedatum: 2003-08-26 17:02:03;

            mysql_query("DELETE FROM dhs_branchenbuch_normaleintrag WHERE status = 'nicht aktiviert' AND $anmeldedatum > DATE_SUB(now(), INTERVAL 1 day)");
            Das wird nicht funzen! In der Datenbank steht doch gar nicht wann der Eintrag da gelandet ist. Du vergleichst doch bloss $anmeldedatum mit dem heutigen Datum und beziehst dich nicht auf den Datensatz.
            Wenn im Datensatz stehen würde, wann er erzeugt wurde, wäre die Sache schon geritzt. Am einfachsten geht das, in dem Du in den Datensatz ein einen TIMESTAMP einfügst. Der TIMESTAMP wird bei jeder Aktualisierung des Datensatzes auf die aktuelle Zeit gesetzt.

            TIMESTAMP[(M)]

            A timestamp. The range is '1970-01-01 00:00:00' to sometime in the year 2037. MySQL displays TIMESTAMP values in YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD, or YYMMDD format, depending on whether M is 14 (or missing), 12, 8, or 6, but allows you to assign values to TIMESTAMP columns using either strings or numbers. A TIMESTAMP column is useful for recording the date and time of an INSERT or UPDATE operation because it is automatically set to the date and time of the most recent operation if you don't give it a value yourself. You can also set it to the current date and time by assigning it a NULL value. See Date and time types.

            A TIMESTAMP is always stored in 4 bytes. The M argument only affects how the TIMESTAMP column is displayed.

            Note that TIMESTAMP(X) columns where X is 8 or 14 are reported to be numbers while other TIMESTAMP(X) columns are reported to be strings. This is just to ensure that one can reliably dump and restore the table with these types! See DATETIME.
            So, jetzt brauchst Du nur folgendes zu machen:

            Tabelle um eine Spalte zeit mit dem Typ TIMESTAMP ergänzen und dann
            mysql_query("DELETE FROM dhs_branchenbuch_normaleintrag WHERE status = 'nicht aktiviert' AND zeit < DATE_SUB(now(), INTERVAL 14 day)");

            Die Sache mit dem DATE_SUB(now... habe ich noch nie benutzt. Ich würde PHP-Funktionen nutzen, um das Vergleichsdatum zu errechnen.

            Ich selber benutzte die TIMESTAMP-Geschichte nicht. Ich speichere 'von Hand' in jeden Datensatz den Unix-Timestamp $zeit = time(); und vergleiche dann mit der aktuellen Zeit.

            Naja, viele Wege führen nach Rom.

            ciao
            Christoph
            Ich denke, also bin ich.
            Manche sind trotzdem!

            Kommentar


            • #7
              Original geschrieben von Zocker
              Wie jetzt kleiner? Könntest du dich bitte etwas genauer ausdrücken?
              mit deiner query löschst du alles, was neuer ist, als das abgezogene datum. du willst aber alles löschen, was älter ist.
              also musst du < statt > nehmen.


              Original geschrieben von cst
              Das wird nicht funzen! In der Datenbank steht doch gar nicht wann der Eintrag da gelandet ist. Du vergleichst doch bloss $anmeldedatum mit dem heutigen Datum und beziehst dich nicht auf den Datensatz.
              das anmeldedatum ist durchaus das feld, was er nutzen will. und auf einen datensatz braucht er sich nicht beziehen, da er ALLE daten löschen will. wozu also ein WHERE dabei?

              Original geschrieben von cst
              Die Sache mit dem DATE_SUB(now... habe ich noch nie benutzt. Ich würde PHP-Funktionen nutzen, um das Vergleichsdatum zu errechnen.
              sehr umständlich. die db kann schon viele sachen machen, wodurch dein php-code deutlich weniger wird.

              Original geschrieben von cst
              Ich selber benutzte die TIMESTAMP-Geschichte nicht. Ich speichere 'von Hand' in jeden Datensatz den Unix-Timestamp $zeit = time(); und vergleiche dann mit der aktuellen Zeit.
              dann solltest du dich mal umgewöhnen. es nützt was, wenn du die DB-funktionen auch dafür verwendest.

              Original geschrieben von cst
              Naja, viele Wege führen nach Rom.
              das stimmt. die einen einfach und die anderen kompliziert. zu letzterem würde ich deinen ansatz zählen.

              @cst
              nimms nicht negativ auf. es soll die eine hilfe sein.
              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


              Kommentar


              • #8
                Es klappt immer noch nicht. Ich habe folgende Abfrage:

                mysql_query("DELETE FROM dhs_branchenbuch_normaleintrag WHERE status = 'nicht aktiviert' AND time < DATE_SUB(now(), INTERVAL 1 day)");

                Den Test habe ich lokal durchgeführt. Nach dem ich die Daten in die Datenbank eingetragen habe, habe ich das Datum um 2 Tage verändert. Aber der Datensatz befindet sich immer noch in der Datenbank.


                Gruss
                Zocker

                Kommentar


                • #9
                  1. ist time ein reserviertes wort, wenn ich mich nicht irre.

                  2. was ist mit DEINER ursprünglichen abfrage passiert? dort hättest du nur > gegen < tauschen brauchen.
                  INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                  Kommentar


                  • #10
                    Poste mal die Tabellenstruktur (einfach aus phpmyadmin exportieren), dann haben wir bessere Chancen. So reden wir nur aneinander vorbei.

                    cu
                    Christoph
                    Ich denke, also bin ich.
                    Manche sind trotzdem!

                    Kommentar


                    • #11
                      Alles in Ordnung. Jetzt klappt es wunderbar. Hatte einen kleinen Fehler in einer meiner vorhergehenden Abfragen-

                      Vielen Dank für eure Hilfe.

                      Kommentar

                      Lädt...
                      X