- Home
- Categorie
- Coding e Sistemistica
- MYSQL e altri Database
- mysql: differenza tra date problemi
-
mysql: differenza tra date problemi
Ciao a tutti ho problemi per realizzare una query per differenziare 2 date, ADESSO e una data memorizzata nel mysql in formato 25-10-2008 19:35.
Mi serve per cancellare i vecchi utenti del sito, dunque vorrei effettuare la differenza in giorni tra oggi (now()) e l'ultimo login (prelevato dal mysql) e dunque deletarli.
qualcuno puo aiutatmi?
posto qua i codici.
query realizzata da me
<b>Clean Old Messages/Newsletter</b>
<br><br><?
if ($_POST){$tabla5 = mysql_query("SELECT * FROM tb_messenger ORDER BY id ASC"); // selecciono todos los registros de la tabla usuarios, ordenado por nombre
$date = $_POST["date"]
//Todo parece correcto procedemos con la inserccion
$queryz9 = "DELETE FROM tb_messenger WHERE TIMEDIFF((now(),'$date')) > 3000000;
mysql_query($queryz9) or die(mysql_error());
}echo "<b>Done.</b><br><br>";
}
?>
This Button Will Clean Old Messages/Newsletter.
<br><br>
<form method="post" action="index.php?op=38">
<input type="hidden" name="clean" value="clean">
<input type="submit" Value="Clean" class="button">
</form></table>
Risultato:
Parse error: syntax error, unexpected T_VARIABLE in /users/a/d/b/adbux/public_html/0530700ad/cleanoldmessages.php on line **12struttura del mysql interessato:
-- Struttura della tabella
tb_messenger
CREATE TABLE IF NOT EXISTS
tb_messenger
(
id
int(11) NOT NULL auto_increment,
sendfrom
varchar(15) collate latin1_general_ci NOT NULL,
sendto
varchar(15) collate latin1_general_ci NOT NULL,
date
varchar(35) collate latin1_general_ci NOT NULL,
comments
varchar(3000) collate latin1_general_ci NOT NULL,
status
varchar(11) collate latin1_general_ci NOT NULL default 'unread',
PRIMARY KEY (id
)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=31676 ;--
-- Dump dei dati per la tabellatb_messenger
INSERT INTO
tb_messenger
(id
,sendfrom
,sendto
,date
,comments
,status
) VALUES
(30466, 'admin', 'ivanhoe6', '27-09-08 17:23', 'Newsletter 27-09-08 17:23 \r\n\r\n\r\n<br> <br>\r\n', 'unread'),
**
-
Ciao guadagnaeuro
mi sa che è saltato un punto e virgola
[php]$date=$_POST['date'];[/php]
-
Continua a darmi errori
Parse error: syntax error, unexpected T_VARIABLE in /users/a/d/b/adbux/public_html/0530700ad/cleanoldmessages.php on line 14
NOn capisco come sistemarla questa query
Se puoi spiegami come miglioralo e farlo funzionare, grazie ciao
-
Invece di now() metti time() pero' devi trasformarti la data del db in timestamp usando la funzione mktime()
(se vuoi un consiglio personale userei sempre il time stamp per salvare delle date sul Db )
-
Ciao samy
il mio problema è che ho 15.000 record salvati cosi nel database e non so come sistemarli.
tutti i dati dovranno essere analizzati per cancellare le inattivita.
esiste un modo per convertire i dati del mysql e dopo usarli nel php in modo da evitare di modificre il mysql direttamente?
Puoi farmi un esempio, non sono molto pratico purtroppo.
grazie per l'aiuto
P.S. Apprezzo il tuo consiglio ma la data è imposta in questo modo da programmatore dello script non da me e per me capirci qualcosa in questo script è un lavoraccio
-
Ho modificato il codice ma non va lo stesso
<b>Clean Old Messages/Newsletter</b>
<br><br><?
if ($_POST){$tabla5 = mysql_query("SELECT * FROM tb_messenger ORDER BY id ASC"); // selecciono todos los registros de la tabla usuarios, ordenado por nombre
while ($registro5 = mysql_fetch_array($tabla5)) { // comienza un bucle que leera todos los registros y ejecutara las ordenes que siguen$date=$_POST["date"];
$now = time();//Todo parece correcto procedemos con la inserccion
$queryz9 = "DELETE FROM table tb_messenger WHERE ($now - $date) >60)";
mysql_query($queryz9) or die(mysql_error());
}echo "<b>Done.</b><br><br>";
}
?>
This Button Will Clean Old Visits.
<br><br>
<form method="post" action="index.php?op=38">
<input type="hidden" name="clean" value="clean">
<input type="submit" Value="Clean" class="button">
</form></table>
Clean Old Messages/Newsletter
Errore di sintassi nella query SQL vicino a 'table tb_messenger WHERE 1222714662 - >60)' linea 1
Il mysql è in formato timestamp ma non mi fa la differenza lo stesso
se qualcuno puo aiutatrmi ve ne saro grato
-
Tranquillo a tutto c'è soluzione
[php]<b>Clean Old Messages/Newsletter</b>
<br><br><?
if ($_POST)
{
$tabla5 = mysql_query("SELECT * FROM tb_messenger ORDER BY id ASC"); // selecciono todos los registros de la tabla usuarios, ordenado por nombre$olddate=time() - 300000; // abbiamo così il timestamp della data limite, prima di questa cancelliamo tutti gli utenti //adesso dobbiamo trasformarla in data equivalente al Db $olddate= date ("Y-m-d H:i:s", $olddate); $queryz9 = "DELETE FROM tb_messenger WHERE last_login<'$olddate'"; //ammettendo che il campo si chiami last_login mysql_query($queryz9) or die(mysql_error()); echo "<b>Done.</b><br><br>";
}
?>
This Button Will Clean Old Messages/Newsletter.
<br><br>
<form method="post" action="index.php?op=38">
<input type="hidden" name="clean" value="clean">
<input type="submit" Value="Clean" class="button">
</form>[/php]
Vedi se funzionaP.S. Anche se in questo caso non ti serve, se devi trasformare la data del Db in timestamp dovrai procedere così:
2008-09-29 20:34:00 ```per usare mktime() ti serve separare la data a pezzi: giorno, mese, anno, ore, minuti, secondi. io procedo così: sostituisco lo spazio ed i : con il - [php]$date=str_replace(" ", "-", $date); $date=str_replace(":", "-", $date);[/php]in questo modo $data conterrà la nostra data in questo modo
2008-09-29-20-34-00
[php]list($Y, $m, $d, $H, $i, $s) = explode ("-", $date);[/php]a questo punto avrai: $Y=2008 (anno) $m=9(mese) $d=29(giorno) $H=20(ora) $i=34(minuti) $s=0(secondi) adesso puoi utilizzare la funzione mktime() per ottenere il timestamp relativo a questa data la sintassi di mktime() è
int mktime ( int $hour, int $minute, int $second, int $month, int $day, int $year [, int $is_dst] )
[php]$date=mktime($H, $i, $s, $m, $d, $Y);[/php]a questo punto puoi tranquillamente effettuare la tua sottrazione
time() - $date
riepilogo: [php]$date=str_replace(" ", "-", $date); $date=str_replace(":", "-", $date); list($Y, $m, $d, $H, $i, $s) = explode ("-", $date); $date=mktime($H, $i, $s, $m, $d, $Y);[/php]
-
Ciao samy
ho provato la tua pagina ma c'è qualcosa che non va, non cancella correttamente i messaggi.
penso che errore sia in TIME() - 300 (o altro valore)
Ho corretto col nome della colonna che contiene la data varchar
codice pagina
<b>Clean Old Messages/Newsletter</b>
<br><br><?
if ($_POST)
{
$tabla5 = mysql_query("SELECT * FROM tb_messenger ORDER BY id ASC"); // selecciono todos los registros de la tabla usuarios, ordenado por nombre$olddate = time() - 300; // abbiamo così il timestamp della data limite, prima di questa cancelliamo tutti gli utenti //adesso dobbiamo trasformarla in data equivalente al Db $olddate = date ("d-m-Y H:i:s", $olddate); $queryz9 = "DELETE FROM tb_messenger WHERE date<'$olddate'"; //ammettendo che il campo si chiami date mysql_query($queryz9) or die(mysql_error()); echo "<b>Done.</b><br><br>";
}
?>
This Button Will Clean Old Messages/Newsletter.
<br><br>
<form method="post" action="index.php?op=38">
<input type="hidden" name="clean" value="clean">
<input type="submit" Value="Clean" class="button">
</form>Nel database il formato della data è
varchar giorno-mese-anno ora: minuti29-09-08 23:36
E' davvero complicata questa funzione, mannaggia
in ogni caso grazie lo stesso per il lungo lavoro.
provo anche le altre parti dello script sperando di riuscirci.Se hai altri suggerimenti dimmi pure, mi sa che vengo da te direttamento tanto abito vicino
-
Varchar
Beh..andrebbe impostato a DATETIME veramente
altra cosa, le date, per confrontarle, vanno messe obbligatoriamente nel formato inglese
anno-mese-giorno ore:minuti:secondila cosa è trubbola, come si dice dalle mie parti
Sicuro che non è possibile trasformare quella data in Timestamp o almeno in formato inglese? magari modificando lo script...
così la vedo lunga da fare ed in ogni caso scomoda
-
Sono riuscito a trasformare la data cosi:
1222727525
é cosi memorizzata nel database cosi adesso (non ho cambiato niente nel database è sempre varchar ma la memorizza in questo formato)
Con la data cosi si puo fare qualcosa?
IO non capisco neppure come calcolare i giorni in questo formato.
Grazie mille per l'aiuto.
-
cambiala in INT invece di VARCHAR e nello script di prima togli questo pezzo
[php]//adesso dobbiamo trasformarla in data equivalente al Db
$olddate = date ("d-m-Y H:i:s", $olddate);[/php]ora dovrebbe andare
-
Ciao samy
Per evitare di manipolare troppo lo script faccio cosi
- aggiungo una nuova colonna al mysql (tipo INT)
- programmo la query basandomi su questa colonna nuova
Per inserire i dati nella nuova colonna va bene time() ?
Spero di riuscire, grazie per l'aiuto
-
time ti da il timestamp attuale, quindi si
-
Ciao samy
ti confermo che avendo creato un campo timestamp con tipo INT ora la query funziona e cancella i vecchi messaggi, ti ringrazio davvero.
ciao e ancora grazie
-
Di nulla, alla prossima