2010-12-07 7 views
2

J'ai construit un formulaire sur un site qui capture quelques champs, y compris 'email' et le poste sur une base de données que j'ai avec une table nommée 'données'. J'utilise le plugin jQuery Validate pour m'assurer que tous les champs sont complets, bien que je ne puisse pas avoir d'adresses e-mail en double dans la base de données.Comment vérifier l'entrée en double dans la base de données?

Le plugin est venu avec un script nommé emails.php qu'il appelle lors de la vérification des données sur le terrain et voici le code:

<?php 
$request = trim(strtolower($_REQUEST['email'])); 
$emails = array('[email protected]', '[email protected]', '[email protected]'); 
$valid = 'true'; 
foreach($emails as $email) { 
if(strtolower($email) == $request) 
    $valid = '"Thats already taken."'; 
} 
echo $valid; 
?> 

Cet extrait vérifie uniquement les e-mails répertoriés. Existe-t-il un moyen d'interroger la base de données pour rechercher dans la table 'data' et vérifier les 'emails' pour voir s'il y a un doublon et si possible afficher un message d'erreur si c'est le cas?

En outre, le script semble fonctionner lorsque j'utilise l'un des exemples d'e-mails de sorte qu'il fonctionne essentiellement. J'ai juste besoin de le modifier pour vérifier la base de données.

Répondre

2

Mettez une contrainte d'unicité dans la colonne d'e-mail.

0

Vous aurait juste besoin d'écrire une requête pour vérifier si l'e-mail est dans le tableau:

$query = SELECT count(*) AS `total` FROM `data` WHERE `email` = '{$request}' 
$row = mysql_fetch_assoc(mysql_query($query)); 
if($row['total']) echo false; //exists 
else echo true; //doesn't exist 

modifier destiné à « écho » et non « retour »

1

D'abord, mettre un UNIQUE contrainte dans la colonne e-mail. Puis, arobase, exécutez la requête suivante:

SELECT COUNT(*) as 'count' FROM `data` WHERE email = '[email protected]'; 
0

Vous pouvez le faire peut-être un code php qui vérifie la base de données pour les valeurs existantes à l'aide de la commande mysql_num_rows.

Quelque chose comme ceci:

$result = mysql_query("SELECT email from accounts where email = $email_to_check"); 
$found = mysql_num_rows($result); 

if ($found > 0) { echo "Email already exists"; } 
else ..... 
2

Ne pas utiliser une approche erronée "SELECT avant INSERT". Il y aura toujours une condition de concurrence entre votre «SELECT» et un «INSERT» subséquent, à moins que vous ne soyez dans une transaction globale, ce qui, je le doute, est le cas ici.

Vous devez placer une contrainte UNIQUE sur la colonne de courrier électronique, puis simplement tenter d'INSÉRER le nouvel enregistrement et intercepter l'erreur SQL d'unicité. Vous pouvez attraper l'erreur en vérifiant le code d'erreur, pour MySQL par exemple c'est 1062 ou 23000 selon le pilote.

+0

On m'a pensé que le fait d'attraper des erreurs par conception était une erreur. (Je suis d'accord sur l'unicité, mais je ne suis pas sûr que les erreurs de capture est vraiment la plus propre - je fais normalement ce que webbiedave suggère + traitement des erreurs au cas où deux utilisateurs essayent d'insérer le même e-mail après avoir vérifié qu'il n'existe pas). – Unreason

+0

La capture d'une erreur spécifique connue est une conception valide. Attraper et ignorer toutes les erreurs est une erreur. Si vous ne l'aimez pas, il existe d'autres solutions, par exemple dans MySQL vous pouvez faire un INSERT IGNORE et ensuite vérifier le nombre de lignes affectées (0 lignes signifierait que INSERT a échoué). – rustyx