Requete sql vérifiez si déjà dans la base

  • Auteur de la discussion Auteur de la discussion JeunZ
  • Date de début Date de début
WRInaute accro
Existe il une requete sql qui vérifie si une valeur est déjà insérée dans la base de donnée?


En fait je veux mettre dans une table des emails, un champ id, et un champ email, mais je ne veux pas de doublons au niveau des emails.

Donc je vais mettre le champs email en unique, mais je suppose que si je tente de mettre un email en double ca va faire une erreur et l'afficher disant que on ne peut insérer car c'est un champs unique et que la valeur est déjà dans la table.

Donc je voudrais vérifier avant de tenter l'insertion si la valeur existe déjà.

Sans faire une boucle bien sur, ou sans petites astuces qui consomment trop de ressources. Il doit bien exister quelque chose qui fasse ça de base non?

Genre if exist ou je ne sais quoi :-)
 
WRInaute impliqué
Soit tu select count(*) avant, pour savoir combien d'elements il existe avant...

0 => ca existe pas
>0 => ca existe.

Soit tu insert, et tu geres l'erreur en arriere-plan...
Genre
if (erreur_sql)
{
retry_another_email();
}
else
{
next_function();
}
 
WRInaute discret
Moi je mettrais une clé primaire sur le champ email, et à la place du champ id je prefererais generer une chaine de 37 caracteres alphanum aleatoires...

Ensuite une seule requete suffit pour inserer tes mails sans doublons possible :

un simple insert.


Si l'email n'existait pas l'insert se passe sans probleme, sinon il y aura une erreur à cause de la clé primaire qui interdit l'insertion.


if($result=@mysql_query("insert email, chaine_aleatoire into table...")) echo "Insertion reussi";
else echo"Echec ou L'email existe dejà";


avec le @ derrière mysql_query pour ne pas afficher les erreusr sql à l'ecran.
 
Nouveau WRInaute
Salut, moi je te propose cette solution (qui n'est pas forcément la meilleure):
Code:
$sql_verification = mysql_query('SELECT * FROM table WHERE email =\''.$email.'\'');
$verification = mysql_num_rows($sql_verification);

et ensuite, avec un if, on verifie
Code:
if($verification == 0)
{
echo 'OK, pas de doublon';
}else{
echo 'l\'adresse email existe deja...';
}

Voilà ma méthode!!

++
 
WRInaute discret
j'utilise la même méthode que amy e je me demandais la même chose que Jeunz, à savoir si il n'existe pas déja une fonction pour inserer sans duplicate.
 
WRInaute accro
// Ajout à la newsletter
function mysql_die($error = "inconnue"){}
$db = mysql_connect("localhost","xxxxxxxxxx","xxxxxxxxxxxxx");
mysql_select_db("xxxxxxxxxxxxxxxx",$db);
$query_connecte = "INSERT Into newsletter VALUES ('','$mail','1')";
$result_connecte = @mysql_query($query_connecte, $db) or mysql_die("Connexion impossible");
mysql_close($db);

j'ai utilisé ça et ça marche impec !.
 
Nouveau WRInaute
C'est bizarre, je ne comprends pas bien ce code.... et je ne vois pas comment ca se fait ca peut marcher.... enfin si tu le dis,...
je le testerai prochainement alors... tache de ne pas effacer ce code ;)
merci d'avance :)
 
WRInaute impliqué
La seule solution "propre" est de déclarer ton champs email en clé unique voire primaire et d'intercepter le résultat de l'insertion.

Ce n'est pas pour rien que les clés uniques ont été inventées.
 
WRInaute occasionnel
$query_connecte = "INSERT Into newsletter VALUES ('','$mail','1')";

je me permets un petit conseil: utilise plutot une syntaxe comme
Code:
INSERT INTO newsletter (`mail`,`status`) VALUES ('$mail', '1')
ça change pas grand chose, mais ta requête reste valable (et valide) si jamais tu dois ajouter / supprimer des champs. ça t'es jamais arrivé de devoir retoucher des requêtes dans inscription.php parce que tu avais ajouté ou retiré un champ de la table ? ;)
 
WRInaute accro
Didier_S a dit:
$query_connecte = "INSERT Into newsletter VALUES ('','$mail','1')";

je me permets un petit conseil: utilise plutot une syntaxe comme
Code:
INSERT INTO newsletter (`mail`,`status`) VALUES ('$mail', '1')
ça change pas grand chose, mais ta requête reste valable (et valide) si jamais tu dois ajouter / supprimer des champs. ça t'es jamais arrivé de devoir retoucher des requêtes dans inscription.php parce que tu avais ajouté ou retiré un champ de la table ? ;)


Ah merci j'apprend quelque chose :-)
 
WRInaute discret
j'ai reçu ta newsletter jeunz :)

A ta place je ne ferais pas mes liens de desinscriptions sous cette forme :

desinscription.php?id=email@domaine.tld

car un petit malin pourrait facilement ensuite s'amuser à te desinscrire un de tes membres "à l'insu de son plein grés" tout simplement en appellant l'url correspondant.

Si tu relis ma recommandation plus haut tu comprends pkoi il est plus judicieux au lieu d'un id auto_increment de generer une chaine de caractere aleatoire suffisament longue pour reduire à l'infini le risque de repetition (un peu comme un SID de session).

ce qui donne plutot :

desinscription.php?code=gGHhj223bhhHHj3FREDGHJhBBEHS363N

c'est dejà moins parlant comme url ;)

J'ai eu recemment à coder une newsletter en php, j'essai juste de te faire profiter de ma petite experience là dessus...
 
WRInaute accro
r23o a dit:
j'ai reçu ta newsletter jeunz :)

A ta place je ne ferais pas mes liens de desinscriptions sous cette forme :

desinscription.php?id=email@domaine.tld

car un petit malin pourrait facilement ensuite s'amuser à te desinscrire un de tes membres "à l'insu de son plein grés" tout simplement en appellant l'url correspondant.

Si tu relis ma recommandation plus haut tu comprends pkoi il est plus judicieux au lieu d'un id auto_increment de generer une chaine de caractere aleatoire suffisament longue pour reduire à l'infini le risque de repetition (un peu comme un SID de session).

ce qui donne plutot :

desinscription.php?code=gGHhj223bhhHHj3FREDGHJhBBEHS363N

c'est dejà moins parlant comme url ;)

J'ai eu recemment à coder une newsletter en php, j'essai juste de te faire profiter de ma petite experience là dessus...

Ouai t'inquiète je sais...

Mais comme je pars demain en vacances, et que donc je suis super pressé, j'ai fait un système juste pour cette newsletter et je le referait avec une sécurité pour la prochaine ;-)

merci
 
Discussions similaires
Haut