records verwijderen na 7 dagen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Senior, Medior and Junior SAP HANA Developer

Vacature details Vakgebied: Software/IT Opleiding: Medior Werklocatie: Veldhoven Vacature ID: 12696 Introductie Our client is the world's leading provider of lithography systems for the semiconductor industry, manufacturing complex machines that are critical to the production of integrated circuits or chips. Our purpose is “unlocking the potential of people and society by pushing technology to new limits”. We do this guided by the principles “Challenge”, “Collaborate” and “Care”. Wat verwachten we van jou? SAP Certified Application Associate - SAP HANA Cloud Modeling (training and/or certification) Bachelor degree or higher Excellent understanding of SAP HANA (2.0 / Cloud), Data Modelling and writing

Bekijk vacature »

Martijn K

Martijn K

25/11/2015 07:30:37
Quote Anchor link
Hallo,
Ik wil in een sql tabel records verwijderen die ouder zijn dan 7 dagen. Het script wat ik er voor heb gemaakt werkt op zich wel maar het gaat heel traag en het lijkt heel veel te vragen van de server. Volgens mij moet het veel makkelijker kunnen.
Hieronder de code die ik heb gemaakt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$result
= mysqli_query($dbCon,"SELECT
    *
    FROM
    test"
);


while ($row = mysqli_fetch_array($result)){
$id = $row['ID'];
$ivdatum = $row['tijd'];
$ooit = strtotime($ivdatum);
$nu   = strtotime('now');
    
$difference =($nu-$ooit) ;

$aantal_dagen = ceil($difference/86400);


          
if ($aantal_dagen>=7){
$ouderecords="DELETE FROM test WHERE ID='$id'";
if (!mysqli_query($dbCon,$ouderecords)) {
  die('Error: ' . mysqli_error($dbCon));
 mysqli_close($dbCon);
 }
 }
}

?>
Gewijzigd op 25/11/2015 07:31:17 door Martijn K
 
PHP hulp

PHP hulp

16/11/2024 12:33:44
 
Jan R

Jan R

25/11/2015 07:37:05
Quote Anchor link
Zonder lus werken
delete FROM test WHERE tijd<curdate()-7
 
Martijn K

Martijn K

25/11/2015 07:38:51
Quote Anchor link
Hoi Jan R

Sorry, maar hoe zet ik dat in php?
 
Peter K

Peter K

25/11/2015 07:46:23
Quote Anchor link
Martijn K op 25/11/2015 07:38:51:
Hoi Jan R

Sorry, maar hoe zet ik dat in php?


Precies zoals hij het zegt.
Je moet je DELETE query aanpassen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$query = mysqli_query("DELETE FROM `test` WHERE `tijd` <= hier je voorwaarde plaatsen");


Dit zou al voldoende zijn.


Probeer eerst eens een SELECT te doen op je database waar je in je query alleen de regels ophaalt die je wilt verwijderen. Dan kun je deze later omzetten naar een DELETE statement.
Gewijzigd op 25/11/2015 07:47:52 door Peter K
 
Martijn K

Martijn K

25/11/2015 08:09:23
Quote Anchor link
OK thanks!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

25/11/2015 13:29:56
Quote Anchor link
Jan R op 25/11/2015 07:37:05:
Zonder lus werken
delete FROM test WHERE tijd<curdate()-7

Dat gaat niet werken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
> SELECT CAST('2015-12-01' AS DATE) - 7 wrong,
         CAST('2015-12-01' AS DATE) - INTERVAL 7 DAY correct

+ ---------- + ------------ +
| wrong      | correct      |
+ ---------- + ------------ +
| 20151194   | 2015-11-24   |
+ ---------- + ------------ +
Gewijzigd op 25/11/2015 13:31:42 door Ger van Steenderen
 
Jan R

Jan R

25/11/2015 13:38:33
Quote Anchor link
Ger van Steenderen op 25/11/2015 13:29:56:
Jan R op 25/11/2015 07:37:05:
Zonder lus werken
delete FROM test WHERE tijd<curdate()-7

Dat gaat niet werken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
> SELECT CAST('2015-12-01' AS DATE) - 7 wrong,
         CAST('2015-12-01' AS DATE) - INTERVAL 7 DAY correct

+ ---------- + ------------ +
| wrong      | correct      |
+ ---------- + ------------ +
| 20151194   | 2015-11-24   |
+ ---------- + ------------ +



Bij mij werkt het wel :)
Maar het is inderdaad beter zoals jij het schrijft
 
Thomas van den Heuvel

Thomas van den Heuvel

25/11/2015 17:29:36
Quote Anchor link
@Martijn

Mogelijk is een andere "optimalisatie" op zijn plaats, maar je vertelt niets over:
- het type data
- het gebruik
- de groei van de tabel over tijd

Je zegt "het gaat heel traag en het lijkt heel veel te vragen van de server". Waar blijkt dit uit en wat is de oorzaak daarvan? Dat is hetgene wat je zou moeten oplossen.

Dan gooi je de data ook echt weg. Weet je zeker dat je deze niet op een gegeven moment nodig hebt, bijvoorbeeld om statistieken te verzamelen ofzo? Je zou bijvoorbeeld kunnen overwegen om een extra kolom aan te maken ("deleted" of "active" ofzo) met een index hierop, zodat je enkel relevante/actieve data uit je tabel kunt selecteren als je deze nodig hebt. Maar goed, dit advies kan niet met goed fatsoen gegeven worden als je niets vertelt over de tabel...

Met het weggooien van data los je het probleem niet op, je gaat het enkel uit de weg, en daarmee gooi je (potentieel) een kind met het waswater weg.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

25/11/2015 18:00:53
Quote Anchor link
@Jan
Zoals je in het voorbeeld kan zien zet MySQL de datum om naar een integer als je er een integer vanaf trekt.
Als je die dan gaat vergelijken met een datum zet MySQL ook die datum om naar een integer.
Dit kan onverwachte resultaten opleveren.
 
Martijn K

Martijn K

26/11/2015 09:53:06
Quote Anchor link
@ Thomas

Het gaat over een tabel waarin gemaakte vragen staan van deelnemers aan een toets. Per dag worden er duizenden vragen gemaakt.

Ik denk dat het traag gaat omdat in Chrome de pagina blijft laden als ik het script oproep. Als ik een
echo "ok";
voor de laatste accolade in het script zet komt er ongeveer een "ok" per seconde in beeld. Daarnaast zie ik dat de records heel langzaam in aantal dalen.

Ik ben niet bang om de data echt weg te gooien want we gaan daar verder niets mee doen.

Ik ben nu nog wel aan het zoeken naar de juiste oplossing want ik weet nog niet hoe ik het script nu moet aanpassen. Ik dacht dat het iets eenvoudigs zou zijn.

Hartelijk bedankt voor alle hulp!
 
Jan de Laet

Jan de Laet

26/11/2015 10:06:29
Quote Anchor link
Martijn, het duurt waarschijnlijk zo lang omdat je (in je eerste post) alle records leest en per record bepaalt of je een delete wilt doen.

Dus 1 simpele DELETE met de goede voorwaarde zal alle oude vragen verwijderen, zie de post van Peter K voor de SQL en de post van Ger voor de conditie

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$result
= mysqli_query($dbCon,"DELETE FROM `test` WHERE `tijd` < now() - interval 7 day");
if (!mysqli_query($dbCon,$result)) {
  die('Error: ' . mysqli_error($dbCon));
  mysqli_close($dbCon);
}

?>
Gewijzigd op 26/11/2015 10:06:57 door Jan de Laet
 
John D

John D

26/11/2015 12:58:58
Quote Anchor link
$result = mysqli_query($dbCon,"SELECT * FROM test"); En vervolgens de query afvuren vanuit PHP sleurt eerst alle data, de hele tabel, naar je php client en dan alle data door een while halen om te kijken of het al dan niet bewerkt of ge-delete moet worden kost zeeen van tijd. Overigens is dit een veelgemaakte beginnersfout en duidt meestal op een gebrek aan SQL kennis. Veel bewerkingen kunnen direct middels MySQL opgelost worden om onnodig ophalen en verhalen van data te voorkomen.
 
Thomas van den Heuvel

Thomas van den Heuvel

26/11/2015 13:21:20
Quote Anchor link
@John D niet per sé (denk aan unbuffered result sets, maar in bovengenoemd voorbeeld wordt alles binnengeharkt inderdaad). Hoe (in)efficiënt dit is hangt ook een beetje af van je connector (libmysql (meh) vs mysqlnd (yay)). Je zou via phpinfo() eens kunnen kijken wat er gebruikt wordt.

Maar ja, SELECT * FROM hugetable is niet heel erg handig.
 
Martijn K

Martijn K

26/11/2015 17:23:48
Quote Anchor link
Op het script van Jan de Laet krijg ik de volgende foutmelding:

"Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 1"

P.S. De records worden wel verwijderd.(en dat is het belangrijkste)
Gewijzigd op 26/11/2015 21:04:55 door Martijn K
 
Jan de Laet

Jan de Laet

27/11/2015 08:32:51
Quote Anchor link
Martijn K, laat je sql eens zien. In mijn SQL zit namelijk geen 1.
 
Ivo P

Ivo P

27/11/2015 09:17:34
Quote Anchor link
Mysql kan trouwens zo'n taak ook zonder php of andere aanroep van buiten afhandelen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
CREATE DEFINER=`root`@`localhost` EVENT `testtabel_cleaner`
    ON SCHEDULE
        EVERY 1 DAY STARTS '2012-06-01 01:34:38'
    ON COMPLETION PRESERVE
    ENABLE
    COMMENT ''
    DO BEGIN
    DELETE FROM testtabel
    WHERE tijdstip < CURRENT_DATE - INTERVAL 7 DAY;
END;


Mogelijk moet je nog wel eenmalig aan Mysql laten weten dat er dergelijke timers aanwezig zijn.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SET GLOBAL event_scheduler = ON;


linkje erbij gezocht: http://www.sitepoint.com/how-to-create-mysql-events/
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.