Problème avec une requête !

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 : Problème avec une requête !

par Victor BRITO » 15 nov. 2007, 17:24

Avec une table créée comme dans mon exemple, lorsque quelqu'un en arrivera au stade de l'enregistrement de ses données dans la base de données, si c'est la deuxième fois qu'il apparaît avec les mêmes données que celles déjà enregistrées dans la colonne à clé unique, l'enregistrement échouera sans qu'il soit nécessaire de vérifier si la personne a déjà joué.

par iclo » 15 nov. 2007, 17:23

Comme indiqués plus haut, il vaut mieux compter les enregistrements dans la requête avec un count que de le faire en php. Cela permet d'éviter de récupérer tous les enregistrements juste pour les compter: on évite ainsi de solliciter le serveur inutilement.

par angebleu17 » 15 nov. 2007, 17:16

merci de ta réponse.

Donc ensuite pour vérifier si la personne à déjà jouer ça ne change rien à mon code ?

Code : Tout sélectionner

$sql = "SELECT * FROM matable WHERE id_jeu = '$id_jeu' AND id = '".$_SESSION['id']."'"; $req = mysql_query($sql); $total = mysql_num_rows ($req); if ($total > 0) { déjà joué.. }

par Victor BRITO » 15 nov. 2007, 17:06

Le champ id est un auto incremente.
Auquel cas il vaut mieux lui attribuer une clé primaire.

Y a-t-il, par hasard, des colonnes qui peuvent recevoir comme valeurs des chaînes de caractères pouvant apparaître plusieurs fois (comme les prénoms, par exemple) ? Dans ce cas, ces colonnes doivent recevoir une clé d'index unique.

L'attribution de clés peut s'effectuer lors de la création d'une table :

Code : Tout sélectionner

CREATE TABLE ma_table ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, prenom TEXT NOT NULL, PRIMARY KEY (id), UNIQUE KEY (prenom (255)) );
Avec ce code, je crée une table ma_table comportant deux colonnes, id et prenom, et j'attribue une clé primaire à id et une clé d'index unique à prenom. Le (255) indique le nombre de premiers caractères pris en compte dans la vérification de l'unicité de la valeur du champ (dans ce cas, les 255 premiers caractères) ; il doit être indiqué si la clé unique porte sur une colonne de type TEXT ou BLOB (pour les autres types de colonne, il est omis).

par angebleu17 » 15 nov. 2007, 16:28

Comment faire pour protéger mon champ id par une clé d'index unique ?

Le champ id est un auto incremente.

par iclo » 15 nov. 2007, 16:20

Utiliser un count dans ta requêtte sql, permettrait d'optimiser en réduisant la charge de travail pour le serveur.

Code : Tout sélectionner

SELECT count(DISTINCT id) FROM matable
Ca évite de rapatrier tous les enregistrements en php, juste pour les compter.

Victor Brito : tout à fait ;) Vive les clé uniques :D

par Victor BRITO » 15 nov. 2007, 16:18

La colonne id aurait dû être protégée par une clé d'index unique pour éviter cet imprévu. :wink:

par angebleu17 » 15 nov. 2007, 16:16

en effet 2 personnes ont joué 2 fois et à quelques secondes d'intervalle, pourtant je vérifie bien si la personne à déjà joué dc normalement elle ne peut pas joué deux fois..

par Calimero » 15 nov. 2007, 16:04

Ca pourrait vouloir dire qu'une personne a participé deux fois à ton jeu, donc... :-k Quoiqu'il en soit le problème se situe au niveau des données, à toi de regarder pour comprendre le pourquoi du comment ;-)

par angebleu17 » 15 nov. 2007, 15:54

Oui je sais que le DISTINCT renvoi qu'un seul enregistrement ou les id sont égal.
Vu qu'au total il y a 452 enregistrement, la requête devrait me renvoyé 226 et non 224 !

par Victor BRITO » 15 nov. 2007, 15:51

J'ignore ce que comporte ta table comme enregistrements, mais si dans la colonne id il y a une valeur qui apparaît plusieurs fois, la commande SELECT DISTINCT ne retournera qu'un seul des enregistrements à valeur identique. Le manuel de MySQL en donne une parfaite illustration.

Problème avec une requête !

par angebleu17 » 15 nov. 2007, 15:45

Bonjour,

J'ai une table dans ma base qui contient le nombre de personne qui ont participé à un jeux, et donc je souhaite récupérer le nombre de participant.

Voici ma requête :

Code : Tout sélectionner

$req = mysql_query("SELECT DISTINCT id FROM matable"); $total = mysql_num_rows($req);


Donc il y a 2 ligne ds la base pour une participation, dc quand je regarde dans ma base il est écrit : 452 enregistrements

dc divisé par 2 cela fait 226 personnes.

Et ma requête me retourne 224.

Je ne comprend vraiment pas pourquoi il y a une différence..

Si j'enléve le DISTINCT dans ma requête ça me met bien 452.

D'où cela peut venir ?