Mysql
 sql >> Database >  >> RDS >> Mysql

Non riesco a prevenire input di nomi duplicati

Ci sono alcune cose che non vanno qui.

Stai usando una parola chiave MySQL list come funzione, e solo questo ti causerà problemi.

Nota a margine:Sì, lo so che non è una parola "riservata", è una "parola chiave" e MySQL tratta le parole chiave specialmente se utilizzate come una funzione, che è ciò che stai facendo ora nella tua seconda query , ed è il modo in cui MySQL lo interpreta come; una funzione anziché un nome di dichiarazione di tabella.

Ti suggerisco di rinominare la tabella in elenchi o di racchiuderla tra segni di spunta.

Stai anche mescolando API/funzioni MySQL che non si mescolano.

Quindi il tuo nuovo codice verrebbe letto come,
mentre lasci cadere $selected = mysql_connect('christmas', $dbhandle);

$query = mysqli_query($dbhandle, "SELECT * FROM `list` WHERE name='$name'") 
        or die (mysqli_error($dbhandle));

if(mysqli_num_rows($query) > 0){
    echo 'that name already exists';
}else{
    mysqli_query($dbhandle, "INSERT INTO `list` (name, one, two, three, four, five, six, seven, eight) 
                VALUES ('$name' , '$one' , '$two' , '$three' , '$four' , '$five' , '$six', '$seven' , '$eight')") 
                 or die (mysqli_error($dbhandle));

}


mysqli_close($dbhandle);

Il tuo codice è anche aperto a un'iniezione SQL. Usa una dichiarazione preparata.

Ora, non abbiamo idea di dove provengano tutte le tue variabili.

Usa la segnalazione degli errori.

Ti suggerisco anche di usare un condizionale empty() per le tue variabili/input.

In caso contrario, potresti ricevere anche altri errori di cui MySQL potrebbe lamentarsi.

Cioè:

if(!empty($var)){...}

Infine e per assicurarti che non ci siano voci duplicate nel tuo database, puoi impostare un vincolo UNICO.