Evidenziare commenti inseriti nelle ultime 24 ore

  • Creatore Discussione Creatore Discussione asevenx
  • Data di inizio Data di inizio

asevenx

Utente Attivo
7 Nov 2009
312
0
16
Salve, vorrei sapere come posso fare per evidenziare (ovvero attribuire uno stile diverso) a dei commenti inseriti nelle ultime 24 ore. Ho un guestbook con database mysql, dove tra i campi c'è anche la data (nel formato: date("d/m/y"),' ',ora,' ',date("H:i");) e vorrei che ogni qual volta vengano visualizzati gli ultimi commenti questi vengano evidenziati. Stavo pensando ad un if che confronta la data del messaggio con la data del momento e se questo confronto non supera le 24 ore i messaggi vengono scritti in rosso per esempio.
Spero che sia stato abbastanza chiaro. Ringrazio t utti per l'aiuto.
 
ciao
ecco un'idea

PHP:
<?php
$ore_meno_24=time()-(24*60*60); //cioè attuale meno 24 ore
//estrai i tuoi campi data e ora
//se tu li avessi salvati in tinmestamp sarebbe stato più semplice
//trasformi i tui campi in timestamp prima trasformandoli in formato giusto es.
$data = "$mm/$gg/$anno $ore:$minuti"; // formato mm gg aaaa hh:ii
//la porti in time stamp
$data_commento=strtotime($data);//trasformo in timestamp
if($data_commento >= $ore_meno_24){
	//applichi uno stile es.
	$stile = " class=\"pinco\"";
}else{
	$stile = " class=\"pallo\"";
}
echo "<div $stile>$commento</div>";
?>
a te poi eventualmente semplificare
dai comunque un occhio a
http://it.php.net/manual/en/function.strtotime.php
 
Grazie per la risposta, ho provato ma non esce il risultato atteso. Preciso che non mi da nessun errore, però è come se non confrontasse le due date. Forse ho inserito l'if in modo errato. Ecco quello che ho scritto:
PHP:
//dati database
$host = "localhost";
$username = "fcfriends";
$password = "";
$database = "my_fcfriends";
$tabella = "forumeggio";
$tabella_comm = "forumeggio_commenti";
$ore_meno_24=time()-(24*60*60);
$data = "$mm/$gg/$anno $ore:$minuti";
$data_commento = strtotime($data);

//connessione e invio al DB
$connessione = mysql_connect($host, $username, $password) or die("Connessione DB fallita");
mysql_select_db($database, $connessione) or die("Selezione DB fallita");

//visualizza tutti i record nel DB
$query = "SELECT * FROM $tabella Order By id DESC LIMIT 20";
$result = mysql_query($query, $connessione) or die('Lavori in corso: La pagina sarà disponibile a breve. Errore caricamento forum...');

//ciclo while per visualizzare i dati estratti dal database
while($resrow = mysql_fetch_row($result))
{
$id = $resrow[0];
$nome = addslashes($resrow[1]);
$titolo = addslashes($resrow[2]);
$commento = $resrow[3];
$data_commento = addslashes($resrow[4]);

if($data_commento >= $ore_meno_24){
    //applichi uno stile es.
    $stile = " class=\"col2comm_ev\"";
	$stile2 = " class=\"col3comm_ev\"";
}else{
    $stile = " class=\"col2comm\"";
	$stile2 = " class=\"col3comm\"";	
} 
//Stampo il risultato
echo "
<div class='divcommenti' align='center'>
	<table class='tablecommenti' cellpadding=0 cellspacing=0>
		<tr>
			<td class='idx'>$id</td>
			<td class='col1comm' >$titolo</td>
			<td class='col5comm'>$data</td>
		</tr>
		<tr>
			<td class='idx2'>&nbsp </td>
			<td $stile2 colspan=2>
				<font $stile>$nome:</font> $commento</td>
		</tr>";//continua
 
ciao
da quello che avevi detto in
$data_commento = addslashes($resrow[4]); //cosa c'entra addslashes?
hai la data in formato (es.) 22/11/2011 non in timestamp (poi le ore dove sono? o il campo ha la forma 22/11/2011 14:57 ?)
se è così per fare il confronto devi trasformare la data che hai nel formato sopra in formato timestamp che è un numero intero (per vederlo metti un
var_dump($ore_meno_24);)
se la tua data nella tabella del db è nel formato 22/11/2011 14:57, prima devi trasformarla nel formato americano cioè
11/22/2011 14:57 e poi passarla a strtotime per ottenerla in formato timestamp
 
Hai frainteso quello che ti ha detto borgo. Il controllo lo devi mettere dentro il ciclo:
PHP:
<?php
$host         = "localhost";
$username     = "fcfriends";
$password     = "";
$database     = "my_fcfriends";
$tabella      = "forumeggio";
$tabella_comm = "forumeggio_commenti";

$connessione = mysql_connect($host, $username, $password) or die('Connessione DB fallita');
mysql_select_db($database, $connessione) or die('Selezione DB fallita');

$query = "SELECT * FROM $tabella ORDER BY id DESC LIMIT 20";
$result = mysql_query($query, $connessione) or die('Lavori in corso: La pagina sarà disponibile a breve. Errore caricamento forum...');

echo <<<EOF
<div class='divcommenti' align='center'>
    <table class='tablecommenti' cellpadding=0 cellspacing=0>
EOF;

while ($resrow = mysql_fetch_assoc($result)) {
    $id            = $resrow['id'];
    $nome          = addslashes($resrow['nome']);
    $titolo        = addslashes($resrow['titolo']);
    $commento      = $resrow['commento'];
    $data_commento = addslashes($resrow['data_commento']);

    if (time() - strtotime($data_commento) >= (24 * 60 * 60)) {
        $stile = 'class="col2comm_ev"';
        $stile2 = 'class="col3comm_ev"';
    } else {
        $stile = 'class="col2comm"';
        $stile2 = 'class="col3comm"';
    }
    
    echo <<<EOF
        <tr>
            <td class="idx">{$id}</td>
            <td class="col1comm">{$titolo}</td>
            <td class="col5comm">{$data}</td>
        </tr>
        <tr>
            <td class="idx2">&nbsp;</td>
            <td {$stile2} colspan="2">
                <font {$stile}>{$nome}:</font> {$commento}
            </td>
        </tr>
EOF;

    // ...
}
 
Ultima modifica:
ciao, la data è in formato italiano, viene stampata in questo modo 22/11/11 ora 11:08, e generata attraverso:
PHP:
echo date("d/m/y"),' ',ora,' ',date("H:i");?>
. Praticamente il form registra l'ora attuale (ovvero quella in cui l'utente apre il form per commentare) e poi lo salva nel db. Come faccio a trasformarlo in formato americano senza modificare quanto viene visualizzato form? grazie

scusate l'ignoranza, a cosa serve <<<EOF ?
Alessandro, nel ciclo if non manca una parentesi di chiusura?

grazie a tutti per le risposte
 
ciao
l' EOF è una sintassi per scrivere le stringhe
vedi http://it.php.net/manual/en/language.types.string.php example #3

veniamo alla data
se nel campo data_commento ha ad es 23/11/2011 per trasformarla in americano

PHP:
//....
$data_commento = addslashes($resrow['data_commento']);
$expl=explode("/",$data_commento);
//in $expl[0] trovi il giorno es. 23, in $expl[1] trovi il mese es. 11, in in $expl[2] trovi l'anno es. 2011
//per cui per trasformare
$data_commento_americana= $expl[1]."/".$expl[0]."/".$expl[2];// =>11/23/2011
if (time() - strtotime($data_commento_americana) >= (24 * 60 * 60) {
//...

se invece nel campo hai anche l'ora H:i es. 23/11/2011 10:43 sempre esplodendo per il / trovi
in $expl[0] trovi il giorno es. 23, in $expl[1] trovi il mese es. 11, in in $expl[2] trovi l'anno e l'ora es. 2011 10:43 e quindi ricomponi come prima

p.s.
probabilmente alex non ha riportato tutto il tuo script per quello manca la chiusura
 
ho fatto le modifiche che mi avete consigliato, ma come risultato mi "evidenzia" tutti i commenti (cioè a tutti i commenti viene applicato lo stile col2comm_ev, come se la condizione dell'if sia sempre vera.
PHP:
//visualizza tutti i record nel DB
$query = "SELECT * FROM $tabella Order By id DESC LIMIT 20";
$result = mysql_query($query, $connessione) or die('Lavori in corso: La pagina sarà disponibile a breve. Errore caricamento forum...');
	
echo "
<div class='divcommenti' align='center'>
	<table class='tablecommenti' cellpadding=0 cellspacing=0>";	
	
//ciclo while per visualizzare i dati estratti dal database
while($resrow = mysql_fetch_row($result))
{
$id = $resrow[0];
$nome = addslashes($resrow[1]);
$titolo = addslashes($resrow[2]);
$commento = $resrow[3];
$data_commento = addslashes($resrow[4]);
$expl=explode("/",$data_commento); 
$data_americana= $expl[0]."/".$expl[1]."/".$expl[2];

if(time() - strtotime($data_americana) >= (24 * 60 * 60)) { 
        $stile = 'col2comm_ev';
 	    $stile2 = 'col2comm_ev'; 
}else{
        $stile = 'col3comm';
	    $stile2 = 'col2comm';  
} 

//Stampo il risultato
echo"
		<tr>
			<td class='idx'>$id</td>
			<td class='col1comm'>$titolo</td>
			<td class='col5comm'>$data</td>
		</tr>
		<tr>
			<td class='idx2'>&nbsp </td>
			<td class='$stile' colspan=2>
				<font class='$stile2'>$nome:</font> $commento</td>
		</tr>";
ho usato una sintassi un po diversa, ma non credo che sia quello il problema, ora provo a cambiare anche quello e vediamo.
 
ciao
hai fatto un piccolo erroretto
$data_americana= $expl[0]."/".$expl[1]."/".$expl[2];
nella modo sopra non fai altro che da 23/11/2011 riottenere 23/11/2011
dovevi scrivere
$data_americana= $expl[1]."/".$expl[0]."/".$expl[2];
cioe devi invertire il giorno con il mese
prova e sappi dire
 
ciao, effettivamente ho dimenticato di dire che avevo provato in entrambi i modi, prima come mi hai detto tu e poi così, nel copiare il codice devo aver preso quest'ultimo. Cmq il risultato è lo stesso, cioè tutti evidenziati.
 
iao
allora dividi le istruzioni e metti i var_dump
PHP:
<?php
//......
$data_commento = addslashes($resrow[4]); 
var_dump($data_commento);//es string (nn)23/11/2011
$expl=explode("/",$data_commento);  
$data_americana= $expl[1]."/".$expl[0]."/".$expl[2]; 
var_dump($data_americana);//es string (nn) 11/23/2011
$meno_24=time()-(24*60*60);
var_dump($meno_24);//un numero intero di circa 12 cifre (INT)......
$data_comm_timestamp=strtotime($data_americana);
var_dump($data_comm_timestamp);//un numero intero di circa 12 cifre (INT)......
if($data_comm_timestamp >= $meno_24) {  
        $stile = 'col2comm_ev'; 
         $stile2 = 'col2comm_ev';  
}else{ 
        $stile = 'col3comm'; 
        $stile2 = 'col2comm';   
}  
//...eccc
?>
e posta i vari risultati dei var_dump
 
ecco:

string(18) "23/11/11 ora 15:36" string(18) "11/23/11 ora 15:36" int(1322007192) int(-1) string(18) "23/11/11 ora 13:25" string(18) "11/23/11 ora 13:25" int(1322007192) int(-1) string(18) "22/11/11 ora 11:08" string(18) "11/22/11 ora 11:08" int(1322007192) int(-1) string(18) "22/11/11 ora 10:55" string(18) "11/22/11 ora 10:55" int(1322007192) int(-1) string(18) "21/11/11 ora 16:41" string(18) "11/21/11 ora 16:41" int(1322007192) int(-1) string(18) "19/11/11 ora 14:58" string(18) "11/19/11 ora 14:58"
int(1322007192) int(-1) string(18) "19/11/11 ora 10:55" string(18) "11/19/11 ora 10:55"
int(1322007192) int(-1) string(18) "16/11/11 ora 16:10" string(18) "11/16/11 ora 16:10"
int(1322007192) int(-1) string(18) "09/11/11 ora 10:14" string(18) "11/09/11 ora 10:14"
int(1322007192) int(-1) string(18) "08/11/11 ora 10:56" string(18) "11/08/11 ora 10:56"
int(1322007192) int(-1) string(18) "07/11/11 ora 17:38" string(18) "11/07/11 ora 17:38"
int(1322007192) int(-1) string(18) "07/11/11 ora 13:34" string(18) "11/07/11 ora 13:34"
int(1322007192) int(-1) string(18) "05/11/11 ora 21:38" string(18) "11/05/11 ora 21:38"
int(1322007192) int(-1) string(18) "03/11/11 ora 19:57" string(18) "11/03/11 ora 19:57"
int(1322007192) int(-1) string(18) "30/10/11 ora 20:17" string(18) "10/30/11 ora 20:17"
int(1322007192) int(-1) string(18) "30/10/11 ora 18:18" string(18) "10/30/11 ora 18:18"
int(1322007192) int(-1) string(18) "30/10/11 ora 13:36" string(18) "10/30/11 ora 13:36"
int(1322007192) int(-1) string(18) "30/10/11 ora 13:10" string(18) "10/30/11 ora 13:10"
int(1322007192) int(-1) string(18) "30/10/11 ora 10:36" string(18) "10/30/11 ora 10:36"
int(1322007192) int(-1) string(18) "29/10/11 ora 14:34" string(18) "10/29/11 ora 14:34"
int(1322007192) int(-1)
 
ciao
ecco trovato l'inghippo
string(18) "23/11/11 ora 15:36"
è quel " ora " che impedisce la trasformazione dell'ora americana in timestamp quel int(-1) quindi devi eliminarlo
PHP:
<?php 
//...... 
$data_commento = addslashes($resrow[4]);  
var_dump($data_commento);//es string (nn)23/11/2011 
$expl=explode("/",$data_commento);   
$data_americana= $expl[1]."/".$expl[0]."/".$expl[2]; 
$data_americana=str_replace(" ora "," ",$data_americana);//tolgo la stringa ora con i due spazi e sostituisco con uno spazio unico
var_dump($data_americana);//es string (nn) 11/23/2011 
$meno_24=time()-(24*60*60); 
var_dump($meno_24);//un numero intero di circa 12 cifre (INT)...... 
$data_comm_timestamp=strtotime($data_americana); 
var_dump($data_comm_timestamp);//un numero intero di circa 12 cifre (INT)...... 
if($data_comm_timestamp >= $meno_24) {   
        $stile = 'col2comm_ev';  
         $stile2 = 'col2comm_ev';   
}else{  
        $stile = 'col3comm';  
        $stile2 = 'col2comm';    
}   
//...eccc 
?>
prova, lasciando per ora i var_dump li togli quando tutto funzia e poi puoi risemplificare tornando al vecchio codice sempre però togliendo " ora ".

p.s.
piccola lezione di saggezza: ricordati quando qualcosa non ti funzia che spesso disseminare lo script di var_dump ti fa capire dove sta l'errore
 
grande funziona!!! Ho dovuto però applicare la correzione non sulla data americana ma su quella d'origine. ;) grazie mille!!!!!!
 
ciao
perfetto, alla prossima.

toglimi una curiosità: non funziava sulla data americana? avrebbe dovuto essere lo stesso in quanto l'explode inverte solo i gg con i mm, comunque bene lo stesso
 

Discussioni simili