---
title: "Delete funktion efter 10 & 30 dagar"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/163205-delete-funktion-efter-10-30-dagar"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Tulork"
published: "2007-08-05T20:43:47.000Z"
updated: "2007-08-06T16:00:57.000Z"
replies: 9
views: 543
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/163205-delete-funktion-efter-10-30-dagar"
---

# Delete funktion efter 10 & 30 dagar

## #1 — Tulork, 2007-08-05T20:43Z

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

```php
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.

Permalänk: https://www.webforum.nu/p/163205

## #2 — itpastorn, 2007-08-06T14:26Z

> **Tulork skrev:**
>
> ```php
> 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):

```php
function dateDiff($to) {
    return round( ( strptime($to,'%Y.%m.%d') - time() ) / 86400 ) );
}
```

Samma för PHP \<= 5.0:

```php
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().

Permalänk: https://www.webforum.nu/p/2012170

## #3 — Tulork, 2007-08-06T14:38Z

Datumen som åker in använder denna funktionen och formateringen

```php
$datum = date("Y.m.d");
```

Vilket då blir dagens datum

```php
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?

Permalänk: https://www.webforum.nu/p/2012175

## #4 — Tulork, 2007-08-06T15:02Z

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

Permalänk: https://www.webforum.nu/p/2012178

## #5 — itpastorn, 2007-08-06T15:30Z

> **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...

Permalänk: https://www.webforum.nu/p/2012180

## #6 — Tulork, 2007-08-06T15:33Z

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

Permalänk: https://www.webforum.nu/p/2012182

## #7 — itpastorn, 2007-08-06T15:35Z

> **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.

Permalänk: https://www.webforum.nu/p/2012183

## #8 — Tulork, 2007-08-06T15:39Z

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.

Permalänk: https://www.webforum.nu/p/2012185

## #9 — itpastorn, 2007-08-06T15:54Z

> **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.

Permalänk: https://www.webforum.nu/p/2012192

## #10 — Tulork, 2007-08-06T16:00Z

> **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.

Permalänk: https://www.webforum.nu/p/2012195

---

Tråden på webben: https://www.webforum.nu/amne/php/163205-delete-funktion-efter-10-30-dagar
