Page 1 sur 2

Mysql : Verifier existence entrée

Posté : 02 oct. 2005, 16:44
par antoniolav
Bonjour,
j'ai mis en place sur mon site un quizz, ou les participants doivent entrer dans des input text leur nom, prénom et email. Je stock les données dans ma base de donnée, dans une table appelée quizz .

J'aimerais vérifier que personne n'essaye de jouer 2 fois, donc besoin de vérifier si le nom, prénom et mail qu'ils mettent n'existent pas deja en entrée . Comment faire ?

Merci d'avance !

Posté : 02 oct. 2005, 16:48
par Cyrano
Tu fais une requête avec une clause WHERE:
$sql="SELECT COUNT(*) WHERE nom = '". $nom ."' AND prenom = '". $prenom ."' AND email = '". $email ."'";
$recherche = mysql_query($sql);
$nb = mysql_num_rows($recherche);
if($nb > 0)
{
    // Internaute déjà inscrit
}
else
{
    // Internaute inconnu, ok
}
TU peux éventuellement ne tester qu'un seul des champ éventuellement, le courriel par exemple (email)

Posté : 02 oct. 2005, 16:59
par antoniolav
Merci beaucoup !
J'ai essaye d'inclure ton code avec ce que j'avais déjà codé, dis moi si ca marche avant que je ne le teste :

Code : Tout sélectionner

<?php mysql_connect("localhost", "******", "*****"); mysql_select_db("*****"); $sql="SELECT COUNT(*) WHERE email = '". $_POST['email_participant'] ."'"; $recherche = mysql_query($sql); $nb = mysql_num_rows($recherche); if(isset($_COOKIE['azerty']) OR $nb > 0) { echo '<font color=\'red\'>'; echo '<p>Vous avez déjà participé au quizz, et vous ne pouvez jouer qu\'une fois !'; echo '</p></font>'; } else { mysql_query("INSERT INTO quizz VALUES('$_POST['nom_participant']', '$_POST['prenom_participant']', '$_POST['email_participant'])"); echo '<p>Toutes les informations ont été enregistrées dans notre base de donnée.<br>Merci d\'avoir participé !'; echo '</p>'; setcookie('azerty', 'deja_participe', (time() + 31536000)); } mysql_close(); ?>

Posté : 02 oct. 2005, 17:04
par Cyrano
Tu as un problème de concaténation dans la requête SQL et il y a conflit entre apostrophes délimitant la chaine de caractères et celles encadrant les index de $_POST
<?php
mysql_connect("localhost", "******", "*****");
mysql_select_db("*****");

$sql="SELECT COUNT(*) WHERE email = '". $_POST['email_participant'] ."'";
$recherche = mysql_query($sql);
$nb = mysql_num_rows($recherche);

if(isset($_COOKIE['azerty']) OR $nb > 0)
{
    echo '<font color=\'red\'>';
    echo '<p>Vous avez déjà participé au quizz, et vous ne pouvez jouer qu\'une fois !';
    echo '</p></font>';
}
else
{
    mysql_query("INSERT INTO quizz VALUES('". $_POST['nom_participant'] ."', '". $_POST['prenom_participant'] ."', '". $_POST['email_participant'] ."')");
    echo '<p>Toutes les informations ont été enregistrées dans notre base de donnée.<br>Merci d\'avoir participé !</p>';

    setcookie('azerty', 'deja_participe', (time() + 31536000));
}

mysql_close();
?>

Posté : 02 oct. 2005, 17:07
par antoniolav
Donc en modifiant le script comme ceci ca devrait marcher ?:
<?php
mysql_connect("localhost", "******", "*****");
mysql_select_db("*****");

$email = $_POST['email_participant'];
$sql="SELECT COUNT(*) WHERE email = '". $email ."'";
$recherche = mysql_query($sql);
$nb = mysql_num_rows($recherche);

if(isset($_COOKIE['azerty']) OR $nb > 0)
{
    echo '<font color=\'red\'>';
    echo '<p>Vous avez déjà participé au quizz, et vous ne pouvez jouer qu\'une fois !';
    echo '</p></font>';
}
else
{
    mysql_query("INSERT INTO quizz VALUES('". $_POST['nom_participant'] ."', '". $_POST['prenom_participant'] ."', '". $_POST['email_participant'] ."')");
    echo '<p>Toutes les informations ont été enregistrées dans notre base de donnée.<br>Merci d\'avoir participé !</p>';

    setcookie('azerty', 'deja_participe', (time() + 31536000));
}

mysql_close();
?>

Posté : 02 oct. 2005, 17:11
par Cyrano
Oui, et tu pourrais même faire mieux :
<?php
mysql_connect("localhost", "******", "*****");
mysql_select_db("*****");

$email = $_POST['email_participant'];
$sql="SELECT COUNT(*) WHERE email = '". $email ."'";
$recherche = mysql_query($sql);
$nb = mysql_num_rows($recherche);

if(isset($_COOKIE['azerty']) OR $nb > 0)
{
?>
<p style="color: #c00">Vous avez déjà participé au quizz, et vous ne pouvez jouer qu'une fois !</p>
<?php
}
else
{
    mysql_query("INSERT INTO quizz VALUES('". $_POST['nom_participant'] ."', '". $_POST['prenom_participant'] ."', '". $_POST['email_participant'] ."')");
?>
<p>Toutes les informations ont été enregistrées dans notre base de donnée.<br>
Merci d'avoir participé !</p>
<?php
    setcookie('azerty', 'deja_participe', (time() + 31536000));
}
mysql_close();
?>
C'est plus propre, et en séparant correctement le PHP du HTML, tu améliores les performances. Sur un petit script comme ça, ça n'aura à peu près aucune incidence, mais si tu développes plus tard des applications plus lourdes avec cette habitude, ça pourra avoir un effet notable.

Posté : 02 oct. 2005, 17:44
par antoniolav
Je comprends ce que tu veux dire .
Je te remercie beaucoup de l'aide que tu m'as procuré .
@ Bientôt j'espere

Posté : 02 oct. 2005, 18:02
par antoniolav
J'ai finalement des problèmes ; Voilà mon code :
<?php
mysql_connect("localhost", "*****", "****");
mysql_select_db("antoinel");

$email = $_POST['email_participant'];
$sql="SELECT COUNT(*) WHERE email = '". $email ."'";
$recherche = mysql_query($sql);
$nb = mysql_num_rows($recherche);

if(isset($_COOKIE['azertysecurity']) OR $nb > 0)
{
?>
<p style="color: #c00">Vous avez déjà participé au quizz, et vous ne pouvez jouer qu'une fois !</p>
<?php
}
else
{
    mysql_query("INSERT INTO quizz VALUES('". $_POST['nom_participant'] ."', '". $_POST['prenom_participant'] ."', '". $_POST['email_participant'] ."')");
?>
<p>Toutes les informations ont été enregistrées dans notre base de donnée.<br>
Merci d'avoir participé !</p>
<?php
    setcookie('azertysecurity', 'deja_participe', (time() + 31536000));
}
mysql_close();
?>
Et le message d'erreur :
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/antoinel/www/Securitycenter/quizz_resultat.php on line 128

Toutes les informations ont été enregistrées dans notre base de donnée.
Merci d'avoir participé !

Warning: Cannot modify header information - headers already sent by (output started at /home/antoinel/www/Securitycenter/quizz_resultat.php:5) in /home/antoinel/www/Securitycenter/quizz_resultat.php on line 143

Posté : 02 oct. 2005, 18:55
par Cyrano
Il doit y avoir un problème avec la requête de recherche alors. Fais la afficher avec un echo() et vérifie qu'elle soit correcte puis copie la requête générée en question et teste là directement avec phpMyAdmin pour voir le retour obtenu, un résultat ou un message d'erreur explicite.

Pour le problème de header, à quelle ligne exactement correspond la ligne 143 ?

Posté : 02 oct. 2005, 19:11
par Invité
Quelle variable je dois afficher avec echo pour tester ?

142 --- <?php
143 --- setcookie('azertysecurity', 'deja_participe', (time() + 31536000));
144 --- }
145 --- mysql_close();
146 --- ?>

Posté : 02 oct. 2005, 20:25
par Truc
Salut, la requete que tu dois afficher est celle qui pose problème :wink:
a savoir celle ci:
$sql="SELECT COUNT(*) WHERE email = '". $email ."'"; 
mais bon elle pose probleme parcequ'il manque la clause FROM... et le count n'est pas obligatoire (je sait pas si niveau performance c'est plus long que de choisir un element direct) on peut donc remplacer par:
$sql="SELECT email FROM ta_table WHERE email = '". $email ."'"; 
puisque tu fait un mysql_num_rows apres on regarde juste le nombre de lignes retournées, donc je pense que le count est de trop.

apres il faut t'arranger pour ne pas mettre de code html avant le "setcookie", d'ou l'erreur sur le header.

Posté : 02 oct. 2005, 20:28
par Cyrano
Alors petite info à propos du COUNT :

Il est plus (beaucoup) rapide de faire compter à MySQL un nombre de ligne que de récupérer toutews les lignes pour les compter ensuite. Donc la requête avec COUNT est tout à fait appropriée.

La requête à faire afficher ? echo($sql) tout simplement.

Posté : 02 oct. 2005, 20:33
par Truc
Alors petite info à propos du COUNT :

Il est plus (beaucoup) rapide de faire compter à MySQL un nombre de ligne que de récupérer toutews les lignes pour les compter ensuite.
Ok merci pour l'info :D (j'en était pas sur sur)
mais il manque quant meme le FROM dans la requete :wink:

Posté : 02 oct. 2005, 20:40
par Cyrano
En fait pour le COUNT, c'est logique: lorsqu'on fait une demande à MySQl, PHP a un rôle client: il y a échange entre PHP et le serveur MySQL. Tout ce qu'on peut faire faire directement par MySQL (ou du reste n'importe quel SGBD) sera pratiquement toujours plus performant parce qu'on court-circuite les échanges au maximum.

Exemple. On pourrait stocker des dates dans une table avec un seul champ de type DATE ou trois champs de type INT, jour, mois et année. Mais la première solution sera toujours meilleure parce qu'on peut effectuer des calculs et des tris sur les dates directement en SQL et récupérer seulement les quelques résultats voulus au lieu de récupérer tous les résultats et faire ensuite les tris ou calculs par programmation : la quantité de données transitant entre le SGBD et PHP étant de ce fait beaucoup plus importante. :)

Alors bien sûr, ce sont des nanosecondes qu'on récupère au cas par cas, mais il faut garder à l'esprit que multiplié par des dizaines (centaines/milliers, rayer les mentions inutiles) de page multiplié par des dizaines (centaines/milliers, rayer les mentions inutiles) de site, ça affecte globalement les performances d'un serveur d'hébergement.

Posté : 02 oct. 2005, 21:00
par antoniolav
Je vais donc m'arranger pour placer ma création de cookie en tout premier .
A part, n'ais-je que cette première phrase à remplacer par cette deuxième ?
$sql="SELECT COUNT(*) WHERE email = '". $email ."'";
$sql="SELECT email FROM ta_table WHERE email = '". $email ."'";
EDIT : finalement je ne trouve pas de moyen pour placer ma création de cookie en premier : vais-je devoir changer de technique ?