Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2019
    Messaggi
    19

    Inserimento doppio involontario in mysql tramite php

    Ciao ragazzi,
    ho scritto il codice di una pagina che tramite un form inserisce una nuova riga all'interno di una tabella (persons) in un database (person_db), praticamente ogni riga della tabella contiene 4 campi (idPersona, Nome, Cognome, Età).
    Dopo aver inviato i dati del form voglio che la pagina php stampi la tabella aggiornata con i nuovi dati, funziona tutto a parte il fatto che ogni volta che inserisco una persona tramite il form questa viene inserita due volte nella tabella.
    La chiave primaria è l'idPersona che si auto incrementa.

    Questo è il codice:

    codice:
    <?php
    //Lab MySql esercizi introduttivi
    //Esercizio 1.2
    $nome=$_POST['Inome'];
    $cognome=$_POST['Icognome'];
    $età=$_POST['Ietà'];
    
    
    $conn=mysqli_connect("localhost", "root", "");
    
    
    if(!$conn)
    {
    		mysqli_close($conn);
    		die("problemi nello stabilire la connessione<br>");
    }
    
    
    //se non esiste il database lo creo, la funzione contiene l'esercizio 1.1
    if(!mysqli_select_db($conn, "person_db"))
    {
    	mysqli_close($conn);
    	die("Errore di accesso al database person_db<br>");
    }
    
    if (!$nome && !$cognome && !$età)
    	die("Devi inserire dei dati<br>
    		 <a href='inserisci.php'>Nuovo inserimento</a>");
    
    
    else
    {
    	$comando="INSERT INTO persons (Nome, Cognome, Età) VALUES ('$nome', '$cognome', '$età')";
    	$result=mysqli_query($conn, $comando);
    
    
    	if (!mysqli_query($conn, $comando))
    		echo "Inserimento fallito";
    	else
    	{	
    		echo "Inserimento completato, questa è la tabella aggiornata:";
    		$comando="SELECT * FROM persons";
    		$result=mysqli_query($conn, $comando);
    	
    		echo "<table border='1'>
    	  
    		  <tr><td colspan='4' style='text-align:center; color:red'>TABELLA Persons</td></tr>
    		  <tr style='font-weight:bold; color:blue'>
    		  <td>IdPersona</td>
    		  <td>Nome</td>
    		  <td>Cognome</td>
    		  <td>Età</td>
    		  </tr>";
    	  
    			while ($dati=mysqli_fetch_array($result))
    			{
    				echo "<tr>
    				      <td>$dati[idPersona]</td>
    					  <td>$dati[Nome]</td>
    					  <td>$dati[Cognome]</td>
    					  <td>$dati[Età]</td>
    					  </tr>";
    			}
    
    
    		echo "</table>";
    	}
    }
    //chiudo la connessione
    mysqli_close($conn);
    
    ?>
    Grazie a chiunque possa aiutarmi

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,923
    Nel codice che hai scritto, oltre al problema del doppio inserimento, ci sono anche altri errori.
    Partiamo dall'oggetto della discussione, il doppio inserimento.
    Il problema sta qui:
    Codice PHP:
    $comando="INSERT INTO persons (Nome, Cognome, Età) VALUES ('$nome', '$cognome', '$età')";

    // Qui esegui la query
    $result mysqli_query($conn$comando);

    // qui la esegui di nuovo, da cui il secondo inserimento
    if ( ! mysqli_query($conn$comando) )
        echo 
    "Inserimento fallito"

    O fai
    Codice PHP:
    $result mysqli_query($conn$comando);

    if ( ! 
    $result )
    ... 

    oppure
    Codice PHP:
    // elimini questa riga
    // $result = mysqli_query($conn, $comando);

    // ed esegui direttamente la query nell'if
    if ( ! mysqli_query($conn$comando) )
    ... 

    Altri problemi:
    tu fai questo controllo
    Codice PHP:
    if ( ! $nome && ! $cognome && ! $età 
    dentro questo if ci andrai solo se l'utente non scrive nulla perché dice "Se non hai inserito né il nome, né il cognome, né l'età...", quindi basta che l'utente scriva uno solo di quei dati e per il tuo controllo è tutto ok.
    Se tutti e 3 quei dati sono obbligatori, il controllo corretto è
    Codice PHP:
    if ( ! $nome || ! $cognome || ! $età 
    che vuol dire "Se non hai inserito il nome, oppure non hai inserito il cognome, oppure non hai inserito l'età..."

    Ad un certo punto scrivi
    Codice PHP:
    if( ! $conn )
    {
        
    mysqli_close($conn);
        die(
    "problemi nello stabilire la connessione<br>");

    Se la connessione fallisce, non c'è nessuna connessione da chiudere con mysqli_close(), essendo fallita non è mai stata aperta, se finisci lì dentro, PHP ti mostrerà un errore perché a mysqli_close() stai passando un booleano (false) invece dell'handle ad una connessione.
    Ultima modifica di Alhazred; 18-01-2020 a 13:12

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2019
    Messaggi
    19
    Grazie davvero!

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,923
    Correggo una mia correzione, ieri andando di corsa ho commesso anche io un errore.

    Ti ho detto che il controllo corretto per l'if è
    Codice PHP:
    if ( ! $nome || ! $cognome || ! $età 
    in realtà anche questo non va bene, perché se l'utente lascia un campo vuoto non ti arriva "false" ma ti arriva la stringa vuota, quindi
    Codice PHP:
    if ( $nome == '' || $cognome == '' || $età == '' 
    ed a voler essere pignoli
    Codice PHP:
    if ( trim($nome) == '' || trim($cognome) == '' || trim($età) == '' 
    perché l'utente potrebbe inserire uno o più spazi facendo risultare la stringa diversa da quella vuota, il trim() li elimina.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2019
    Messaggi
    19
    Quote Originariamente inviata da Alhazred Visualizza il messaggio

    Codice PHP:
    if ( trim($nome) == '' || trim($cognome) == '' || trim($età) == '' 
    Questo se io volessi che l'utente non lasci nessun campo vuoto, giusto?
    Perché il mio codice era fatto in modo che l'importante fosse che almeno uno dei campi fosse compilato

  6. #6
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,923
    Quote Originariamente inviata da Ale17 Visualizza il messaggio
    Questo se io volessi che l'utente non lasci nessun campo vuoto, giusto?
    Perché il mio codice era fatto in modo che l'importante fosse che almeno uno dei campi fosse compilato
    Sì, questo verifica che tutti i campi siano compilati, se invece te ne basta uno solo compilato allora sostituisci gli || con &&

Tag per questa discussione

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