Visualizzazione risultati 1 fino 19 di 19
Like Tree1Likes
  • 1 Post By tdef

Discussione: verifica condizioni dopo una query

  1. #1
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito verifica condizioni dopo una query

    Buongiorno,
    avrei bisogno di verificare alcune condizioni, dopo una query, per scriverne il risultato

    Codice PHP:
    <td > <input type="text" name="anno" class="textox2" value="'.
    if(
    $row->appello=="1"){ $stato="Presente";}
    elseif(
    $row->appello=="2"){ $stato="Assente";}
    if(
    $row->appello=="3"){ $stato="Uscito";}
    echo
    $stato;
    . '"
    ></td>
    Così ricevo un
    syntax error, unexpected 'if' (T_IF)
    Non riesco a vedere l'errore.
    Oppure c'è un sistema migliore per farlo ?
    Grazie a tutti

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Al netto di tutto il codice HTML, quanto hai scritto si riassume in:
    Codice PHP:
    $something = "string" . if ($condition) { $var = "A"; } else { $var = "B"; } echo $var;
    Usando l'operatore di concatenazione di stringhe viene richiesto un valore, non puoi utilizzare un costrutto condizionale (un if-then-else) in quel punto.
    Sposta il costrutto condizionale prima della costruzione della stringa:
    Codice PHP:
    if ($row->appello == "1") {
    $stato = "Presente";
    }
    elseif (
    $row->appello == "2") {
    $stato = "Assente";
    }
    elseif (
    $row->appello == "3") {
    $stato = "Uscito";
    }

    echo
    '<td><input type="text" name="anno" class="textox2" value="' . $stato . '"></td>';
    Altre osservazioni: anziché un insieme di if potresti valutare l'uso di uno switch o di una lookup table. In ogni caso dovresti gestire la possibilità che $row->appello contenga un valore inatteso, ad esempio 0 o 4, e prevedere un valore di default o una gestione degli errori.

    I suggerimenti che do più spesso:


  3. #3
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Grazie,
    non ci avevo pensato.
    Ho usato lo switch prima della riga in questione e così funziona.
    Grazie infinite

  4. #4
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Come posso prevedere un valore di default o fare una gestione degli errori ?
    Grazie per la pazienza

  5. #5
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Ho cantato vittoria troppo presto.
    Così non mi segnala errori, però $stato è sempre = "USCITO".

    Codice PHP:
    $valore = ($row['appello']);

    switch (
    $valore) {
    //se uguale a 1 è presente
    case '1':
    $stato="presente";
    break;
    //se uguale a 2 è in assente.
    case '2':
    $stato="assente";
    break;
    //negli altri casi Uscito...
    default:
    $stato="USCITO";
    }

    echo
    '<td><input type="text" name="anno" class="textox2" value="' . $stato . '"></td></tr>';

  6. #6
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Devi inizialmente dare un valore di default alla tabella che crei in MySQL se non sai la sintassi chiedi. (Se è presente il campo appello di default nella tabella selezionata non chiedere)
    Il default dello switch verrà usato se non trova le condizioni che tu hai espresso prima..
    Fai un echo della query please. (Senza password, via o altri dati sensibili).
    Se si sceglie 0 per appello come default nella creazione della tabella puoi abbinare tale valore con (uscito) mentre 1 (presente) 2 (assente).
    Da phpmyadmin nel riquadro sql usa il database dalla parola "USE" e la seconda istruzione sql;
    USE `my_pierinik`;
    ALTER TABLE `tableName` MODIFY `columnName` DEFAULT 0;
    UPDATE `tableName` SET `colunName` = DEFAULT WHERE `colunName` = 3;
    PS. Sostituire tableName con il nome tabella (residenti) e sostituire colunName (appello) con il nome campo.
    Nota* Con queste impostazioni significa che la tabella residenti con la colonna appello dovrà obbligatoriamente essere chiamata anche per le insert into o update EDIT: altrimenti avrà il valore di default.
    Ultima modifica di darbula : 04-12-2018 alle ore 00.21.41

  7. #7
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Fino a prova contraria il problema non è nella query, né nel database. Inoltre eviterei di usare 0 come valore di default, non mi sembra molto ragionevole per un registro elettronico assumere che gli studenti, di default, escano da scuola tutti i giorni . Piuttosto non userei un DEFAULT imponendo il campo appello come obbligatorio.

    Tornando al problema, il codice a prima vista sembra corretto. Suggerirei di separare il caso 3 <-> uscito da quello di default, e di verificare i dati estratti dalla tabella:
    Codice PHP:
    echo "Il codice letto dal database è: " . $row['appello'] . "<br>";

    switch (
    $row['appello']) {
    case
    '1':
    $stato = "presente";
    break;
    case
    '2':
    $stato = "assente";
    break;
    case
    '3':
    $stato = "uscito";
    break;
    default:
    $stato = "ERRORE: codice non riconosciuto";
    }

    echo
    '<td><input type="text" name="anno" class="textox2" value="' . $stato . '"></td></tr>';

    I suggerimenti che do più spesso:


  8. #8
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    In verità ciò che conta è presente o assente solo se specificato altrimenti non si può considerare vero.. Normalmente e giornalmente nella vita quotidiana si fa distinzione chiamando per nome l'interessato/a e si segna l'assenza se non presente.. Dunque la presenza o l'assenza va esplicata su uno schema relazionale che possiede un valore che si dia il caso può non essere giornalmente ove quando esisterà per giorno si modifica la struttura del database..

    Serve anche l'echo della query per vedere se è giusta.
    Scusa maznella abbiamo pareri discordanti.
    EDIT: Maznella ho scelto la via di mezzo uscito poiché vuole dire era presente ma adesso è assente.. Più che la logica dell'autore se non esiste una struttura giornaliera non può essere ne presente e ne assente :D poiché l'assenza o presenza si basa giornalmente e non un parametro fisso.
    Ultima modifica di darbula : 04-12-2018 alle ore 00.31.30

  9. #9
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    No, non si tratta di pareri, bensì di un programma che deve funzionare onorando delle specifiche. Non stiamo parlando di quadri o musica, i quali possono piacere o meno (e anche lì ci sarebbe comunque una componente tecnica in qualche modo oggettiva)

    Allo stato attuale non c'è nulla che permetta di dire con certezza che ci sia un errore nella query. Indagare verso quella direzione potrebbe rivelarsi uno spreco di tempo.
    A colpo d'occhio ritengo anche io possibile che l'interrogazione sia errata, dunque restituisca false e lo switch consideri il caso default, ma è altrettanto probabile che la query sia corretta e i dati inseriti nella tabella errati. Per fugare ogni dubbio conviene iniziare mostrando il valore contenuto in $row['appello']. Il resto verrà, eventualmente, dopo.

    In verità ciò che conta è presente o assente solo se specificato altrimenti non si può considerare vero.. Normalmente e giornalmente nella vita quotidiana si fa distinzione chiamando per nome l'interessato/a e si segna l'assenza se non presente.. Dunque la presenza o l'assenza va esplicata su uno schema relazionale che possiede un valore che si dia il caso può non essere giornalmente ove quando esisterà per giorno si modifica la struttura del database..
    Confesso di essermi perso in questo stream of consciousness, ma mi sembra di capire che tu stia dando per scontato un modello che non necessariamente corrisponde a quello che l'autore ha in mente.
    Siamo davanti ad un attributo di natura enumerativa, i cui valori inducono una partizione sull'insieme delle entità. Un attributo di questo tipo è opportuno che sia obbligatorio, salvo che non ci sia una ragione esplicita, molto valida e riconosciuta per fare altrimenti. In MySQL ciò si traduce in un NOT NULL.
    Questo non esclude la possibilità di avere un valore di default, ma bisogna ponderare bene quale utilizzare. Se penso all'esperienza scolastica, di default gli studenti sono tutti presenti, solo gli assenti vengono indicati. Se penso invece a servizi come Doodle vale il contrario: i partecipanti sono tutti assenti di default, solo i presenti devono essere esplicitamente inseriti. Se il sistema che l'autore intende realizzare sia più vicino al registro scolastico o a Doodle lo sa solo lui, non possiamo decidere noi al posto suo .

    ALTER TABLE `tableName` MODIFY `columnName` DEFAULT 0;
    [...]
    Nota* [...] significa che la colonna appello dovrà obbligatoriamente essere chiamata anche per le insert into o update
    Occhio che significa l'esatto opposto: poiché è presente un valore di default, la colonna appello non dovrà necessariamente essere impostata per le operazioni di INSERT e UPDATE.

    I suggerimenti che do più spesso:


  10. #10
    L'avatar di tdef
    tdef non è connesso Utente giovane
    Data registrazione
    12-12-2011
    Residenza
    Udine
    Messaggi
    81

    Predefinito

    Citazione Originalmente inviato da pierinik Visualizza messaggio
    Ho cantato vittoria troppo presto.
    Così non mi segnala errori, però $stato è sempre = "USCITO".

    Codice PHP:
    $valore = ($row['appello']);

    switch (
    $valore) {
    //se uguale a 1 è presente
    case '1':
    $stato="presente";
    break;
    //se uguale a 2 è in assente.
    case '2':
    $stato="assente";
    break;
    //negli altri casi Uscito...
    default:
    $stato="USCITO";
    }

    echo
    '<td><input type="text" name="anno" class="textox2" value="' . $stato . '"></td></tr>';
    Sinceramente ci sono cose che umanamente non comprendo; e non entro nel merito dell'altra discussione filosofeggiante perché tu sei il richiedente aiuto e a te va data risposta.
    Quindi: spiegami perché USCITO deve essere il valore di default, non ha senso, in realtà un valore di default non può esserci ( al limite N.D. [ Non Dichiarato ]), perché la presenza o meno di un alunno è un valore assoluto, o c'è o non c'è, ma non lo saprai mai fino a quando non fai l'appello.
    Un valore di default lo dai solo e soltanto se quel valore deve definire un valore minimo, che so il colore di sfondo della tabella, ma qui il valore lo dai te durante l'appello. E i valori possono essere solo presente, assente o uscito ( con le finalità che tu hai deciso ).
    Se c'è un errore o se questo si verifica comunque in questo caso dipende dai valori inseriti nel database.
    Se la query ad esempio legge un database vuoto ti darà un campo nullo, a quel punto devi prevedere che se è prevista un'inizializzazione del database, o semplicemente quando si apre il programma ad inizio giornata, certi dati non ci sono ancora, ma non è un errore, va solo controllato e reso noto.
    Quindi, ma è un esempio dato che non conosco nel le funzioni usate nel programma nel il metodo da te intrapreso, e comunque farei così:
    Codice PHP:
    $stato = '-'; // Serve solo a visualizzare lo stato di indefinito del dato, verrà modificato dalla riga sotto
    // se esiste un dato. Oppure verrà mostrato a video, in attesa di eventuali ulteriori inserimenti.
    if ($row['appello']) { // Verifica se c'è un dato in [appello]
    switch ($row['appello']) {
    case
    '1':
    $stato="presente";
    break;
    case
    '2':
    $stato="assente";
    break;
    case
    '3':
    $stato="USCITO";
    break;
    }
    }
    echo
    '<td><input type="text" name="anno" class="textox2" value="' . $stato . '"></td></tr>';
    Ovviamente, bisogna prevedere un sacco di possibilità ulteriori: ad esempio l'insegnante dimentica di inserire uno stato per un alunno e quindi rimane in "value" il segno - a quel punto in fase di inserimento nel database devi avvisare l'insegnate che ha dimenticato di inserire il dato.
    Non puoi farne a meno; l'insegnate non può fare a meno di inserire il dato, perché è lui che certifica il dato, non la macchina, non tu! O Mario c'era quel giorno a scuola o non c'era.
    Quindi devi forzare l'insegnate a inserire i dati mancanti e non decidere arbitrariamente, ecco perché dicevo che è un dato assoluto, non puoi prevederlo a priori.
    Ed è anche la rottura di palle a livello 10 di Schiavone della programmazione
    mzanella likes this.
    Tower Defense giochi in Flash

  11. #11
    battimani non è connesso Neofita
    Data registrazione
    19-11-2009
    Messaggi
    8

    Predefinito

    Grazie a tutti per le risposte, ma mi sono perso.
    Inoltre in questi giorni non riesco a lavorarci perchè sono cambiati i miei programmi e non ho tempo da dedicarci come speravo.

    Vorrei però spiegare che non si tratta di un registro scolastico dove devo segnare i presenti e gli assenti, ma di una gestione tipo convitto per studenti.
    La loro presenza o assenza non va gestita giornalmente, ma nel complesso del periodo dell'anno.
    Quindi non devo fare un appello giornaliero, ma segnare solo chi esce per un breve periodo o per sempre.
    Questi sono i 2 casi principali che devo gestire. (Poi le uscite brevi possono avere varia natura.)
    Nei prossimi giorni provo a riguardare a tutte le spiegazioni che mi avete mandato per vedere se riesco a capirci qualcosa. Grazie veramente a tutti

  12. #12
    battimani non è connesso Neofita
    Data registrazione
    19-11-2009
    Messaggi
    8

    Predefinito

    Inoltre stavo pensando di creare un'altra tabella da relazionare con questa, dove mettere le uscite definitive.

    Oppure potrei aggiungere semplicemente una colonna nella tabella attuale per mettere questa data. Tanto tutti, prima o poi, dovranno uscire. Quindi senza dover gestire un'altra tabella solo per una data.

    Grazie e scusate la domanda banale

  13. #13
    battimani non è connesso Neofita
    Data registrazione
    19-11-2009
    Messaggi
    8

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Fino a prova contraria il problema non è nella query, né nel database. Inoltre eviterei di usare 0 come valore di default, non mi sembra molto ragionevole per un registro elettronico assumere che gli studenti, di default, escano da scuola tutti i giorni . Piuttosto non userei un DEFAULT imponendo il campo appello come obbligatorio.

    Tornando al problema, il codice a prima vista sembra corretto. Suggerirei di separare il caso 3 <-> uscito da quello di default, e di verificare i dati estratti dalla tabella:
    Codice PHP:
    echo "Il codice letto dal database è: " . $row['appello'] . "<br>";

    switch (
    $row['appello']) {
    case
    '1':
    $stato = "presente";
    break;
    case
    '2':
    $stato = "assente";
    break;
    case
    '3':
    $stato = "uscito";
    break;
    default:
    $stato = "ERRORE: codice non riconosciuto";
    }

    echo
    '<td><input type="text" name="anno" class="textox2" value="' . $stato . '"></td></tr>';
    Ho provato come dicevi, nella riga echo
    Il codice letto dal database è:
    non visualizza niente, mentre per il valore $stato mi visualizza "ERRORE: codice non riconosciuto";

  14. #14
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Devi inizialmente dare un valore di default alla tabella che crei in MySQL se non sai la sintassi chiedi. (Se è presente il campo appello di default nella tabella selezionata non chiedere)
    Il default dello switch verrà usato se non trova le condizioni che tu hai espresso prima..
    Fai un echo della query please. (Senza password, via o altri dati sensibili).
    Se si sceglie 0 per appello come default nella creazione della tabella puoi abbinare tale valore con (uscito) mentre 1 (presente) 2 (assente).
    Da phpmyadmin nel riquadro sql usa il database dalla parola "USE" e la seconda istruzione sql;
    USE `my_pierinik`;
    ALTER TABLE `tableName` MODIFY `columnName` DEFAULT 0;
    UPDATE `tableName` SET `colunName` = DEFAULT WHERE `colunName` = 3;
    PS. Sostituire tableName con il nome tabella (residenti) e sostituire colunName (appello) con il nome campo.
    Nota* Con queste impostazioni significa che la tabella residenti con la colonna appello dovrà obbligatoriamente essere chiamata anche per le insert into o update EDIT: altrimenti avrà il valore di default.
    Scusami, non riesco a seguire le tue indicazioni.
    Avrei provato a fare come dici, ma non ce la faccio ...

  15. #15
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Chiaro, questo può significare due cose:
    1. nel database è stato inserito NULL come valore in corrispondenza delle righe su cui stai lavorando
    2. l'interrogazione non va a buon fine

    Puoi verificare la prima possibilità accedendo al database tramite PHPMyAdmin e controllando se i valori inseriti siano NULL, oppure usando var_dump:
    Codice PHP:
    echo "Il codice letto dal database è: " . $row['appello'] . "<br>";
    echo
    "<pre>";
    var_dump($row);
    echo
    "</pre>";
    Se questo test non dà risultati bisogna controllare la query che stai eseguendo. Assicurati di controllare sempre il valore di ritorno di un'interrogazione, e tenere traccia degli eventuali messaggi d'errore. Se incontri delle difficoltà riporta il codice che stai utilizzando.

    I suggerimenti che do più spesso:


  16. #16
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Scusate mi sono collegato con due utenti diversi ...
    battimani sono sempre io ...

  17. #17
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Chiaro, questo può significare due cose:
    1. nel database è stato inserito NULL come valore in corrispondenza delle righe su cui stai lavorando
    2. l'interrogazione non va a buon fine

    Puoi verificare la prima possibilità accedendo al database tramite PHPMyAdmin e controllando se i valori inseriti siano NULL, oppure usando var_dump:
    Codice PHP:
    echo "Il codice letto dal database è: " . $row['appello'] . "<br>";
    echo
    "<pre>";
    var_dump($row);
    echo
    "</pre>";
    Se questo test non dà risultati bisogna controllare la query che stai eseguendo. Assicurati di controllare sempre il valore di ritorno di un'interrogazione, e tenere traccia degli eventuali messaggi d'errore. Se incontri delle difficoltà riporta il codice che stai utilizzando.
    il var_dump($row) mi da null
    la query che ho fatto è:
    Codice PHP:
    $query="SELECT * FROM residenti WHERE cod_res = '$cod' ";

    $result=$mysqli->query($query);

    while (
    $row = $result->fetch_object())
    echo
    '
    <tr>
    <td >'
    . $row->cod_res.'</td>
    <td > <input type="text" name="cognome" class="testoB" value="'
    .$row->cognome_res.'"></td>
    <td > <input type="text" name="nome" class="testoB" value="'
    .$row->nome_res.'"></td>
    <td > <input type="text" name="tipoDoc" class="testoB" value="'
    .$row->camera_res.'"> </td>
    <td > <input type="text" name="nDoc" class="textox2" value="'
    . $row->ingresso_res. '"></td> ';

    switch (
    $row['appello']) {
    case
    '1':
    $stato = "presente";
    break;
    case
    '2':
    $stato = "assente";
    break;
    case
    '3':
    $stato = "uscito";
    break;
    default:
    $stato = "ERRORE: codice non riconosciuto";
    }

    echo
    '<td><input type="text" name="anno" class="textox2" value="' . $stato . '"></td>
    </tr>'
    ;
    }
    gli altri campi vengono trovati, solo il valore di appello non viene riconosciuto.
    Grazie

  18. #18
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Usando fetch_object la sintassi diventa
    Codice PHP:
    $row->appello
    Ti manca una parentesi graffa per il blocco del ciclo while, con il codice attuale solo la echo risulta far parte del ciclo, quindi lo switch (e tutto il resto) vengono eseguiti dopo il ciclo, quando $row è nullo per forza. Occhio all'indentazione, se l'avessi usata correttamente ti saresti reso subito conto di questo problema.

    Non stai controllando la presenza di errori nell'esecuzione della query.

    Per questioni puramente estetiche lo switch può essere spostato all'inizio del while, così le echo possono essere messe insieme.

    Mettendo tutto insieme, modificherei così:
    Codice PHP:
    $query = "SELECT * FROM residenti WHERE cod_res = '$cod'";
    $result = $mysqli->query($query);
    if (!
    $result) {
    die(
    "Errore durante l'esecuzione della query: " . $mysqli->error);
    }

    while (
    $row = $result->fetch_object()) {
    switch (
    $row->appello) {
    case
    '1':
    $stato = "presente";
    break;
    case
    '2':
    $stato = "assente";
    break;
    case
    '3':
    $stato = "uscito";
    break;
    default:
    $stato = "ERRORE: codice non riconosciuto";
    }

    echo
    '
    <tr>
    <td>'
    . $row->cod_res . '</td>
    <td><input type="text" name="cognome" class="testoB" value="'
    . $row->cognome_res . '"></td>
    <td><input type="text" name="nome" class="testoB" value="'
    . $row->nome_res . '"></td>
    <td><input type="text" name="tipoDoc" class="testoB" value="'
    . $row->camera_res . '"> </td>
    <td><input type="text" name="nDoc" class="textox2" value="'
    . $row->ingresso_res . '"></td>
    <td><input type="text" name="anno" class="textox2" value="'
    . $stato . '"></td>
    </tr>
    '
    ;
    }

    I suggerimenti che do più spesso:


  19. #19
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Grazie mzanella,
    sei un grande. Funziona perfettamente.
    Grazie mille e buona giornata

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •