Php e mysql, estrazione da una tabella e inserimento in un'altra tabella

SiKei2

Nuovo Utente
19 Mag 2016
8
0
1
28
Buonasera,
Sono uno studente e devo realizzare un sito simile a JustEat. Sto utilizzando XAMPP come Web services e utilizzo come linguaggi di programmazione PHP e HTML. E' qualche giorno che sono bloccato e non riesco ad andare avanti: quando l'utente si trova sulla pagina che mostra il carrello deve aver la possibilità di confermare il carrello, infatti ho aggiunto un bottone(submit) che, nel momento in cui viene premuto, richiama la pagina in php che si dovrebbe occupare di selezionare i dati nella tabella carrello ed estrarli (SELECT, fetch_assocc()) e inserirli nella tabella ordine (INSERT INTO). Il problema è che la query di inserimento si esegue senza generare errori ma, mi crea solo una riga vuota nel DB.
Come posso risolvere?
Vi posto qui 2 foto delle tabelle sopra citate e il codice che si occupa delle query.
Grazie mille in anticipo.


Carrello.JPG


Ordine.JPG





PHP:
<?php
session_start();
$_SESSION['utente'];
$_SESSION['indirizzo'];
$_SESSION['civico'];
?>
<html>
    <head><title>Ordine</title></head>
    <body>
    <?php
    $host="localhost";     // Host name
    $username="root";     // Mysql username
    $password="";         // Mysql password
    $db_name="sito";     // Database name
    $ID_ristorante=$_GET['ID_ristorante'];
    $utente=$_SESSION['utente'];
    $indirizzo=$_SESSION['indirizzo'];
    $civico=$_SESSION['civico'];
   

    // Connect to server and select database.
    $conn=mysql_connect("$host", "$username", "$password")or die("Errore di connessione".mysql_error());
    mysql_select_db($db_name, $conn)or die("Impossibile accedere al database richiesto".mysql_error());

    $q_mostra="SELECT carrello.ID_carrello, carrello.nome_portata, carrello.descrizione, carrello.prezzo, carrello.quantita, carrello.totale_parziale, carrello.data_carrello, carrello.ora_carrello FROM carrello WHERE carrello.ID_utente='$utente' AND carrello.ID_ristorante='$ID_ristorante' ";
   
    $q_totale="SELECT SUM(carrello.totale_parziale) AS tot FROM carrello WHERE carrello.ID_utente='$utente' AND carrello.ID_ristorante='$ID_ristorante'";
   
    $q_ordine="INSERT INTO ordine (ID_ristorante, ID_utente, ID_carrello, nome_portata, descrizione, quantita, totale_parziale, data_ordine, ora_ordine) VALUES ('$ID_ristorante','$utente','$carrello','$nome_portata','$descrizione','$quantita','$totale_parziale','$data_carrello','$ora_carrello')";


    $ris_mostra=mysql_query($q_mostra);
    $ris_totale=mysql_query($q_totale);
    if(!$ris_mostra && !$ris_totale){
        echo "Query non eseguita";
    }
    //Conta quante righe ha prodotto la ricerca
    $num_mostra=mysql_num_rows($ris_mostra);
    if($num_mostra > 0){
        $totale = mysql_fetch_assoc($ris_totale);
        $totale_finale = $totale['tot'];
        while($dato=mysql_fetch_assoc($ris_mostra)){
            $carrello=$dato['ID_carrello'];
            $nome_portata= $dato['nome_portata'];//estrazione del nome e salvataggio nella variabile
            $descrizione= $dato['descrizione'];//estrazione della descrizione e salvataggio nella variabile
            $prezzo= $dato['prezzo'];//estrazione del prezzo e salvataggio nella variabile
            $quantita= $dato['quantita'];//estrazione della quantità e salvataggio nella variabile
            $totale_parziale= $dato['totale_parziale'];//estrazione del prezzo e salvataggio nella variabile
            $data_carrello=$dato['data_carrello'];
            $ora_carrello=$dato['ora_carrello'];
            $ris_ordine=mysql_query($q_ordine);
        }
       
    }




    mysql_close($conn);
    ?>
    </body>
</html>
 
Ciao, in poche parole tu, quando l'utente aggiunge un articolo sul carrello, lo carichi su una tabella? E dopo, quando conferma, vuoi estrarre dalla tabella quest'ultimi per poi caricarli su un altra tabella?
 
  • Like
Reactions: SiKei2
Io fossi in te intanto lascerei perdere le funzioni mysql che sono deprecate, e passerei subito a mysqli o PDO.
Inoltre, visto che sei uno studente e quindi a meno che tu non debba per forza fare questo doppio passaggio nel db, il carrello temporaneo lo salvere in modo diverso.

Ad esempio io ho ina classe cart.class.php (se vuoi darci un'occhiata te la allego) che il temporaneo lo slava in file xml, poi quando recuperi i dati da questo file, anche in un secondo momento quindi, fai la INSERT per confermare definitivamente l'ordine.
 

Allegati

Secondo me non è molto conveniente. Potresti più semplicemente utilizzare una tabella carrello dove ogni qual volta un utente aggiunge un articolo nel carrello tu aggiungi un record, con magari id_legame_articolo, dove inserirai l'id dell'articolo.

Tutto ciò secondo me.
 
  • Like
Reactions: Rikk73
Rikk73 so che MySQL è obsoleto ed è meglio utilizzare PDO ma dato che ho già scritto la maggior parte delle altre pagina con la MySql tradizionale non mi conviene cambiare tutto ora. Inoltre nemmeno lo hanno spiegato a scuola PDO, è meglio utilizzare quindi un linguaggio di programmazione che conosco meglio.

Nicola non ho capito cosa intendi. Io h bisogno di tirar giù i dati da una tabella e inserirli in un'altra tabella. Tu quali modifiche apporteresti al mio codice?

Grazie a entrambi comunque
 
prova a fare un var_dump($dato) dopo che lo hai valorizzato, prima di $ris_ordine e guarda se il problema sta nella valorizzazione delle variabili da inserire nella tabella
 
Ora provo, comunque il problema secondo me è che mi estrae tutti i dati della tabella in un colpo solo e quindi l'INSERT INTO non riesce ad inserire un dato preciso. Dovrebbe invece estrarre un dato alla volta e inserirlo nell'altra tabella.
Capito?
 
Io intendevo dire che è proprio sbagliata la logica.. Comunque per estrarre e inserire in una nuova tabella il record appena estratto devi eseguire una query di inserimento dentro al ciclo di estrazione. Prova e vedrai che se non ci sono errori di sintassi funziona.

Saluti
 
Nicola, scusa, io è proprio quello che faccio, dentro il while che estrae i dati faccio eseguire la query che inserisce. Cosa c'è di sbagliato quindi?
 
Crea la query direttamente dentro al ciclo.

PHP:
<?php
session_start();
$_SESSION['utente'];
$_SESSION['indirizzo'];
$_SESSION['civico'];
?>
<html>
 <head><title>Ordine</title></head>
 <body>
<?php
 $host="localhost"; // Host name
 $username="root"; // Mysql username
 $password=""; // Mysql password
 $db_name="sito"; // Database name
 $ID_ristorante=$_GET['ID_ristorante'];
 $utente=$_SESSION['utente'];
 $indirizzo=$_SESSION['indirizzo'];
 $civico=$_SESSION['civico'];
 

 // Connect to server and select database.
 $conn=mysql_connect("$host", "$username", "$password")or die("Errore di connessione".mysql_error());
 mysql_select_db($db_name, $conn)or die("Impossibile accedere al database richiesto".mysql_error());

 $q_mostra="SELECT carrello.ID_carrello, carrello.nome_portata, carrello.descrizione, carrello.prezzo, carrello.quantita, carrello.totale_parziale, carrello.data_carrello, carrello.ora_carrello FROM carrello WHERE carrello.ID_utente='$utente' AND carrello.ID_ristorante='$ID_ristorante' ";
 
 $q_totale="SELECT SUM(carrello.totale_parziale) AS tot FROM carrello WHERE carrello.ID_utente='$utente' AND carrello.ID_ristorante='$ID_ristorante'";
 
 


 $ris_mostra=mysql_query($q_mostra);
 $ris_totale=mysql_query($q_totale);
 if(!$ris_mostra && !$ris_totale){
 echo "Query non eseguita";
 }
 //Conta quante righe ha prodotto la ricerca
 $num_mostra=mysql_num_rows($ris_mostra);
 if($num_mostra > 0){
  $totale = mysql_fetch_assoc($ris_totale);
   $totale_finale = $totale['tot'];

 while($dato=mysql_fetch_assoc($ris_mostra)){

    $carrello=$dato['ID_carrello'];
       $nome_portata= $dato['nome_portata'];//estrazione del nome e salvataggio nella variabile
           $descrizione= $dato['descrizione'];//estrazione della descrizione e salvataggio nella variabile
                $prezzo= $dato['prezzo'];//estrazione del prezzo e salvataggio nella variabile
                       $quantita= $dato['quantita'];//estrazione della quantità e salvataggio nella variabile
                                $totale_parziale= $dato['totale_parziale'];//estrazione del prezzo e salvataggio nella variabile
                                     $data_carrello=$dato['data_carrello'];
                                               $ora_carrello=$dato['ora_carrello'];

#CODICE DI INSERIMENTO NUOVA TABELLA
$q_ordine="INSERT INTO ordine (ID_ristorante, ID_utente, ID_carrello, nome_portata, descrizione, quantita, totale_parziale, data_ordine, ora_ordine) VALUES ('$ID_ristorante','$utente','$carrello','$nome_portata','$descrizione','$quantita','$totale_parziale','$data_carrello','$ora_carrello')";


 $ris_ordine=mysql_query($q_ordine);
#FINE CODICE INSERIMENTO NUOVA TABELLA

 }
 
 }




 mysql_close($conn);
 ?>
 </body>
</html>
 
Nicola, sei un mago? FUNZIONA! Grazie mille davvero. Quindi scrivere prima la query ed eseguirla dopo, al posto che scriverla ed eseguirla nello stesso momento ha questa differenza?! Mi sarà d'aiuto d'ora in poi!! Ancora mille grazie a entrambi.
 

Discussioni simili