Un Evento Unico. 5 Sale. 27 Interventi. SEO, SOCIAL, E-Commerce, Mobile, Turismo.
CLICCA QUI e SCOPRI DI PIù X Chiudi
 
Forum GT: Condividiamo idee e conoscenza Forum GT: Condividiamo idee e conoscenza


Condividi questo contenuto nei Social Network:
Ti stiamo aspettando: Registrati subito e gratis. Entra a far parte di una delle comunità più attive in Italia. Se hai dimenticato i tuoi dati li puoi recuperare subito.


Vai indietro   Forum per Webmaster: Condividiamo Idee e Conoscenza > Sviluppo e Gestione siti web > Php - Mysql
Benvenuto! Forum Regole FAQ Lista utenti Calendario Segna come letti


Rispondi
 
LinkBack Strumenti di discussione
Vecchio 06-03-10, 19:41   #1 (permalink)
User
 
Data di registrazione: Feb 2007
Messaggi: 121
Question data e ora? consigli

Ciao a tutti.
Avrei bisogno di consigli per una stupidaggine che proprio non mi viene...

Tabella MYSQL

|id|cognome|status|data|ip|
|1|tizio|ok|2010-03-06 12:16:32|172.16.20.1|
|2|caio|ok|2010-03-06 12:50:10|192.0.0.1|
|3|sempro|ok|2010-03-05 10:20:10|192.16.16.1|
il campo data è timestamp CURRENT_TIMESTAMP.

Inserisco i dati e vengono registrati correttamente come sopra, faccio la query con select:
"SELECT *, DATE_FORMAT(data,'%d-%m-%Y %H:%i:%s') as data FROM tabella";

e fin qui pare tutto a posto, stampo i dati:

$data = $row_test['data'];
$data=str_replace(' ', '-', $data);
$data=str_replace(':', '-', $data);
list($Y, $m, $d, $H, $i, $s) = explode ('-', $data);
$array = explode("-", $data);
$data_it = $array[2]."-".$array[1]."-".$array[0];
$ora_it = $array[3].":".$array[4].":".$array[5];

<?php do { ?>
<table width="70%" border="1">
<tr>
<th scope="col"><?php echo $row_test['id']; ?></th>
<th scope="col"><?php echo $row_test['cognome']; ?></th>
<th scope="col"><?php echo $row_test['stato']; ?></th>
<th scope="col"><?php echo $data_it; ?></th>
<th scope="col"><?php echo $ora_it; ?></th>
<th scope="col"><?php echo $row_test['ip']; ?></th>
</tr>
</table>
<?php } while ($row_test = mysql_fetch_assoc($test)); ?>

Già qui capisco che lo script non è il massimo, sono ancora agli inizi con php, ma il risultato a schermo mi mostra tre volte solo il primo record (del campo data) mentre i nomi gli id e gli ip sono giustamente diversi.
vorrei consiglio su:

1 - come avere tutti i record listati filtrati per giorno
2 - come ovviare all'errore sul campo data (che proprio non trovo)
3 - come ottimizzare lo script (mi pare ci siano dei passaggi ridondanti)

Grazie per qualsiasi consiglio!
linno non in linea   Rispondi citando
Vecchio 06-03-10, 23:01   #2 (permalink)
 
Data di registrazione: Feb 2010
Messaggi: 136
Ti rispondo al volo. Se riesco domani ti scrivo il resto.
Il timestamp è la cosa più bella, secondo me, che ci sia in PHP.
Lavora su quello! Ti risparmi 7 (7!!) righe più formattazione nella query.
Per calcolare il giorno da un timestamp ti basta SOLO!!!
Codice PHP:
date("d",timestamp()); 
E BASTA!!

Al posto di timestamp inserisci quello che estrai dal database e sei tranquillo.
Per calcolare mese, anno, ore, minuti e secondi il metodo è lo stesso.
Come scritto sopra:
Codice PHP:
date("m, Y, H, i, s"timestamp()); 
Poi ti crei quello che vuoi ma così lavori "On-Fly".
Invece di formattare la data prima, la formatti solo in visualizzazione.
Calcoli il giorno:
Codice PHP:
$giorno=date("d",timestamp()); 
e ci lavori sopra:
Codice PHP:
//Se il giorno estratto dal timestamp del database è uguale ad oggi, esegui il codice
if($giorno==date("d",timestamp()){
//codice

Formattare il timestamp prima sarebbe mettersi i bastoni tra le ruote.
Con la funzione date puoi estrarti tutti i valori al volo, senza sottostare a nessun limite.
E se hai una data come quella che hai formattato tu? (nativa)
C'è la funzione strtotime() che ti permette di convertire una data in timestamp, molto utile per estrarre il singolo giorno, l'ora o anche i secondi di una determinata data, senza dilungarsi in funzioni su funzioni per togliere trattini, estrarre il giorno e via dicendo.
Inizia così e riposta il codice. Ti assicuro che è una dritta che ti servirà molto.

p.s. Io lavoro bene con i numeri. C'è chi preferisce le date ma il fatto di avere un numero che mi posso gestire come voglio lo trovo moooolto più sicuro.
portapipe non in linea   Rispondi citando
Vecchio 07-03-10, 01:35   #3 (permalink)
User
 
Data di registrazione: Feb 2007
Messaggi: 121
UAHO grazie!
A quest'ora ti rispondo grazie!
Ho appena finito di rivedermi con la mia signora il video di the wall live on Berlin e penso proprio che sia meglio affrontare il codice domani....il fatto è che i miei arzigololi codicilliti li devo un pò semplificare e se mi aiuti ne sarò felicissimo!!!
Thanks!!!
a domani!!!
linno non in linea   Rispondi citando
Vecchio 07-03-10, 08:16   #4 (permalink)
 
Data di registrazione: Feb 2010
Messaggi: 136
Ti dirò, il codice, data a parte, è abbastanza "standard" ed è giusto che sia così.

Potresti fare una cosa del genere:
Codice PHP:
<?php 
//creiamo la query mettendo il timestamp in ordine decrescente
$query=mysql_query("SELECT * FROM tabella ORDER BY data DESC");

//il while lo puoi mettere anche all'inzio in quanto i dati li estrai dalla query, quindi dal while in poi hai ciò che ti serve
//dico ciò per una migliore leggibilità del codice. Quello che viene prima si legge meglio e si capisce subito cosa stai facendo
echo '<table width="70%" border="1">';
while (
$array mysql_fetch_assoc($query)){ ?>
<tr>
<th scope="col"><?php echo $row_test['id']; ?></th>
<th scope="col"><?php echo $row_test['cognome']; ?></th>
<th scope="col"><?php echo $row_test['stato']; ?></th>
<th scope="col"><?php echo date("d-m-Y",$row_test['data']); ?></th>
<th scope="col"><?php echo date("H:i:m",$row_test['data']); ?></th>
<th scope="col"><?php echo $row_test['ip']; ?></th>
</tr>
<?php ?>
</table>
Il tag table l'ho tirato fuori dal ciclo. Creare una tabella per record non ti sembra esagerato?
Crei la tabella e tante righe quanti sono i record (a quello ci pensa il ciclo while).

Per quanto riguarda l'incolonnamento dovrei sapere in base a cosa, quanti giorni e che tipo di incolonnamento.
portapipe non in linea   Rispondi citando
Vecchio 07-03-10, 16:03   #5 (permalink)
User
 
Data di registrazione: Feb 2007
Messaggi: 121
eccoci qui

Ciao
allora...
in effetti il tuo codice è mooolto meglio, è vero così si risparmia molta scrittura, ma il problema è che , pur restituendo tutti i record in modo giusto (DESC), la data restituita appare sempre uguale e in qusto formato:

id | nome | status | data | ora | ip
10 caio Entrata 01-01-1970 01:33:01 127.0.0.1
9 tizio Entrata 01-01-1970 01:33:01 127.0.0.1
8 sempro Entrata 01-01-1970 01:33:01 127.0.0.1
7 tizio Entrata 01-01-1970 01:33:01 127.0.0.1
6 caio Entrata 01-01-1970 01:33:01 127.0.0.1

id 6 dovrebbe essere 5 marzo, id 7/8 6 marzo, id 9/10 7 marzo, quindi per visualizzare solo oggi la query secondo me dovrebbe essere approssimativamente questa:
$query=mysql_query("SELECT * FROM tabella WHERE data = CURRENT_DATE() ORDER BY data DESC"); ?
ma ovviamente a me non funziona... sicuramente non capisco proprio la sintassi base...
grazie ancora
linno non in linea   Rispondi citando
Vecchio 07-03-10, 16:11   #6 (permalink)
 
Data di registrazione: Feb 2010
Messaggi: 136
CURRENT_DATE, come potrei capire da solo, non è una funzione che si può associare a timestamp.
Fai così e vedi cosa ti stampa:
Codice PHP:
<?php  
$query
=mysql_query("SELECT * FROM tabella ORDER BY data DESC"); 

echo 
'<table width="70%" border="1">'
while (
$array mysql_fetch_assoc($query)){ ?> 
<tr> 
<th scope="col"><?php echo $row_test['id']; ?></th> 
<th scope="col"><?php echo $row_test['data']; ?></th> 
</tr> 
<?php ?> 
</table>
Per me hai dei problemi con il campo timestamp del database.
Così come hai scritto mi sembra che i campi timestamp non superino il numero 100 (credo siano tutti esattamente a 100, correggimi se sbaglio).
In base a quello che ti da, prova a cambiarlo in un campo varchar con limite 15 caratteri.
Se invece sono tutti giusti i valori allora vediamo. Prova e fammi sapere.
portapipe non in linea   Rispondi citando
Vecchio 07-03-10, 16:36   #7 (permalink)
User
 
Data di registrazione: Feb 2007
Messaggi: 121
allora...
così mi restituisce i valori esatti,

10 2010-03-07 15:26:17
9 2010-03-07 15:25:52
8 2010-03-06 12:16:37
7 2010-03-06 12:16:10
6 2010-03-05 12:15:47

quindi non è il campo timestamp, il mio problema è splittare data e ora in due array diversi per visualizzarli su due colonne diverse e lì mi sono perso, di solito io tendevo a memorizzare data e ora in due campi diversi come date e time, poi un giorno mi sono detto "proviamo a usare timestamp" e da lì ....
questione filtro:
se io su un campo date faccio un filtro del tipo WHERE data = now() mi funziona credo cha a questo punto non legge nel timestamp perchè c'è anche l'ora.

Argh!!!
mi sa che devo tornare agli albori quando dividevo i due campi, ma mi pare da siemo non tentare di progredire, almeno un pò
linno non in linea   Rispondi citando
Vecchio 07-03-10, 16:38   #8 (permalink)
 
Data di registrazione: Feb 2010
Messaggi: 136
- duplicate -
portapipe non in linea   Rispondi citando
Vecchio 07-03-10, 16:38   #9 (permalink)
 
Data di registrazione: Feb 2010
Messaggi: 136
Ok. Ho capito il problema.
Sai cosè il timestamp?
Senza guardare guide o altro. Non siamo qui per fare bella figura ma per imparare.
Sincero!
portapipe non in linea   Rispondi citando
Vecchio 07-03-10, 16:47   #10 (permalink)
User
 
Data di registrazione: Feb 2007
Messaggi: 121
Credo di aver capito che timestamp al momento della scrittura del record "fissa" il momento (data e ora) che in unix parte dal 1970 e viene / veniva? scritta come un insieme di numeri (secondi? a partire dal 1970?) sto facendo dei test in ambiente win con xampp quindi:
Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1 phpmyadmin 3.2.4
la data mi viene restituita da phpmyadmin già formattata in formato:

yyyy-mm-dd hh:mm:ss

ci sono vicino?
linno non in linea   Rispondi citando
Vecchio 07-03-10, 16:53   #11 (permalink)
 
Data di registrazione: Feb 2010
Messaggi: 136
Abbastanza.
Timestamp è il valore in secondi del tempo trascorso dal primo gennaio 1970.
Quindi se timestamp ti formatta in automatico un timestamp non è quello che serve a te (non se vuoi lavorare con il timestamp).
Se puoi cambiare il database ti consiglio di cambiare il campo data da timestamp a varchar (15).
Se non puoi ti tocca usare la funzione strtotime().
Quindi ti diventerebbe così:
Codice PHP:
<?php  
$query
=mysql_query("SELECT * FROM tabella ORDER BY data DESC"); 

echo 
'<table width="70%" border="1">'
while (
$row_test mysql_fetch_assoc($query)){  
$time=strtotime($row_test['data']);?>
<tr> 
<th scope="col"><?php echo $row_test['id']; ?></th> 
<th scope="col"><?php echo $row_test['cognome']; ?></th> 
<th scope="col"><?php echo $row_test['stato']; ?></th> 
<th scope="col"><?php echo date("d-m-Y",$time); ?></th> 
<th scope="col"><?php echo date("H:i:m",$time); ?></th> 
<th scope="col"><?php echo $row_test['ip']; ?></th> 
</tr> 
<?php ?> 
</table>
Così dovrebbe andare.
portapipe non in linea   Rispondi citando
Vecchio 07-03-10, 17:03   #12 (permalink)
User
 
Data di registrazione: Feb 2007
Messaggi: 121
Ok,
ma a quel punto mi tocca inviare data e ora come variabile e non prendermi il valore di timestamp di default, allora come sfruttare questa comodità?
Di solito invio da form o da variabile presa al volo da php, mi piaceva sfruttare il timestamp, semplicemente perchè esiste! Se mi puoi spiegare meglio...
il tuo codice prevede quindi il cambiamento del campo in varchar, 15, è esattamente quello che facevo prima... (due campi, 1 data varchar 10, 1 time varchar 8) non si smette mai di imparare...
linno non in linea   Rispondi citando
Vecchio 07-03-10, 17:08   #13 (permalink)
 
Data di registrazione: Feb 2010
Messaggi: 136
Dentro il varchar 15 (esagero sempre nei valori, non si sa mai) dovrai inserire dalla query INSERT il valore time() che è il timestamp di quel momento.
Niente NOW() o CURRENT_DATE, solo time().
Dopodiché avrai una stringa di numeri che elabori come più ti aggrada (in questo thread ti ho fatto vedere semplici esempi di come però si usa maggiormente il timestamp.
Fai questi cambiamenti e vedrai nella tabella in mysql, nel campo data, un numero tipo 1165425682. Quello è il timestamp.
portapipe non in linea   Rispondi citando
Vecchio 07-03-10, 17:12   #14 (permalink)
User
 
Data di registrazione: Feb 2007
Messaggi: 121
OKKK!!!
In effetti così funziona, ossia mi restituisce tutti i record giusti, lasciando il campo come timestamp, quindi il campo è formattato da phpmyadmin in lettura ma come base dati dovrebbe essere in secondi, mi sa che devo studiare ancora molto .
Ma, per il discorso della select? come visualizzo solo i due record dove la data è uguale a oggi?

SELECT * FROM tabella WHERE data = ? ORDER BY data DESC

Ogni consiglio è benevenuto.
linno non in linea   Rispondi citando
Vecchio 07-03-10, 17:15   #15 (permalink)
 
Data di registrazione: Feb 2010
Messaggi: 136
Prova così:
Codice PHP:
("SELECT * FROM tabella WHERE 'date(d,'data')'='date(d,time())' ") or die ("Errore nella query"); 
Non garantisco, me la sono inventata ora, però prova.
portapipe non in linea   Rispondi citando
Rispondi
Tags: , , ,



Strumenti di discussione

Regole di scrittura
Non puoi postare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi allegare file
Non puoi editare i tuoi post

BB code is Attivo
smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Disattivato
Trackbacks are Attivo
Pingbacks are Attivo
Refbacks are Disattivato
Vai al forum



Tutti gli orari sono GMT +3. Attualmente sono le 15:25.




Forum GT - © 2004-2009 GT idea S.r.l P.iva 02418200800 - Privacy/Disclaimer

SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.