Newsgroup: it.comp.www.php
Titolo: Verifica data

Ciao a tutti!
Devo realizzare, usando il crontab, una pagina in .php che verifichi la data
ed esegua un DELETE al db in mysql.
L'unica richiesta è:
Tutte le notizie con il valore presente nel campo data, formato 20050129
(AAAAMMGG)
che sono superiori di 3 gg. o uguali alla data attuale, siano cancellati.
Qualche info?
P.S. Non ditemi di googlare.... perchè è tutta la mattina che googlo ;)
Ciao! ;)
Ricc@rdo

 Qualche info?
Info di che genere? Quale sarebbe il problema?
-- 
I am what I am, I do what I can
Do. Or do not. There is not try.

 
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$db_selected = mysql_select_db('foo', $link);
$result = mysql_query("DELETE * FROM mytable WHERE 
DATEDIFF(NOW(),STR_TO_DATE(campodata,'%Y%m%d')) > 3", $link);
testa ovviamente ma dovrebbe funzionare.
Ciao.
	-Ema-

 > Qualche info?

 h capire come fare la query...
Allora sei OT, it.comp.software.database, free.it.comp.database.mysql 


> testa ovviamente ma dovrebbe funzionare.
<?
include("config.php");
$db = mysql_connect("localhost", $dblogin, $dbpassword);
$db_selected = mysql_select_db($dbname, $db);
$result = mysql_query("DELETE * FROM $dbtable WHERE
DATEDIFF(NOW(),STR_TO_DATE(data,'%Y%m%d')) > 3", $db);
echo "1-$db<br>";
echo "2-$db_selected<br>";
echo "3-$result<br>";
?>
mhhh, c'è qualche cosa che non va...
questo è quanto mi restituiscono gli echo:
1-Resource id #3
2-1
3-

P.S. il valore contenuto in data č: 20050117
Questo č un problema?
deve essere espresso cosě? 2005-01-17 ?
ciao e... Grazie!
Riccardo.

credo che debba utilizzare datediff() che è anche in PhP


 credo che debba utilizzare datediff() che h anche in PhP
Fino a prova contraria DATEDIFF e' un costrutto SQL ...


> Fino a prova contraria DATEDIFF e' un costrutto SQL ...
Caspita, è vero!
Scusatemi...
Setec mi puoi dare una mano...
ho preso il codice che mi ha passato Ema ma...
non riesco a capire dove sia l'errore.
$result = mysql_query("DELETE * FROM $dbtable WHERE
DATEDIFF(NOW(),STR_TO_DATE(data,'%Y%m%d')) > 3", $db);
Il formato data ce l'ho in YYYYMMDD e non YYYY-MM-DD
ho provato a cambiare un valore tra quelli presenti in data,
ma non è cambiato nulla...
puoi darmi una "mano"?
Grazie di tutto!
Ricc@rdo.

Ho provato anche ad usare "strtotime" ma...
non so come inserirlo nella query come condizione per eliminare il record
(se inferiore o uguale a 3 gg.)
$differenza=(strtotime("2003-03-26") - strtotime("2003-02-26"))/(86400);
Come sempre...
grazie per il tuo tempo e per la Grande pazienza!
Ricc@rdo.


Il primo è ok. E' la resource che identifica la connessione al db.
Il secondo è il print di TRUE: mysql_select_db è andata bene.
Il terzo è il print di FALSE: mysql_query è andata male.
Potrebbero esserci diversi motivi:
prova ad eseguire la query con phpMyAdmin ed in ogni caso modifica il 
codice in questo modo:
$db = mysql_connect("localhost", $dblogin, $dbpassword);
if( $db === FALSE ) {
	exit("Connessione al db non effettuata");
}
if( mysql_select_db($dbname, $db) ) {
	exit("Selezione del db $dbname non riuscita");
}
$result = mysql_query("DELETE FROM $dbtable WHERE "
   		     ." DATE_SUB( NOW(), INTERVAL 3 DAY ) > "
		     ." CONCAT( SUBSTRING( data, 1, 4 ), "
		     ." '-', SUBSTRING( data, 5, 2 ) , '-', "
		     ." SUBSTRING( data, 7, 2 )  )", $db);
if( $result === FALSE ) {
	exit( mysql_error() );
}
STR_TO_DATE funziona con mysql ver > 4.1.1
DATEDIFF funziona con mysql ver > 4.1.1
Ciao.
	-Ema-

 DATEDIFF funziona con mysql ver > 4.1.1
cacchiolina!
MySQL version: 4.0.22-standard
che faccio???!!!!
Ricc@rdo.


La query che ti ho mandato nel post precedente dovrebbe girare nella tua 
versione. Non usa le sopracitate ...
Ciao.
	-Ema-

 }
Ok, > if( $db === FALSE ) credo che sia sbagliato... corretto?  if( $db ==
FALSE )
non ho invece capito la condizione:
if( mysql_select_db($dbname, $db) )
{
exit("Selezione del db $dbname non riuscita");
}
Ricc@rdo.

 }
Vedi 
http://it.php.net/manual/en/function.mysql-select-db.php
Ciao.
	-Ema-

ok...
tutto funziona QUASI correttamente...
c'è solo un piccolo particolare ;)
quando eseguo il file, tutto quanto viene cancellato...
anche i record con date oltre un mese dalla data attuale sono rimossi :(
<?
include("config.php");
$db = mysql_connect("localhost", $dblogin, $dbpassword);
if( $db == FALSE ) {
exit("Connessione al db non effettuata");
}
if( mysql_select_db($dbname, $db) )
{
$result = mysql_query("DELETE FROM $dbtable WHERE "
." DATE_SUB( NOW(), INTERVAL 3 DAY ) > "
." CONCAT( SUBSTRING( data, 1, 4 ), "
." '-', SUBSTRING( data, 5, 2 ) , '-', "
." SUBSTRING( data, 7, 2 )  )", $db);
if( $result === FALSE )
{
exit( mysql_error() );
}
}
?>

 
Ovviamente avevi un backup ... :-P
Questa query torna 0:
SELECT DATE_SUB( NOW( ) , INTERVAL 3 DAY ) >
CONCAT( SUBSTRING( '20050117', 1, 4 ) , '-',
	SUBSTRING( '20050117', 5, 2 ) , '-',
	SUBSTRING( '20050117', 7, 2 )
	)
Quest'altra torna 1:
SELECT DATE_SUB( NOW( ) , INTERVAL 3 DAY ) >
CONCAT( SUBSTRING( '20050112', 1, 4 ) , '-',
	SUBSTRING( '20050112', 5, 2 ) , '-',
	SUBSTRING( '20050112', 7, 2 )
	)
Ora se il tuo campo data è corretto e se la data del tuo PC è corretta 
dovrebbe funzionare.
Ciao.
	-Ema-

 )
riprovo....
ma, cosa signigica: torna 1 e torna 0 ????
non riesco a capire il valore di 5,2 e 1,4


SUBSTRING( '20050117', 1, 4 ) ----> '2005'
SUBSTRING( '20050117', 5, 2 ) ----> '01'
SUBSTRING( '20050117', 7, 2 ) ----> '17'
quindi
CONCAT( SUBSTRING( '20050117', 1, 4 ) , '-',
	SUBSTRING( '20050117', 5, 2 ) , '-',
	SUBSTRING( '20050117', 7, 2 )
)  ----> '2005-01-17'
DATE_SUB( NOW(), INTERVAL 3 DAY ) ----> '2005-01-14 17:52:40'
Pertanto DATE_SUB( NOW(), INTERVAL 3 DAY ) >
CONCAT( SUBSTRING( '20050117', 1, 4 ) , '-',
	SUBSTRING( '20050117', 5, 2 ) , '-',
	SUBSTRING( '20050117', 7, 2 )
)
e' falso quindi -----> 0
L'altro invece (quello con 20050112) e' vero quindi -----> 1
Questo significa che messi nella clausola WHERE nel primo caso *non e' 
soddisfatta* ed il record relativo non viene cancellato, nel secondo *e' 
soddisfatta* ed il record dovrebbe essere eliminato. Controlla che il 
campo data non contenga degli spazi.
Ciao.
	-Ema-

 dovrebbe funzionare.
Ema, scusami una cosa...
ma il formato della data presente in 'data' deve essere:
YYYY-MM-DD    oppure    YYYYMMDD ?
Se è YYYYMMDD non succede nulla :(
Se è YYYY-MM-DD si cancella tutto quanto...
Ricc@rdo.


La query che ti ho mandato è per la data in formato YYYYMMDD.
Se però hai la data in formato YYYY-MM-DD tanto meglio, togliamo tutta 
quella conversione.
Attento che deve essere 20050117 non 2005117 altrimenti non si capisce 
più nulla ... forse è ovvio ma non si sa mai.
Se hai la data in YYYYMMDD dovrebbe cancellare quelli più vecchi di 3 
giorni. Hai qualcosa con data anteriore 20050114?
-Ema-

 L'altro invece (quello con 20050112) e' vero quindi -----> 1
perfetto...
io ho i seguenti valori in 'data' (senza spazi, trattini o altro...)
20050112
20050113
20050114
20050115
20050116
20050117
20050118
20050119
20050120
20050121
20050122
20050123
Il campo data è di tipo 'tinytext' oppure è meglio mettere 'data'?
// file elimina.php


no, va tutto bene...
ho trovato un inghippo... ed è tutto ok :)
la data ce l'ho in formto YYYYMMDD
ho fatto una prova con:
20050112
20050113
20050114
20050115
20050116
20050117
20050118
20050119
20050120
20050121
20050122
20050123
e me li ha cancellati dal 12 al 14...
và già bene... ma in realtà devono essere cancellati dal 12 alla data di
oggi + 3 ossia il 20...
cosa vado a modificare?

 cosa vado a modificare?
fatto!
INTERVAL -2 DAY
Mi sei stato di grande aiuto! ;)
Ora, anche le date... le ho in pugno :D
Se ho bisogno...
so dove trovarti :)
CIAO!!!
Riccardo.

 Il campo data è di tipo 'tinytext' oppure è meglio mettere 'data'?
Ok. Metti tipo data e metti le date con YYYY-MM-DD.
Quindi cambia la query in:
$result = mysql_query("DELETE FROM $dbtable WHERE "
         ." DATE_SUB( NOW(), INTERVAL 3 DAY ) > data",
	$db);
Per controllare cosa andrai a cancellare in generale ti conviene 
prendere la query, sostituire 'DELETE' con 'SELECT *' e farla girare in 
phpMyAdmin o direttamente nella consolle di mysql.
Ciao.
	-Ema-

 so dove trovarti :)
Meglio non in questo ng per questi problemi.
Siamo totalmente OT.
-Ema-