- Home
- Categorie
- Coding e Sistemistica
- PHP
- confronto dati da db my con php
-
Ok, ma con cosa confronti? Sul tuo server hai una copia del database originale da paragonare?
-
No non ho una copia!! devo solo confrontare che se lo 0 diventa 1 per un determinato name allora esegue l'invio tramite telegram che è avvenuta una modifica edeve eseguire il confronto degli altri name che da 1 potrebbero diventare 0 se succede esegue uno script
-
Ma come fai a sapere se uno 0 e' sempre stato 0 o e' diventato 0 da 1?:? Puoi farmi un esempio? Non credo di seguire...
-
Allora sul db sono sempre settati a 0 i relativi comandi che inseriscono L'antifurto e a 1 i vari sensori posti in casa!! Se io setto dalla domotica antifurto on viene scritto nel db 1 per il relativo comando!
Se uno dei sensori rileva una presenza o apertura finestra viene settato 0! Se vedi nello script trovi 22-23-24 sono i comandi per dettare in on o in off le varie parti dell'antifurto ( antifurto interno esterno o totale)
-
Ok, questo e' diverso rispetto a quanto hai scritto nel primo messaggio.
esempio 22 passa da 0 a 1 devo andare a controllare se tutti gli altri nomi hanno lo stato settato a 0 e se per caso uno di questi diventa 1 deve eseguire una determinata operazione (esempio invio messaggio con telegram).
Se uno dei sensori rileva una presenza o apertura finestra viene settato 0!
Quindi sostanzialmente quello che vuoi fare e' controllare se, per ogni antifurto che e' "on", esistono dei sensori che sono anch'essi "on" giusto?
Ti consiglio una tabella "antifurto" con uno schema di tipo [id_antifurto, status] ed una "sensore" con uno schema di tipo [id_sensore, id_antifurto, status] . Ad esempio:
Tabella: Antifurto
id_antifurto | status ----------------------- 0 1 1 0 2 0
Tabella: Sensore
id_sensore | id_antifurto | status -------------------------------------- 0 0 1 1 0 0 2 1 0
Nell'esempio vediamo tre antifurti, di cui solo il primo (id 0) e' attivo. Abbiamo poi tre sensori, i primi due associati al primo antifurto ed il terzo associato al secondo antifurto. Di questi, solo il primo e' attivo.
Ora, vogliamo sapere quali antifurti hanno sensori attivi. Possiamo fare una query del tipo:
SELECT a.id as antifurto_id, s.id as sensore_id FROM antifurto a, sensore s WHERE a.antifurto_id = s.antifurto_id and a.status = 1 and s.status = 1
Se preferisci un JOIN esplicito puoi usare la query equivalente:
SELECT a.id as antifurto_id, s.id as sensore_id FROM antifurto a JOIN sensore s ON a.antifurto_id = s.antifurto_id WHERE a.status = 1 and s.status = 1
Questione di gusti...
Per l'esempio precedente questo produrra':
antifurto_id | sensore_id --------------------------- 0 0
Indicandoci che l'antifurto con id 0 ha il sensore con id 0 attivo
Spero aiuti!
-
Ciao DashmaL, ti ringrazio per le info che mi hai dato.
Mi scuso per l'errore del 0 1 ma stavo scrivendo dal cell e ormai il mio cervello non connetteva più.
Purtroppo non posso modificare le tabelle che contengono i bati perchè fanno parte del sistema domotico e di conseguenza si incasinerebbe tutto.
Cerco di spiegarmi meglio e con più calma e davanti ad un pc....
Con lo script postato sopra vado a leggere ogni 5 sec i dati nel db della domotica e mi crea una tabella tipo questa
[TABLE]Nome[/TH]
Status
[/TH]
[/TH]
[/TR][TD]antifurto.sala.2[/TD]
[TD]1[/TD]
[TD]
[/TD]
[/TR][TD]antifurto.sala.3[/TD]
[TD]1[/TD]
[TD]
[/TD]
[/TR][TD]sensore.allarme.sala[/TD]
[TD]1[/TD]
[TD]
[/TD]
[/TR][TD]antifurto.bagno.p1[/TD]
[TD]1[/TD]
[TD]
[/TD]
[/TR][TD]sensore.allarme.corridoio[/TD]
[TD]1[/TD]
[TD]
[/TD]
[/TR][TD]antifurto.portafinestra[/TD]
[TD]1[/TD]
[TD]
[/TD]
[/TR][TD]antifurto.bagno[/TD]
[TD]1[/TD]
[TD]
[/TD]
[/TR][TD]sensore.allarme.entrata[/TD]
[TD]1
[/TD]
[TD]
[/TD]
[/TR][TD]antifurto.porta[/TD]
[TD]1[/TD]
[TD]
[/TD]
[/TR][TD]antifurto.cucina[/TD]
[TD]1[/TD]
[TD]
[/TD]
[/TR][TD]22[/TD]
[TD]0[/TD]
[TD]
[/TD]
[/TR][TD]23[/TD]
[TD]0[/TD]
[TD]
[/TD]
[/TR][TD]24[/TD]
[TD]0[/TD]
[TD]
[/TD]
[/TR]
[/TABLE]
22 corrisponde ad inserimento antifurto totale, 23 inserimento antifurto interno e 24 inserimento antifurto esterno sono sempre settati a zero gli altri sono sempre settati a 1.
dalla mia domotica attivo l'antifurto tramite un pulsante web e va a scrivere nel db 1, a questo punto l'antifurto è attivo (in caso inviare anche qui un messaggio di avvenuto inserimento antifurto ma possiamo vedere dopo questa parte) e deve controllare che se lo stato degli altri passa da 1 a 0 (intrusione in casa) allora invio un messaggio (telegram) con scritto per esempio intrusione in corso
Ciao e grazie ancora per l'aiuto..
-
Ciao,
Ok ha piu' senso ora, anche se mi permetto di reiterare il mio invito a ristruttura il database. Comunque, per il problema posto, suggerisco:
In primo luogo, una funzionalita' che rilevi l'attivazione dell'antifurto tramite pulsante web e che quindi modifichi 22 e/o 23 e/o 24 da ad 1 con una query di tipo
UPDATE tabella SET status = 1 WHERE Nome = 23
E che invii anche un messaggio telegram all'utente. (Immagino tramite un'apposita API)
Quindi, una funzionalita' che ogni cinque minuti controlli se una delle colonne tranne 22/23/24 sia 0:
SELECT COUNT(*) FROM tabella WHERE (Nome = antifurto.sala.2 OR Nome = antifurto.sala.3 OR etc...) AND status = 0
Quindi se COUNT e' maggiore di 0 invii il messaggio telegram. Per effettuare il controllo ogni 5 minuti puoi provare a configurare una CRON Job se il tuo host lo supporta.
-
Ciao, scusami ma mi sto perdendo!! probabilmente non mi sono spiegato bene...
facciamo così:
lasciamo stare la parte di invio messaggio...
tutta la parte di domotica è già funzionante.... ora quando premo il pulsante sulla domotica inserimento antifurto totale (esempio) lo status sul db del numero 22 passa a 1 (fino a qui tutto funziona) a questo punto lo script, che gira su un serverino raspberry e si aggiorna ogni x secondi, dovrebbe vedere che 22 è passato da 0 a 1 e andare a controllare se tutti gli altri, tranne 23 e 24, sono a 1 se non lo sono (esempio intrusione) deve eseguire una determinata azione (inviare un mex o altro).
ovviamente la logica di funzionamento varrà anche per 23 e 24... ma lo vediamo in seguito...
Ovviamente quando l'antifurto è spento quindi status settato a 0 non deve controllare nulla.
Lo so non è facile capire quello che voglio fare tramite messaggio, poi sono anche un pò duro di programmazione quindi non sono messo bene...
-
Raspberry? Perdonami che linguaggio stai usando? E che database stai usando?
-
Raspberry è una scheda che gira con distro linux!!
Installato apache php ecc per far girare un piccolo server che mi serve per fare il confronto dei dati che arrivano da un altro server sotto la stessa rete!
Il db è MySQL s server domotica e vorrei sviluppare lo script in php su raspberry
-
Ok perfetto grazie, inizio a capire. Immagino che tu stia utilizzando Apache con PHP e MySQL giusto?
In tal caso ti suggerirei una cron job (vedi raspberrypi.org/documentation/linux/usage/cron.md) che in pratica ti permette di esegire uno script ogni tot tempo. Puoi configurarlo come una richiesta ad una pagina php che esegue la query oppure direttamente un comando che eseguisce una query sul database.
Facci sapere!
-
Ciao DashmaL, scusami per il ritardo ma sono stato occupato in altre faccende...
volevo continuare il discorso: mi hai postato un pò più sopra questa riga
SELECT COUNT(*) FROM tabella WHERE (Nome = antifurto.sala.2 OR Nome = antifurto.sala.3 OR etc...) AND status = 0
ok sono d'accordo con te che questa va a controllare lo stato che sia settato a 0 ma questa riga deve essere richiamata solamente quando il 22 o 23 o 24 passano a 0 a 1..