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

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: 18 Fév 2004

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

Message le Dim Juil 31, 2005 13:36

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 :-)


rebirth
WRInaute impliqué
WRInaute impliqué
 
Messages: 909
Inscription: 18 Avr 2004

Message le Dim Juil 31, 2005 13:47

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();
}

r23o
WRInaute discret
WRInaute discret
 
Messages: 211
Inscription: 13 Juil 2003

Message le Dim Juil 31, 2005 19:43

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.

andy
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 22
Inscription: 29 Juil 2005

Message le Dim Juil 31, 2005 20:48

Salut, moi je te propose cette solution (qui n'est pas forcément la meilleure):
Code: Tout sélectionner
$sql_verification = mysql_query('SELECT * FROM table WHERE email =\''.$email.'\'');
$verification = mysql_num_rows($sql_verification);


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


Voilà ma méthode!!

++

bigjet
WRInaute discret
WRInaute discret
 
Messages: 211
Inscription: 21 Nov 2004

Message le Dim Juil 31, 2005 21:00

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.


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: 18 Fév 2004

Message le Dim Juil 31, 2005 21:11

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

andy
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 22
Inscription: 29 Juil 2005

Message le Dim Juil 31, 2005 21:20

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 :)

shrom
WRInaute impliqué
WRInaute impliqué
 
Messages: 865
Inscription: 5 Juil 2004

Message le Dim Juil 31, 2005 22:13

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.


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: 18 Fév 2004

Message le Dim Juil 31, 2005 22:44

J'ai bien sur mis mon champs mail en clef unique...

Didier_S
WRInaute impliqué
WRInaute impliqué
 
Messages: 567
Inscription: 24 Aoû 2004

Message le Lun Aoû 01, 2005 2:20

$query_connecte = "INSERT Into newsletter VALUES ('','$mail','1')";


je me permets un petit conseil: utilise plutot une syntaxe comme
Code: Tout sélectionner
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 ? ;)


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: 18 Fév 2004

Message le Lun Aoû 01, 2005 8:09

Didier_S a écrit:
$query_connecte = "INSERT Into newsletter VALUES ('','$mail','1')";


je me permets un petit conseil: utilise plutot une syntaxe comme
Code: Tout sélectionner
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 :-)

r23o
WRInaute discret
WRInaute discret
 
Messages: 211
Inscription: 13 Juil 2003

Message le Lun Aoû 01, 2005 12:16

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


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: 18 Fév 2004

Message le Lun Aoû 01, 2005 12:18

r23o a écrit: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


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Formation recommandée sur ce thème :

Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par les experts Google Analytics de Ranking Metrics.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités