Mysql : Verifier existence entrée

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Mysql : Verifier existence entrée

par Cyrano » 02 oct. 2005, 23:22

Question à Cyrano:
juste pour Info, est ce que COUNT(email) est plus rapide que COUNT(*) ?
À priori je dirais oui : plus on est précis dans la recherche, plus on gagne en rapidité. J'ajouterai que dans la mesure où le champ "email" est un champ qui sert souvent pour des recherche, alors on peut encore accélérer les procédures en indexant le champ.

Enfin je dirais qu'un COUNT(email) va compter seulement les champs qui ne sont pas NULL ou vide, par conséquent, le nombre obtenu ne sera pas obligatoirement le même qu'avec un COUNT(*) qui comptera toutes les lignes de toutes façon.

Pour antoniolav, le retour d'erreur par mysql_num_rows() indique un problème à l'exécution de la requête qui retourne probablement false. Donc fais un petit retour en arrière, fais un echo($sql) pour afficher la requête à l'écran afin de la contrôler. Si elle a l'air normale, essaye-là en la copiant et en la collant directement dans une fenêtre SQL de phpMyAdmin, tu auras une réponse détaillé avec soit des résultats soit un message d'erreur plus explicite.

par antoniolav » 02 oct. 2005, 23:09

Avec le code ci-dessus :
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/antoinel/www/Securitycenter/quizz_resultat.php on line 130

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

Toutes les informations ont été enregistrées dans notre base de donnée.
Merci d'avoir participé !
Mais je vais réflechir cette semaine à un nouveau mode de vérification, je vous remercie quand même pour l'aide que vous m'avez apporté .

par Truc » 02 oct. 2005, 21:57

Alors apres ces explication de Cyrano sur l'utilisation du COUNT, laisse tomber la moitié (remettre le count et ajouter la clause FROM)de la requete que je t'ai indiqué tout a l'heure, pour le setcookie il suffit de ne pas mettre de code html mais php passe tres bien, essai comme ça:
<?

mysql_connect("localhost", "*****", "****");
mysql_select_db("antoinel");
$email = $_POST['email_participant'];

$sql="SELECT COUNT(*) FROM quizz WHERE email = '". $email ."'";

$recherche = mysql_query($sql);
$nb = mysql_num_rows($recherche);

$nb=0;
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'] ."')");
	
	setcookie('azertysecurity', 'deja_participe', (time() + 31536000));
	?>
<p>Toutes les informations ont été enregistrées dans notre base de donnée.<br>
Merci d'avoir participé !</p>
<?php    
}
mysql_close();
?>
Question à Cyrano:
juste pour Info, est ce que COUNT(email) est plus rapide que COUNT(*) ?
si oui alors remplacer * par email dans la requete :wink:

par antoniolav » 02 oct. 2005, 21:00

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 ?

par Cyrano » 02 oct. 2005, 20:40

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.

par Truc » 02 oct. 2005, 20:33

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:

par Cyrano » 02 oct. 2005, 20:28

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.

par Truc » 02 oct. 2005, 20:25

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.

par Invité » 02 oct. 2005, 19:11

Quelle variable je dois afficher avec echo pour tester ?

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

par Cyrano » 02 oct. 2005, 18:55

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 ?

par antoniolav » 02 oct. 2005, 18:02

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

par antoniolav » 02 oct. 2005, 17:44

Je comprends ce que tu veux dire .
Je te remercie beaucoup de l'aide que tu m'as procuré .
@ Bientôt j'espere

par Cyrano » 02 oct. 2005, 17:11

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.

par antoniolav » 02 oct. 2005, 17:07

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

par Cyrano » 02 oct. 2005, 17:04

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