Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76

    [PHP, mySQL] Aiuto manipolazione data/ora timestamp

    Ciao a tutti,
    Avrei bisogno di aiuto per quanto riguarda la manipolazione di data e ora in php e mySQL.

    In particolare ho dei dispositivi domotici che inviano dati tramite GET chiamando una pagina php sul mio server con una querystring di questo tipo:

    http://www.miosito.it/insert.php?nom...=valore2...ecc...

    al momento sto facendo salvare tutti i dati trasmessi su database, ma non ho bosogno di tutti questi dati e mi servirebbe salvarla ad esempio ogni ora purtroppo questi dispositivi trasmettono un po' "quando gli pare" e quindi dovrei salvarmi il primo "stream" di info per quell'ora.

    Avrei pensato ad un paio di soluzioni:

    - salvarli tutti e poi ogni tot pulise il database

    - mandare in sleep la pagina per un ora o usare un timer per salvarli solo una volta all'ora

    - ogni volta che mi arriva uno "stream" di dati: in php mi salvo l'orario di arrivo; (supponendo di avere già dati di consumo orario) faccio una query sul database per verificare quando è stato fatto l'ultimo inserimento se è passata un'ora salvo sul DB sennò no.

    Vorrei seguire questo ultimo procedimento; al momento la tabella del mio database ha un campo timestamp che si autocompila ad ogni inserimento ma invece di essere il numero di sec dalla unix date il client SQL che uso me lo visualizza come YYYY-MM-DD hh:mm:ss.

    quindi vorrei riuscire ad estrarre sia dalla funzione php che restituisce l'ora, che dal timestamp salvato nel DB il valore hh (NB. non il timestamp convertito in ore) e confrontare i due valori hh_php e hh_SQL se è passata 1 ora (hh_SQL + 1 == hh_php) salvo i dati nel db e quindi quello diventerà il valore salvato in quell'ora e sarà per forza il primo ricevuto in quell'ora.

    Stesso discorso per quanto riguarda i Giorni e magari i mesi.

    Immagino che ci sia qualche funzione che "estragga" le ore o i giorni o il mese da una data, ne conoscete qualcuna?

    Dato che questo metodo è un po' complicato ne conoscete altri?
    Tenete conto che il valore che ho bisogno di salvare è un valore di energia "consumata" da un'eletrodomestico connesso ad una determinata presa elettrica; purtroppo in dispositivi ha un contatore che si resetta una volta al giorno e quidi mi restituisce il totale di energia consumata dal reset fino a quel momento, quindi per ottentere il valore da salvare nel DB (cioè l'energia consumata nell'ultima ora) dovrei comunque fare una query per "recuperare" l'ultimo salvataggio, ma solo se fosse passata un'ora (quindi magari un'metodo alternativo potrebbe ottimizzare il num di chiamate al DB).

    Vi ringrazio in anticipo per l'aiuto.
    Scusate per il poema .

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317
    Salvare la data dell'ultimo update
    con un if verificare che la data sia maggiore a (esempio) 24h, in caso evitare di aggiornare, altrimenti inserire i dati in db

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da zacca94 Visualizza il messaggio
    Salvare la data dell'ultimo update
    con un if verificare che la data sia maggiore a (esempio) 24h, in caso evitare di aggiornare, altrimenti inserire i dati in db
    Ah qhindi si può fare 1 confronto di date come potrei fare CN dei numeri???

    Parli di if quindi immagini sia nel codice PHP e non nella query il confronto...in che formato deve essere ladataeora create tramite funz PHP? E quella ottenuta dal timestamp del DB? Devo fare un cast o qlcs del genere?

    Puoi post armi un link o 1 esempio di codice x farlo???

  4. #4
    Puoi farlo con una SELECT

    select if(campo_datetime + interval 1 hour >= now(), 1, 2) as delta from tabella...... where ..

    se delta = 1 (true) non e' ancora passata 1 ora
    se delta = 2 (false) e' passata piu' di una ora

    Questo a prescindere dall'ora ricevuta da php che in questo caso non servirebbe. Farebbe testo il momento in cui esegui la query.

    Oppure estrai l'ora e fai quel che ti pare in php.

    select date_format(campo_timestamp, '%H') as ora from ...

    '%H' maiuscolo ora 00-23 - con '%k' kappa ore 0-23

    In questo caso attento che per il php i numeri che iniziano con 0 sono considerati ottale e quindi 08 - 09 sono un errore.
    Devi anche tenere conto del cambio giorno ... ora 0 - 22 del giorno dopo e' minore delle ore 23 del giorno prima.

    Meglio usare MySql

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Wow, grazie mille; non sapevo niente di queste query con l'if. Sono supportate naturalmente da mySQL? che versione?

    Avresti un link della documentazione/guida per approfondire?

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Ci ho riflettuto un po' e dovrei modificare la query perchè un questo modo gli dico prendi l'ora completa dell'ultimo salvataggio aggiungi un'ora e se l'ora corrente è maggiore (o uguale) salva; purtroppo i dispositivi salvano un po' quando gli pare, ad esempio l'ultimo salvataggio è avvenuto alle 11e5min con questa query salverey il primo salvataggio dopo le 12e5 (11e5min + 1h) però questo salvataggio non avverrà esattamente alle 12e5 ma magari alle 12e10 (o ancora dopo) spostando il salvataggio del successivo dopo le 13e10 e così via in questo modo ad ogni salvataggio accumulerei ritardo e non ci sarebbe più la differenza di un'ora ma di più...mi servirebbe prendere l'ora dell'ultimo salvataggio tagliare i minuti e i sec e poi aggiungere un'ora...hai idea di come fare???

  7. #7
    Siccome devi considerare anche i cambi giornata dovresti usare EXTRACT() oppure date_format() per estrarre DAY_HOUR

    es.:

    select if(extract(day_hour from tuo_campo) + 1 >= extract(day_hour from now()), 1, 2) as delta

    oppure

    select if(date_format(tuo_campo, '%d%H') + 1 >= date_format(now(), '%d%H'), 1, 2) as delta

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Grazie Mille per l'aiuto che mi hai dato finora; purtroppo con l'ultimo aggiornamento firmware hanno modificato il metodo e le modalità di Upload dei dati.

    Adesso invece che con classica GET nome=valore la GET o POST mi restituisce un oggetto JSON che con la funz JSON_decode trasformo in un'array associativo utilizzabile con php e fin qui nessun problema.

    Dato che il "gateway" che effettua l'invio dati alla mia pagina deve anche ricevere dei "comandi" di accensione/spegnimento di determinati dispositivi connessi al sistema; con il nuovo aggiornamento firmware per essere più tempo "reperibile" per la ricezione effettua un enorme upload unico di tutti i dati di tutti i dipositivi ad esso connessi (mentre prima ogni volta che riceveva un aggiornamento di dati da un disp. li trasmetteva e solo di quel dispositivo).

    Questo mega invio di dati può essere temporizzato ogni TOT minuti e quindi mi risolverebbe il problema che avevo prima.

    Mi basterebbe impostare l'invio dei tadi ogni ora e la pagina li salverebbe senza preoccuparsi dell'ora perchè viene già fatto a "livello firmware".

    Purtroppo alcuni di quei comandi che il "gateway" dovrebbe ricevere io li dovrei inviare ad una determinata ora impostata dell'utente e salvata su DB; al momento io, quando veniva richiamata la pagina di inserimento, facevo controllare che ora fosse e se ci fossero sul DB dei comandi da mandare a quell'ora +o- tot minuti li eseguivo.

    Ad esempio un upload dati richiama la pagina di inserimento alle h10e30 se ci sono dei comandi per le ore 10e32 li faccio eseguire dalla pagina di inserimento, altrimenti mi limito a salvare i dati.

    Quindi per come è il nuovo firmware ho due opzioni:

    1- setto l'invio dati ad esempio ogni 5 minuti e ricevo dei dati che non vado a salvare (a meno che non siano i primi di quell'ora) e quindi mi sarebbero inviati solamente per richiamare la pagina che controlli se ci siano comandi da mandare entro i prossimi 5 minuti e nel caso li esegua. In questo caso dovrei effettuare il controllo che siano i primi dati dell'ora e salvarli e i restanti invii invierebbero dati comletamente inutili.

    2- setto l'invio dati ad ogni ora e quindi non dovrei effettuare nessun controllo di orario me semplicemente salvarli; ed in qualche modo avere una pagina php "che gira in background" ed ogni tot minuti effettua il controllo ed esegue gli eventiali comandi.
    Esiste un modo per far eseguire una pagina php "in background" ogni tot minuti?

  9. #9
    utilizza cron job esiste sia per win che per linux

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da piero.mac Visualizza il messaggio
    utilizza cron job esiste sia per win che per linux
    Grazie mille sei una miniera di informazioni .

    Dunque in sostanza io scrivo il mio file .php che fa quello che deve poi tramite questo "tool/comando" imposto l'esecuzione ogni quanto mi pare.

    Per quanto riguarda i permessi, io ho affitato dello spazio su un server, mi servono dei permessi particolari per accedere alla shell?

    A questo punto ha ancora senso far fare l'upload dei dati ogni ora ai dispositivi? Potrei chiederglieli io invece di aspettare che loro me li mandino?

    Da un punto di vista di sicurezza mi sembra meglio che io glieli chieda e probabilmente non dovrei fare tutti quei controlli che farei se fosse lui a mandarmeli (controllare che sia veramente lui), anche se dovrei comunque controllare che sia lui a risp.

    Poi il tutto sarebbe più puntuale perchè posso impostare l'ora precisa.

    Però loro che me li mandano è 1 sola comunicazione, mentre io che li chiedo e poi loro che li mandano sono 2; in più ogni tanto i dispositivi danno errore di risp ai comandi perchè il gateway è occuapato a fare altro e quindi devo ripsovare con un handshake.

    Che ne pensi?
    Ultima modifica di Mrk31; 09-05-2014 a 13:18

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.