Visualizzazione risultati 1 fino 14 di 14

Discussione: Database datetime NULL

  1. #1
    tuttainformatica non è connesso Utente giovane
    Data registrazione
    05-03-2020
    Messaggi
    55

    Predefinito Database datetime NULL

    Ciao a tutti,

    Sto cercando di aggiornare dei dati in una tabella del database e ho problemi con il datetime.
    La data è salavata in una variabile php che può anche essere null.

    Quando è null mi da l'errore "incorrect value for column start_date". La colonna nel database l'ho impostata su NULL, se nella query scrivo start_date=NULL funziona.

    Il problema è quando la variabile è null che presumo venga vista come una stringa start_date='$start_date'.

    Ci sono soluzioni?
    Grazie

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

    Predefinito

    Se è il tipo datetime mysql può usare la sintassi senza tra virgolette "singole o doppie". Il classico esempio è per la clausola WHERE
    Codice:
    SELECT campo FROM tabella WHERE campo = 2023-04-20;
    Altrimenti il tipo null in php è empty
    Codice PHP:
    <?php
    $date
    = null;
    if(empty(
    $date)) {
    $stringa = 'stringa in php, non vuol dire anche stringa in mysql se non tra virgolette';
    echo
    $stringa;
    echo
    "'".$stringa."'";
    //La seconda istituzione echo racchiude tra virgolette singole e quindi poiché le virgolette sono output mysql crede è stringa
    $for_where = 'null'; // stringa null solo in php
    }
    Ultima modifica di darbula : 20-04-2023 alle ore 21.38.59

  3. #3
    tuttainformatica non è connesso Utente giovane
    Data registrazione
    05-03-2020
    Messaggi
    55

    Predefinito

    Ma se uso la sintassi senza virgolette e la variabile è null mi da un altro errore:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'start_date=, end_date= WHERE id=1' at line 1

    Mentre questo è l'errore con le virgolette:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'start_date='', end_date='' WHERE id=1' at line 1

    Penso che il problema sia che la variabile è empty... ma saranno 5 anni che uso php e sql possibile che solo ora mi accorgo di questa cosa

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

    Predefinito

    Non confondere il valore null di php con il valore null di mysql.
    Php $var = null; // tipo null
    Se devi convertire in stringa e dunque per mysql come l'esempio della variabile $for_where che è una stringa php con del testo null
    Codice PHP:
    echo 1, null, 2; // output 1, null convertito in stringa vuota e 2
    echo 'null'; // output stringa null
    Ultima modifica di darbula : 22-04-2023 alle ore 13.19.18

  5. #5
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Se ho capito bene, il tuo codice costruisce la query inserendo i valori direttamente. Qualcosa tipo
    Codice PHP:
    $sql = "UPDATE tabella SET start_date = '{$start_date}', end_date = '{$end_date}' WHERE id = '{$id}'";
    Questa è una cattiva idea, perché apre la porta a problemi di sicurezza e, come hai scoperto, non funziona con NULL. Se ad esempio $start_date contiene il valore null, ti ritrovi con questa query
    Codice:
    UPDATE tabella SET start_date = '', end_date = '2023-12-31' WHERE id = '1'
    La versione corretta sarebbe
    Codice:
    UPDATE tabella SET start_date = NULL, end_date = '2023-12-31' WHERE id = '1'
    Sarebbe meglio usare i prepared statement del PHP, che ti permettono di scrivere una query generica con degli spazi predefiniti, e lasciare alla libreria il compito di formattarli correttamente:
    Codice PHP:
    $sql = "UPDATE tabella SET start_date = ?, end_date = ? WHERE id = ?";

    $query = $pdo->prepare($sql);
    $result = $query->exec([ $start_date, $end_date, $id ]);

  6. #6
    tuttainformatica non è connesso Utente giovane
    Data registrazione
    05-03-2020
    Messaggi
    55

    Predefinito

    Si hai ragione, facendo in questo modo funziona.
    Utilizzavo i prepared statement solo nel login, sarebbe meglio che cambio tutte le query? al momento ho fatto tutto con mysqli non prepared statement

  7. #7
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Il mio suggerimento sarebbe prepared statement ovunque

    Per renderti la vita più facile, puoi anche "impacchettarli" in una funzione o classe. Qualcosa tipo (invento):

    Codice PHP:
    function query(mysqli $db, string $sql, array $parametri = []) : mysqli_stmt | false
    {
    $statement = mysqli_prepare($db, $sql);
    $statement->execute($parametri);
    return
    $statement;
    }

    $cosa = query($db, 'SELECT * FROM `cose` WHERE id = ?', [ $id ])->fetch();

  8. #8
    tuttainformatica non è connesso Utente giovane
    Data registrazione
    05-03-2020
    Messaggi
    55

    Predefinito

    Ciao,
    se li impacchetto in una funzione come hai fatto te è ancora possibile utilizzare le transazioni?

    Grazie

  9. #9
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Direi di si: il codice è sempre lo stesso, è solo in un posto diverso.

    Codice PHP:
    $mysqli->begin_transaction();

    $query = 'UPDATE tabella SET x = ? WHERE y = ?';
    # PDO supporta anche 'UPDATE tabella SET x = :x WHERE y = :y'

    query($mysqli, $query, [ 'x' => 3, 'y' => 4 ]);

    # [...]

    $mysqli->commit();
    Ultima modifica di dreadnaut : 11-05-2023 alle ore 03.18.26

  10. #10
    tuttainformatica non è connesso Utente giovane
    Data registrazione
    05-03-2020
    Messaggi
    55

    Predefinito

    Oh grazie mille!!!!

    So di essere un po OT ma visto che abbiamo parlato di sicurezza con le prepared statement... per quanto riguarda il database, metto in hash solo le password il resto dei dati sono scoperti. è giusto? dovrei crittografare tutto il db? tutti i valori?

    EDIT: ho provato ad utilizzare sia la funzione che la query direttamente ma mi da questo errore:
    Codice:
    Fatal error: Uncaught Error: Call to a member function execute() on bool in config.php:18 Stack trace: #0 update.php(7): query(Object(mysqli), 'UPDATE blog_art...', Array)
    Utilizzando un checker della sintassi parrebbe che non gli piaccia questa notazione ":x" dei parametri.

    Grazie mille
    Ultima modifica di tuttainformatica : 10-05-2023 alle ore 00.43.11

  11. #11
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Quanto vuoi criptare dipende dai dati che gestisci, di solito l'essenziale sono le password — che di questi tempi si gestiscono con password_hash e password_verify.

    Citazione Originalmente inviato da tuttainformatica Visualizza messaggio
    Utilizzando un checker della sintassi parrebbe che non gli piaccia questa notazione ":x" dei parametri.
    Colpa mia, ti ho dato un esempio incorretto! Mysqli supporta solo la sintassi ?, mentre PDO supporta sia ? che :campo. Uso di solito la seconda estensione, per abitudine ho messo :x e :y nell'esempio. Correggo sopra per i posteri.
    Ultima modifica di dreadnaut : 11-05-2023 alle ore 03.19.38

  12. #12
    tuttainformatica non è connesso Utente giovane
    Data registrazione
    05-03-2020
    Messaggi
    55

    Predefinito

    Ciao,
    c'è un altro errore che forse non hai notato; con mysqli mi risulta che non sia possibile inserire i paramentri dentro excute() ma bisogna passare per bind_param().

    A questo punto una domanda sorge spontanea: continuo ad utilizzare mysqli o passo a PDO che è (forse) più pratico?

    Grazie

  13. #13
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Mmmh, chiamare execute con i parametri dovrebbe essere possibile — avevo controllato
    Vedi https://www.php.net/manual/en/mysqli-stmt.execute.php, e l'esempio #2.

    Per la "praticità", non saprei cosa dirti. Mi trovo molto bene con PDO, ma magari è solo abitudine?

  14. #14
    tuttainformatica non è connesso Utente giovane
    Data registrazione
    05-03-2020
    Messaggi
    55

    Predefinito

    Ciao,
    Hai ragione è possibile mettere i paramenti in execute() basta ricordarsi di aggiornare la versione di PHP...

    Ora funziona tutto e a questo punto continuo con mysqli.
    Grazie!!!

Regole di scrittura

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