Výmaz po určitém čase

Potřeboval bych udělat tohle:

- každý den ve 12:00 smazat všechyn příspěvky (prostě ty, co tam byli přidaný jako první) kromě dvaceti prvních v tabulce "chat"


dík
Ukaž strukturu tabulky chat.
id int(5) NOT NULL auto_increment,
jmeno varchar(50),
text text,
datum varchar(50),
PRIMARY KEY (id))");
Ještě upřesnění zadání. Chceš vymazat všechny záznamy, kromě nejnovějších 20ti (podle datumu)? Použils dvakrát slovo první a nedává to logický smysl.
Ale dává to smysl. Napsal jsem "smazat příspěvky, který byli přidaný jako první" (což znamená nejstarší) a "kromě dvaceti prvních" - to jsem myslel nejnovějších (sry).

Chci smazat všechny příspěvky, kromě dvaceti nejnovějších podle ID.
No aspoň uznej, že to zadání jednoznačné nebylo (sám jsi to dovysvětloval).

Teď k řešení:

"každý den ve 12:00" to je problém. PHP skripty se spouštějí většinou uživatelem přes prohlížeč. Proběhnou a skončí. Neběží trvale, aby hlídaly čas a v danou hodinu něco udělaly. I kdybys skript chtěl nechat běžet trvale (třeba v nějaké smyččce) a čekal, server skript násilně ukončí po překročení max_execution_time v php.ini (na WZ nastaveno 20 sec).

Takže to promazávání je třeba pověsit na něco jiného, co má přibližně periodu, kterou chceš. Já to třeba řeším tak, že promazávám záznamy při přihlášení admina. Stejně se na své weby přihlašuji téměř denně.

Pokud máš vlastní server, nastav si spouštění skriptu systémem - na Linuxu cronem.

"smazat příspěvky, kromě nejnovějších 20ti podle ID"

// Celkový počet zpráv
$query = "SELECT COUNT(*) FROM tabulka";
$result = mysql_query($query) or die (mysql_error());
$res = mysql_fetch_array($result);
$pocetzaznamu = $res[0];

pocetsmazanych = $pocetzaznamu - 20; // Tady ušetří těch 20 nejnovějších

// Vymaž všechny kromě 20 nejnovějších podle id
$query = "DELETE FROM tabulka ORDER BY id LIMIT $pocetsmazanych";
$result = mysql_query($query) or die (mysql_error());
Cron - http://faq.webzdarma.cz/otazka.php?25.
ja mam rad datum, ked je loginint (aby som si tam ukladal unixovy cas)
(a nemal som problem v 2007, alebo 2037 (preto long))

delete from tabulka order by datum desc limit 20,99999
No, nemyslím si, že longint je zásadní řešení po roce 2037.

Jednoduchá úvaha: longint je 4 bytove číslo, které má maximum +2147483648 (2^31, 32. bit se používá na znaménko plus/mínus). Počítáme-li od 1.1.1970 (počátek unixového timestamp), dojdeme k roku 2036. Pak se tvůj longint vynuluje a budeš zpátku v roce 1970.

Tudíž bys potřeboval vícebytový "superlongint", který momentálně není podporován. I kdybys ho měl, tak by sis musel vytvořit vlastní funkce (převod superlongint na datum, výpočet dne v týdnu apod.). Ty standardní totiž nebudou fungovat správně případně vůbec. Někdo to zkoušel na Windows, Apache se zhroutil a PHP hlásilo rok 1900.

Takže longint je přesně to samé, jako standardní date a datetime. Tudíž nevidím jediný důvod je nepoužívat. Jsou přehlednější. V databázi vidím datum a ne nějaké dlouhé číslo, které si z hlavy nedokážu převést.

Jak se bude blížit rok 2036, určitě se začne standartně podporovat nějaký ten superlongint a zároveň budou podporované i date a datetime. Takže žádnou paniku...
nieje long int nahodou 8bajtovy?
vsak ved int je 4 bajtovy..
Asi je nedorozumění v definici longint. Různé programovacé jazyky mají různé definice typu integer. Nepřesně jsem použil výraz "longint". Specifikujme to velikosti v bytech:

V MySQL existuje bigint, což je 8B číslo. Tam to problém není.
http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html

Problém je PHP, které zná jen int (4B), když max velikost překročíš, automaticky to převede na float se všemi souvisejícími problémy.
http://us2.php.net/manual/cs/language.types.integer.php

Tedy jak jsem psal výše. Můžeš si datum ukládat typem int v MySQL, ale stávající PHP nebude spolupracovat po roce 2036. Tedy nic to neřeší a navíc je to nepřehledné.

A ještě jeden odkaz.
http://www.oreilly.com/catalog/phppr/chapter/php_pkt.html

"Integers

Integers are whole numbers. The range of integers in PHP is equivalent to the range of the long data type in C. On 32-bit platforms, integer values can range from -2,147,483,648 to +2,147,483,647. PHP automatically converts larger values to floating point numbers if you happen to overflow the range. An integer can be expressed in decimal (base-10), hexadecimal (base-16), or octal (base-8). For example:

$decimal=16;
$hex=0x10;
$octal=020;"
co sa tyka php, tak taky maly testik mi vypysal toto:
(na win mi nechcelo brat zaporne cisla)
echo date("r",-0x80000000);//Fri, 13 Dec 1901 21:45:52 +0100
echo "<br />";
echo date("r",0);//Thu, 01 Jan 1970 01:00:00 +0100
echo "<br />";
echo date("r",0x7FFFFFFF);//Tue, 19 Jan 2038 04:14:07 +0100
echo "<br />";
echo date("r",0x80000000);//Fri, 13 Dec 1901 21:45:52 +0100
echo "<br />";
echo date("r",0xFFFFFFFFFF);//Tue, 19 Jan 2038 04:14:07 +0100

ja si myslim, ze je dolezitejsie, aby to bolo v db vecsie cislo, lebo ked nadide cas, tak nech radsej ukazuje kladne cislo, ako by malo ist od 1901

phpcko a urcite aj vsetky linuxove distribucie sa urcite do vtedy prekonfiguruju na 8bajtovy cas, tak aby som si nemusel prerabat tabulky v db, tak to uz pouzivam teraz.

(v mysql pouzivam bigint)