PDA

Visualizza la versione completa : Inserimento doppio involontario in mysql tramite php


Ale17
18-01-2020, 12:19
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:



<?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

Alhazred
18-01-2020, 13:07
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:


$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


$result = mysqli_query($conn, $comando);

if ( ! $result )
...



oppure


// 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


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 è


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


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.

Ale17
19-01-2020, 10:21
Grazie davvero!

Alhazred
19-01-2020, 11:49
Correggo una mia correzione, ieri andando di corsa ho commesso anche io un errore.

Ti ho detto che il controllo corretto per l'if è


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


if ( $nome == '' || $cognome == '' || $età == '' )


ed a voler essere pignoli


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.

Ale17
19-01-2020, 11:55
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

Alhazred
19-01-2020, 14:25
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 &&

Loading