• User Newbie

    confronto dati da db my con php

    Ciao a tutti, sto sviluppando una piccola pagina web che recupera i dati da un db ogni 5 sec e poi deve confrontarli fra di loro.
    Mi spiego meglio:
    ho una colonna che si chiama inpname dove sono contenuti i nomi e una inpstatus dove visualizzo lo stato (0-1)
    a questo punto se un nome specifico 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).
    <!DOCTYPE html>
    <html>
    <head>
    <META HTTP-EQUIV="refresh" CONTENT="5;datitest.php">
    <style>
    table, th, td {
    border: 1px solid black;
    }
    </style>
    </head>
    <body>
    <?php
    include("connessione.php");

    $sql = "SELECT inpname, status FROM inpstatus WHERE inpname LIKE '%antifurto%' or inpname LIKE '%sensore%' UNION SELECT buttonid, status FROM actstatus WHERE but$
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
    echo "<table><tr><th>Nome</th><th>Status</th><th>Lastupdate</th></tr>";
    // output data of each row
    while($row = $result->fetch_assoc()) {
    echo "<tr><td>" . $row["inpname"]. "</td><td>" . $row["status"]. "</td><td> " . $row["lastupdate"]. "</td></tr>";
    }
    echo "</table>";
    } else {
    echo "0 results";
    }

    $conn->close();
    ?>

    </body>
    </html>

    Ciao e grazie mille..


  • User

    a questo punto se un nome specifico 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).

    Perdonami, come diventa 1? Nel codice che hai mostrato non c'e' nessuna query di tipo update.


  • User Newbie

    Ciao, si hai ragione! Mi spiego meglio: vado a pescare dei dati nel db MySQL presente su un altro server che gestisce una domotica! Quindi tutte le variazioni di 1-0 arrivano dalla domotica!! La pagina in php presente su altro server ( ma nella stessa rete) legge i dati del db ogni 5 sec e poi dovrebbe fare i confronti!!


  • User

    Ok, ma con cosa confronti? Sul tuo server hai una copia del database originale da paragonare?


  • User Newbie

    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


  • User

    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...


  • User Newbie

    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)


  • User

    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!:ciauz:


  • User Newbie

    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..


  • User

    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.


  • User Newbie

    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...


  • User

    Raspberry? Perdonami che linguaggio stai usando? E che database stai usando?


  • User Newbie

    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


  • User

    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! 🙂


  • User Newbie

    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..