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:

<?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);
}
}
}
?>
$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.
@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.
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)
Martijn K, laat je sql eens zien. In mijn SQL zit namelijk geen 1.
Mysql kan trouwens zo'n taak ook zonder php of andere aanroep van buiten afhandelen:


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.

SET GLOBAL event_scheduler = ON;


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

Reageren