[PHP/MySQL] Oude records verwijderen

Pagina: 1
Acties:
  • 139 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • _Eric_
  • Registratie: Februari 2006
  • Laatst online: 27-08 15:58
Besten,

Ik ben bezig met een PHP/MySQL webproject waarbij ik het volgende probleem ben tegengekomen. In een MySQL tabel wil ik alle records die ouder zijn dan een uur verwijderen:

code:
1
2
3
4
5
6
7
8
9
10
11
$query = "SELECT id,
                 birth
          FROM docs";
$result = mysql_query($query);

while (list($id, $birth) = mysql_fetch_row($result)) {
    if (date("YmdHis") - $birth > 3600) {
        $query = "DELETE FROM docs WHERE id='$id'";
        $result = mysql_query($query);
    }
}


'birth' bevat in de records het tijdstip waarop die record is aangemaakt (ook in 'YmdHis' formaat). Het lijkt allemaal te werken, behalve dat ik elke keer wanneer er een oude record gewist wordt de volgende foutmelding krijg:
mysql_fetch_row(): supplied argument is not a valid MySQL result resource
Kan iemand mij in de goeie richting wijzen om deze foutmelding te verhelpen? Bedankt!

Acties:
  • 0 Henk 'm!

  • 2xdehelft
  • Registratie: November 2004
  • Laatst online: 18-09 22:10
SQL:
1
DELETE FROM docs WHERE birth<date("YmdHis")-3600
?

Snap niet helemaal waarom je eerst een select uitvoerd.

[ Voor 30% gewijzigd door 2xdehelft op 15-08-2007 13:39 ]


Acties:
  • 0 Henk 'm!

  • Rigi
  • Registratie: September 2001
  • Laatst online: 30-11-2018
Waarom niet gewoon deleten op basis van die birth dan?
code:
1
2
$date = date("YmdHis")-3600;
'DELETE FROM docs WHERE birth < $date';


en een delete query geeft niet zo gek veel result, dus ik gok dat die foutmelding komt van regel 9?

Acties:
  • 0 Henk 'm!

  • _Eric_
  • Registratie: Februari 2006
  • Laatst online: 27-08 15:58
Ah ok, dus zo kan het ook... Hier steekt mijn onervarenheid met MySQL weer de kop op. Super mooie oplossingen, bedankt!

[ Voor 3% gewijzigd door _Eric_ op 15-08-2007 13:50 ]


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

Inderdaad is je aanpak nogal vreemd en je wijst $result opnieuw toe binnen de while-loop 8)7

Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Nu online

remco_k

een cassettebandje was genoeg

tiktak2 schreef op woensdag 15 augustus 2007 @ 13:34:
'mysql_fetch_row(): supplied argument is not a valid MySQL result resource'
die is niet zo vreemd hoor:
Kijk eens goed naar je code.
PHP:
1
2
3
4
5
6
7
$result = mysql_query($query);
while (list($id, $birth) = mysql_fetch_row($result)) {
    if (date("YmdHis") - $birth > 3600) {
        $query = "DELETE FROM docs WHERE id='$id'";
        $result= mysql_query($query);
    }
}
In de while lus verander je $result voor een andere resultset (eentje die leeg is in dit geval).
Het is dus niet raar dat mysql_fetch_row($result) daardoor een error geeft.

Voor de rest: zie voorgaande opmerkingen.

/spuit11 :'(

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Rigi schreef op woensdag 15 augustus 2007 @ 13:40:
Waarom niet gewoon deleten op basis van die birth dan?
code:
1
2
$date = date("YmdHis")-3600;
'DELETE FROM docs WHERE birth < $date';
Zou er dan dit van maken:

SQL:
1
DELETE FROM docs WHERE birth < NOW() - INTERVAL 1 HOUR;


MySQL heeft prachtive datumfuncties, vind het altijd zo jammer als mensen er geen gebruik van maken :+

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

FragFrog schreef op woensdag 15 augustus 2007 @ 14:08:
[...]


Zou er dan dit van maken:

SQL:
1
DELETE FROM docs WHERE birth < NOW() - INTERVAL 1 HOUR;


MySQL heeft prachtive datumfuncties, vind het altijd zo jammer als mensen er geen gebruik van maken :+
Maar is het ook werkelijk significant sneller om het tijdsverschil door MySQL zelf ipv PHP uit te laten rekenen?

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:07

TeeDee

CQB 241

Verwijderd schreef op woensdag 15 augustus 2007 @ 14:11:
[...]

Maar is het ook werkelijk significant sneller om het tijdsverschil door MySQL zelf ipv PHP uit te laten rekenen?
Een klein stukje puristisch gebruik van je tools kan geen kwaad natuurlijk ;)

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Significant sneller? Nee. Netter en leesbaarder? In mijn opinie een heel stuk :)

Let wel, het gaat hier om 1 uur. Stel je dat 3 uur wilt bijvoorbeeld dan komt daar al een heel raar getal uit. Bovendien kun je nu alsnog de tijdseenheid dynamisch erin gooien, en dan kun je prettig in je configuratie iets zetten als $max_age = '3 HOURS'; in plaats van $max_age = '10800'; - persoonlijk vind ik dat toch wat fijner lezen ;)

[ Voor 68% gewijzigd door FragFrog op 15-08-2007 15:12 . Reden: Nulletje teveel, details :P ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Nu online

remco_k

een cassettebandje was genoeg

FragFrog schreef op woensdag 15 augustus 2007 @ 14:16:
Significant sneller? Nee. Netter en leesbaarder? In mijn opinie een heel stuk :)

Let wel, het gaat hier om 1 uur. Stel je dat 3 uur wilt bijvoorbeeld dan komt daar al een heel raar getal uit. Bovendien kun je nu alsnog de tijdseenheid dynamisch erin gooien, en dan kun je prettig in je configuratie iets zetten als $max_age = '3 HOURS'; in plaats van $max_age = '108000'; - persoonlijk vind ik dat toch wat fijner lezen ;)
Ik zou toch inderdaad $max_age = '108000'; voor 3 uur kiezen. :+

@hieronder:
Waarom zitten jullie mij verkeerd te quoten? :P

[ Voor 5% gewijzigd door remco_k op 15-08-2007 14:59 . Reden: typo ]

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 21:01
Ik 10800

Acties:
  • 0 Henk 'm!

  • rob_erwt
  • Registratie: Juni 2004
  • Laatst online: 17:39

rob_erwt

What does this button do?

remco_k schreef op woensdag 15 augustus 2007 @ 14:46:
[...]

Ik zou toch liever $max_age = '180000'; voor 3 uur kiezen. :+
3 x 60 x 60 = toch 10800... ;)

Never underestimate the power of stupid people in large groups


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
En opnieuw wordt bewezen waarom '3 HOURS' zo z'n voordelen heeft.. :+

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
Rigi schreef op woensdag 15 augustus 2007 @ 13:40:
Waarom niet gewoon deleten op basis van die birth dan?
code:
1
2
$date = date("YmdHis")-3600;
'DELETE FROM docs WHERE birth < $date';


en een delete query geeft niet zo gek veel result, dus ik gok dat die foutmelding komt van regel 9?
echt... date(YmdHis).. nooit van unix timestamp gehoord ? Gaat toch veel makkelijker..

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


Acties:
  • 0 Henk 'm!

Verwijderd

FragFrog schreef op woensdag 15 augustus 2007 @ 15:12:
En opnieuw wordt bewezen waarom '3 HOURS' zo z'n voordelen heeft.. :+
Dat is alleen voor simpele zielen die de tafel van 36 niet kennen :P.

Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50

BikkelZ

CMD+Z

FragFrog schreef op woensdag 15 augustus 2007 @ 14:16:
Significant sneller? Nee. Netter en leesbaarder? In mijn opinie een heel stuk :)

Let wel, het gaat hier om 1 uur. Stel je dat 3 uur wilt bijvoorbeeld dan komt daar al een heel raar getal uit. Bovendien kun je nu alsnog de tijdseenheid dynamisch erin gooien, en dan kun je prettig in je configuratie iets zetten als $max_age = '3 HOURS'; in plaats van $max_age = '10800'; - persoonlijk vind ik dat toch wat fijner lezen ;)
Niet alleen dat, maar je moet altijd uit gaan van de tijd van de database, en niet die je in PHP hebt, welke niet altijd persé het zelfde is. Stel dat je MySQL server per ongeluk een dag achter loopt, dan worden dus alle records gedelete die je net geinsert hebt in plaats van de oude data. Tenzij je expliciet ook altijd je timestamps etcetera via PHP eerst genereert, en dus niet van automatische functies of NOW() gebruik maakt bij inserts en updates.

iOS developer

Pagina: 1