TulorkMedlem sedan aug. 2004903 inlägg Sitter här och funderar på om denna funktionen verkligen kommer fungera. Har testat lite genom att manipulera datumen i databasen. Den funkar om jag ställer fram ett datum på en annons 30 dagar eller en länk 10 dagar.
Men tanken är ju att den ska ta bort annonser som är 30 dagar gammla eller länkar som är 10 dagar gammla..
Så här ser det ut
function DateDiff ($to) {
$nto = explode('.', $to);
$nto = $nto[0].'-'.$nto[1].'-'.$nto[2];
$sec = strtotime($nto) - strtotime(date("Y-m-d"));
$days = round($sec / 86400);
return $days;
}
$doit = "SELECT date FROM annons WHERE aktiv ='1'";
$now = mysql_query($doit) or die ('Ett fel har uppstått');
$i = 0;
while($row = mysql_fetch_array($now, MYSQL_ASSOC)) {
$annonstid = $row['date'];
if (DateDiff($annonstid) > 30) {
$i++;
$doit2 = "DELETE FROM annons WHERE date ='$annonstid'";
$now2 = mysql_query($doit2) or die ('Ett fel har uppstått1');
}
}
echo "$i st annonser raderades <br /><br />";
//--------------------------------------------------------
function DateDiff2 ($to) {
$nto = explode('.', $to);
$nto = $nto[0].'-'.$nto[1].'-'.$nto[2];
$sec = strtotime($nto) - strtotime(date("Y-m-d"));
$days = round($sec / 86400);
return $days;
}
$doit = "SELECT date FROM links WHERE aktiv ='1'";
$now = mysql_query($doit) or die ('Ett fel har uppstått');
$o = 0;
while($row = mysql_fetch_array($now, MYSQL_ASSOC)) {
$annonstid = $row['date'];
if (DateDiff2($annonstid) > 10) {
$o++;
$doit2 = "DELETE FROM links WHERE date ='$annonstid'";
$now2 = mysql_query($doit2) or die ('Ett fel har uppstått2');
}
}
echo "$o st länkar raderades";
Hur fixar jag till koden så att när den körs, raderas datan som är 30 alt. 10 dagar gammalt
Som exempel
En annons skapades 2007.07.06, jag kör skriptet idag och eftersom dagens datum är 2007.08.05 (30 dagar senare) ska denna annons tas bort.
Tulork skrev:
function DateDiff ($to) {
$nto = explode('.', $to);
$nto = $nto[0].'-'.$nto[1].'-'.$nto[2];
$sec = strtotime($nto) - strtotime(date("Y-m-d"));
$days = round($sec / 86400);
return $days;
}
1. Har du verkligen formatet med punkttecken som åtskillnad i din databas? Använder du inte MySQL:s inbyggda date eller datetime?
2. Under förutsättning att svaret är "ja, jag har ett eget format". En elegantare funktion (för PHP 5.1 och uppåt):
function dateDiff($to) {
return round( ( strptime($to,'%Y.%m.%d') - time() ) / 86400 ) );
}
Samma för PHP <= 5.0:
function dateDiff($to) {
$to = str_replace('.','-',$to);
return round( ( strtotime($to) - time() ) / 86400 ) );
}
Detta var exempel på smidigare funktioner, men den egentliga lösningen måste nog ändå vara att du kör med riktiga datum i din databas och låter MySQL göra jobbet:
DELETE FROM annons WHERE aktiv=1 AND DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date
Kan också skrivas som:
DELETE FROM annons WHERE aktiv=1 AND CURDATE() - INTERVAL 30 DAY) <= date
För att få svar på hur många rader som togs bort så kör mysql_affected_rows().
TulorkMedlem sedan aug. 2004903 inlägg Datumen som åker in använder denna funktionen och formateringen
$datum = date("Y.m.d");
Vilket då blir dagens datum
DELETE FROM annons WHERE aktiv=1 AND DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date
Verkar intressant. Men när du säger att man ska köra med riktiga datum, hur menar du då? Går det inte att använda min datumformatering med den sql-satsen ovan?
TulorkMedlem sedan aug. 2004903 inlägg de funktionerna, både för 5.1 och upp och 5.0 och ner du postade innehåller båda syntaxfel enligt min utvecklinsserver. Provade rätt till dem..... visst, inga syntax fel.. men den blåste också alla annonser :D
Tulork skrev:
de funktionerna, både för 5.1 och upp och 5.0 och ner du postade innehåller båda syntaxfel enligt min utvecklinsserver. Provade rätt till dem..... visst, inga syntax fel.. men den blåste också alla annonser :D
Jag kan ha missat någon parentes eller så. Poängen var att undvika onödig strtotime()
strtotime(date('Y-m-d')) är detsamma som time() Man får Unix-tid för "nu".
strptime() ger dig chansen att göra en slags omvänd strftime, där man anger uppbyggnaden av datumet för flexiblare tolkningsmöjligheter. Utan att ha kontrollkört min kod så borde den ge samma svar som din...
TulorkMedlem sedan aug. 2004903 inlägg det löste sig. Använde denna
DELETE FROM annons WHERE aktiv=1 AND DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date
Fungerar prima! Tack för hjälpen :)=
Jag ändrade min formatering från 2007.08.06 till 2007-08-06
Tulork skrev:
Verkar intressant. Men när du säger att man ska köra med riktiga datum, hur menar du då? Går det inte att använda min datumformatering med den sql-satsen ovan?
Din formattering kräver att datumen lagras som någon slags textsträng i MySQL-databasen. Troligen använder du varchar eller char.
MySQL vet inte att detta är datum och kan inte räkna på dem. Genom att använda kolumndefinitioner för tid, så kan MySQL också räkna på datum: http://www.mysql.org/doc/refman/5.0/en/date-and-time-types.html
Formatet för datum i MySQL är Y-m-d.
TulorkMedlem sedan aug. 2004903 inlägg jupp. jag lagrar dem som varchar. Formateringen är just nu Y-m-d och det fungerar prima. raderar just nu annonser som är 30 dagar eller äldre.
Tulork skrev:
jupp. jag lagrar dem som varchar. Formateringen är just nu Y-m-d och det fungerar prima. raderar just nu annonser som är 30 dagar eller äldre.
Ooops! Det trodde jag inte. Tydligen är MySQL smartare än jag anade.
TulorkMedlem sedan aug. 2004903 inlägg
itpastorn skrev:
Ooops! Det trodde jag inte. Tydligen är MySQL smartare än jag anade.
trodde inte heller det skulle funka, men det gör det. Sorteringen på datumen fungerar också, även fast dem är varchar. I mitt huvud förstår jag inte hur en text med siffror kan ha ett högre värde än en annan text med siffror..men det funkar.