2010-02-25 19 views
7

come si impedisce l'inserimento di record duplicati in php mysql? convalida dell'input prima dell'inserimento nella tabella.impedendo l'inserimento di righe duplicate in php/mysql

Attualmente sto creando una sezione di registrazione utente per il mio sito Web ma desidero presentarli con un errore se nel database si trova un nome utente o un indirizzo email duplicato.

EDIT
Questo è quello che ho da lontano per inserire righe ... come faccio a implementare sia queste risposte qui:

<?php 
     if (array_key_exists('confirm',$_POST)) { 

       $Cuser = $_POST['Cuser']; 
       $Cemail = $_POST['Cemail']; 
       $Cpassword = $_POST['Cpassword']; 
       $md5password = md5($_POST['Cpassword']); 

       mysql_query("INSERT INTO tbl_users (`username`,`email`,`password`) 
VALUES ('$Cuser', '$Cemail', '$md5password')"); 

       echo "Thank you. The user <b>".$Cuser."&nbsp;(".$Cemail.")</b> has been successfully added to the database.<p> 

       <a href='myaccount.php' class='form'>Return</a>";  

       exit; 
     } 
     ?> 

Sto indovinando che ho potuto realizzare tutto questo in un se ... altra affermazione?

risposta

1

ho usato l'istruzione sql insieme a un'istruzione if else.

mysql_select_db($database_speedycms, $speedycms); 
$query_usercheck = "SELECT * FROM tbl_users WHERE username='$user' OR email='$email'"; 
$usercheck = mysql_query($query_usercheck, $speedycms) or die(mysql_error()); 
$row_usercheck = mysql_fetch_assoc($usercheck); 
$totalRows_usercheck = mysql_num_rows($usercheck); 

poi

if ($totalRows_usercheck > 0) 

visualizzazione un messaggio di errore per evitare i duplicati vengano aggiunti

altrimenti permettono banca dati inserire

17

definire i vincoli unici per le colonne nome utente e-mail:

ALTER TABLE your_table ADD CONSTRAINT uk_username UNIQUE (username) 
ALTER TABLE your_table ADD CONSTRAINT uk_email UNIQUE (email) 

Se il valore di tentare di essere insertered o aggiornato esiste già nella tabella, MySQL restituisce un errore che indica la query viola il vincolo univoco appropriato (forse entrambi). Spetta a te impostare PHP per gestirlo con garbo.

+1

+1 per una corretta progettazione del database over "gestire nel codice " – sholsinger

3

Prima di inserire, eseguire un qualcosa di un'istruzione SQL come

SELECT * FROM users WHERE users.name = :name OR users.email = :email 

(utilizzando parametrized SQL) e contare il numero di righe restituite.

Se c'è più di 0, c'è un duplicato.

OMG Ponies ha suggerito vincoli su questi due campi, che è anche un'ottima idea per impedire di commettere errori nel database. Tuttavia, se si inserisce un duplicato, tutto ciò che otterrà sarà un messaggio di errore del database che si potrebbe desiderare o meno di provare ad analizzare.

+0

ho usato l'istruzione sql insieme a un'istruzione if else. mysql_select_db ($ database_speedycms, $ speedycms); $ query_usercheck = "SELECT * FROM tbl_users WHERE username = '$ user' O email = '$ email'"; $ usercheck = mysql_query ($ query_usercheck, $ speedycms) o die (mysql_error()); $ row_usercheck = mysql_fetch_assoc ($ usercheck); $ totalRows_usercheck = mysql_num_rows ($ usercheck); poi if ($ totalRows_usercheck> 0) visualizzazione un messaggio di errore per evitare i duplicati vengano aggiunti altrimenti permettono banca dati inserire – methuselah

+1

Una query è meglio di due –

+0

Forse. Ammetto di non aver mai provato in quel modo. –