Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    "insert to" inserire valori in tabelle diverse

    Ciao a tutti!
    Ho un problema nell'inserimento di dati nel mio database su un ristorante.
    Vorrei fare la prenotazione del tavolo( se questo è disponibile) e inserire i dati forniti dal cliente, nella rispettiva tabella:
    CLIENTE(idCliente, nome, cognome, email, telefono)
    ed inserire pure la data e l'ora selezionati dal cliente, nella rispettiva tabella:
    PRENOTAZIONI(data,ora,numero_tavolo,idCliente,idRistorante).
    O forse, dovrei fare diversamente?
    I dati del cliente riesce ad inserirli, quelli della prenotazione no !

    eccovi il mio tentativo
    <?php
    mysql_connect("localhost","root","");
    mysql_select_db("progetto_db");




    $nome = $_POST['nome'];
    $cognome = $_POST['cognome'];
    $email = $_POST['email'];
    $telefono = $_POST['telefono'];
    $coperti = $_POST['coperti'];
    $data = $_POST['data'];
    $ora = $_POST['ora'];






    $disponibile= "SELECT numero
    FROM tavolo
    WHERE tavolo.posti>='$coperti'
    AND tavolo.numero NOT IN (SELECT numero
    FROM prenotazione)"; // SE CI SONO TAVOLI LIBERI

    $result = mysql_query($disponibile);
    if($result){
    $toinsert1 = "INSERT INTO cliente // INSERISCO I DATI DEL CLIENTE
    (nome, cognome, email, telefono)
    VALUES
    ('$nome',
    '$cognome',
    '$email',
    '$telefono')";

    }


    $result1 = mysql_query($toinsert1); // SE SI SONO INSERITI I DATI DEL CLIENTE, INSERISCO QUELLI DELLA PRENOTAZIONE
    if($result1){

    $toinsert2 = "INSERT INTO prenotazione
    (data, ora)
    VALUES
    ('$data2',
    '$ora')";
    }
    $result2= mysql_query($toinsert2);
    if($result2){
    echo("<br>Inserimento avvenuto correttamente");
    } else{
    echo("<br>Inserimento non eseguito");
    }
    ?>

    come ho detto, fa solo l'inserimento dei dati clienti ed incrementa l'id cliente, e la prenotazione?!?
    Spero possiate aiutarmi, grazie in anticipo!!!

  2. #2
    Ciao,

    nello stesso IF in cui inserisci i dati del Cliente inserisci anche i dati della prenotazione.

    Per fare una cosa fatta bene dovresti avviare una transazione con START TRANSACTION.

    Fare tutte le insert e se tutto é andato a buon fine COMMIT altrimenti ROLLBACK
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  3. #3
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Inoltre in ordine sparso...
    ... mysql è deprecato, suggerito usare PDO o alla peggio mysqli...
    ... una transazione potrebbe non bastarti se vuoi la certezza di una prenotazione senza collisioni e non sei in modo serializable...
    siccome immagino sia a concorrenza bassissima potresti addirittura piazzarci un LOCK per il test.
    ... infine numero_tavolo perchè è in neretto, se nella insert lo ignori bellamente?

  4. #4
    Quote Originariamente inviata da bomberdini Visualizza il messaggio
    Ciao,

    nello stesso IF in cui inserisci i dati del Cliente inserisci anche i dati della prenotazione.

    Per fare una cosa fatta bene dovresti avviare una transazione con START TRANSACTION.

    Fare tutte le insert e se tutto é andato a buon fine COMMIT altrimenti ROLLBACK

    Perdona l'ignoranza ma è la prima volta che mi cimento in una cosa simile, non sono riuscita a venirne a capo... potresti spiegare più in dettaglio ? Grazie !

  5. #5
    Quote Originariamente inviata da MySQL Visualizza il messaggio
    Inoltre in ordine sparso...
    ... mysql è deprecato, suggerito usare PDO o alla peggio mysqli...
    ... una transazione potrebbe non bastarti se vuoi la certezza di una prenotazione senza collisioni e non sei in modo serializable...
    siccome immagino sia a concorrenza bassissima potresti addirittura piazzarci un LOCK per il test.
    ... infine numero_tavolo perchè è in neretto, se nella insert lo ignori bellamente?

    Sarà deprecato, ma sono "gli ordini" del professore, purtroppo devo attenermi alla sua richiesta.
    Sì cmq...dovrei considerare anche il numero_tavolo! Grazie !

  6. #6
    Quote Originariamente inviata da Arancina91 Visualizza il messaggio
    Perdona l'ignoranza ma è la prima volta che mi cimento in una cosa simile, non sono riuscita a venirne a capo... potresti spiegare più in dettaglio ? Grazie !
    Dovresti scrivere un qualcosa del genere :

    codice:
    try {
        mysqli_query("START TRANSACTION");
    
        INSERT INTO CLIENTE.......
        INSERT INTO PRENOTAZIONE ......
    
        mysqli_query("COMMIT");
    } catch (Exception $e) {
        //SE SI E' VERIFICATA UNA ECCEZIONE ANNULLO TUTTO
        mysqli_query("ROLLBACK");
    }
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  7. #7
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Nel caso della transazione ci andrebbe pure
    codice:
    SET TRANSACTION SERIALIZABLE;

  8. #8
    Quote Originariamente inviata da Arancina91 Visualizza il messaggio
    Ciao a tutti!
    Ho un problema nell'inserimento di dati nel mio database su un ristorante.
    Vorrei fare la prenotazione del tavolo( se questo è disponibile) e inserire i dati forniti dal cliente, nella rispettiva tabella:
    CLIENTE(idCliente, nome, cognome, email, telefono)
    ed inserire pure la data e l'ora selezionati dal cliente, nella rispettiva tabella:
    PRENOTAZIONI(data,ora,numero_tavolo,idCliente,idRistorante).
    O forse, dovrei fare diversamente?
    I dati del cliente riesce ad inserirli, quelli della prenotazione no !

    eccovi il mio tentativo
    <?php
    mysql_connect("localhost","root","");
    mysql_select_db("progetto_db");




    $nome = $_POST['nome'];
    $cognome = $_POST['cognome'];
    $email = $_POST['email'];
    $telefono = $_POST['telefono'];
    $coperti = $_POST['coperti'];
    $data = $_POST['data'];
    $ora = $_POST['ora'];






    $disponibile= "SELECT numero
    FROM tavolo
    WHERE tavolo.posti>='$coperti'
    AND tavolo.numero NOT IN (SELECT numero
    FROM prenotazione)"; // SE CI SONO TAVOLI LIBERI

    $result = mysql_query($disponibile);
    if($result){
    $toinsert1 = "INSERT INTO cliente // INSERISCO I DATI DEL CLIENTE
    (nome, cognome, email, telefono)
    VALUES
    ('$nome',
    '$cognome',
    '$email',
    '$telefono')";

    }


    $result1 = mysql_query($toinsert1); // SE SI SONO INSERITI I DATI DEL CLIENTE, INSERISCO QUELLI DELLA PRENOTAZIONE
    if($result1){

    $toinsert2 = "INSERT INTO prenotazione
    (data, ora)
    VALUES
    ('$data2',
    '$ora')";
    }
    $result2= mysql_query($toinsert2);
    if($result2){
    echo("<br>Inserimento avvenuto correttamente");
    } else{
    echo("<br>Inserimento non eseguito");
    }
    ?>

    come ho detto, fa solo l'inserimento dei dati clienti ed incrementa l'id cliente, e la prenotazione?!?
    Spero possiate aiutarmi, grazie in anticipo!!!
    Ciao Arancina 91,
    In questi casi è utile stampare a video la query per vedere se contiene quello che ti aspetti.

    Codice PHP:
    if($result2){
    echo(
    "<br>Inserimento avvenuto correttamente");
    } else{
    echo(
    "<br>Inserimento non eseguito<br>".$toinsert2);

    Forse l'errore dipende dal fatto che valorizzi la variabile $data e poi utilizzi la variabile $data2 ?

  9. #9
    Quote Originariamente inviata da MySQL Visualizza il messaggio
    Nel caso della transazione ci andrebbe pure
    codice:
    SET TRANSACTION SERIALIZABLE;
    Ciao,

    perché in questo caso pensi sia meglio impostare la transazione come SERIALIZABLE invece di lasciarla a REPEATABLE READ (default) ?
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  10. #10
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Quote Originariamente inviata da bomberdini Visualizza il messaggio
    Ciao,

    perché in questo caso pensi sia meglio impostare la transazione come SERIALIZABLE invece di lasciarla a REPEATABLE READ (default) ?
    Perchè la configurazione della transazione con SELECT+INSERT è proprio il caso in cui il livello di default consente l'inserimento (edit: anche eliminazione) di righe tra la select e l'insert.
    Mentre serializable no.

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 © 2021 vBulletin Solutions, Inc. All rights reserved.