Page 1 sur 1

Pb requète sql

Posté : 14 févr. 2008, 22:32
par lise
Bonjour,

J'ai un formulaire où l'on peut saisir au choix 1, 2 ou 3 adresses emails. Ces adresses sont insérées dans 3 champs differents dans une table. Ces champs s'appellent reponse1c , reponse1f, reponse1i.

Code : Tout sélectionner

CREATE TABLE XXXXXX ( id_rep int(11) NOT NULL auto_increment, id_votant int(11) NOT NULL default '0', reponse1a varchar(100) NOT NULL default '', reponse1b varchar(100) NOT NULL default '', reponse1c varchar(100) NOT NULL default '', reponse1d varchar(100) NOT NULL default '', reponse1e varchar(100) NOT NULL default '', reponse1f varchar(100) NOT NULL default '', reponse1g varchar(100) NOT NULL default '', reponse1h varchar(100) NOT NULL default '', reponse1i varchar(100) NOT NULL default '',
Je vérifie dans les champs de ma table que ces adresses ne s'y trouvent pas déjà sinon je renvoie un message d'erreur du type "cette adresse existe déjà". La vérification se fait donc sur les 3 champs.

J'avais une requète de départ toute simple mais après réflexion je l'ai modifiée mais elle me retourne toujours mon message d'erreur (cette adresse existe déjà) que l'adresse existe déjà ou qu'elle n'existe pas dans les champs de ma table.
$sql="SELECT * FROM reponse_votant WHERE reponse1c='$reponse1c' OR reponse1f='$reponse1c'
OR reponse1i='$reponse1c' OR reponse1c='$reponse1f' OR reponse1f='$reponse1f' OR 
reponse1i='$reponse1f' OR reponse1c='$reponse1i' OR reponse1f='$reponse1i' OR 
reponse1i='$reponse1i'";
J'ai récupéré ce que contient ma requète $sql lorsque je ne saisie qu'une seule adresse email et que celle-ci n'est pas dans un des 3 champs de ma table:

Code : Tout sélectionner

SELECT * FROM reponse_votant WHERE reponse1c='[email protected]' OR reponse1f='[email protected]' OR reponse1i='[email protected]' OR reponse1c='' OR reponse1f='' OR reponse1i='' OR reponse1c='' OR reponse1f='' OR reponse1i=''
=>me renvoie mon message d'erreur "Cette adresse existe déjà".

Lorsque je la teste dans phpmyadmin, cela me renvoie toutes les données de ma table! C'est donc normal que mon message d'erreur s'affiche

Donc ce n'est pas la bonne méthode!

Merci pour votre aide

Posté : 15 févr. 2008, 00:18
par Patriboom
Le plus simple consiste à faire faire le travail par un autre ... le serveur MySql en l'occurrence. Il te suffit de mettre les champs visés en index unique.

Comme tu sembles avoir des réponses qui se ressemblent, tu pourrais ne pas obtenir ce que tu cherches si quelqu'un, cherchant à obtenir deux inscriptions, détournait le système en répondant B, A, C plutôt que A, B, C aux trois champs visés. Pour éviter cela, tu peux trier les réponses obtenus des usagers avant de les soumettre à une requête MySQL qui les présentera au serveur. Ce dernier se fera un plaisir de te retourner (ou à l'usager) un message d'erreur si les champs sont identiques.

Pb requète sql

Posté : 15 févr. 2008, 00:46
par lise
Bonsoir,

Je ne peux pas modifier cette table car les champs "reponse1a..." contiennent déjà des données de précédentes opérations où il était normal qu'elles soient en double. C'était pour des réponses à des sondages.

Mon problème je crois vient du fait que si je ne saisie qu'une seule adresse, la requète va vérifier ainsi :

Code : Tout sélectionner

SELECT * FROM reponse_votant WHERE reponse1c='[email protected]' OR reponse1f='[email protected]' OR reponse1i='[email protected]' OR reponse1c='' OR reponse1f='' OR reponse1i='' OR reponse1c='' OR reponse1f='' OR reponse1i=''
Ceci signifie que seul le premier champs du formulaire a été saisi.

Or dans ma table, comme les utilisateurs saisissent le nb d'email qu'ils souhaitent dans le formulaire, j'ai toujours des champs vides donc il me renverra toujours mon message d'erreur.

Je n'ai pas encore trouvé la méthode!

Posté : 15 févr. 2008, 02:44
par iclo
Ce que tu souhaite obtenir est difficile à réaliser avec la structure actuelle de ta table. il n'est vraiement pas possible de la modifier ? (Il vaut mieux faire attention, parce que si par la suite, tu dois ajouter de nouvelles questions, ou bien exploiter différemment les résultats, tu risque de te trouver coincer avec gros volume de données, quasiment inexploitable...) Je dis pas ça pour t'embêter, mais c'est un problème fréquent que se retrouver complétement bloquer par après

Maintenant, si tu ne peux vraiment rien changer, le problème que je vois c'est que tu fait des recherches avec des adresses email vides, ce qui je pense pourrais expliquer que le serveur te renvoie tous tes enregistrements.

Posté : 15 févr. 2008, 06:02
par Patriboom
Puisque tu ne peux pas changer la structure, tu devras te tourner vers un changement de son exploitation.

Que dirais-tu de ne mettre qu'une réponse par enregistrement? Bien entendu, les champs vides seraient inutiles, mais peut-être arrierais-tu à faire quelque chose avec tes données.
Les champs inutilisés pourraient aussi servir à l'identification (un peu à la manière d'un id_reponse) du répondant (un peu comme un id_personne_ayant_repondu) ou à dater les réponses

Pb requète sql

Posté : 15 févr. 2008, 12:16
par lise
Bonjour,

Merci pour vos réflexions. Pour cette table je ne peux plus rien changer mais je penserai différemment mon système pour une prochaine version.

En revanche j'ai trouvé la solution mais la suite concerne peut être un autre forum.


$tab=array($reponse1c,$reponse1f,$reponse1i);
$nb=count($tab);
  
  
for ($i = 0; $i<$nb; $i++)
{
    if($tab[$i] != "")
    {
       foreach ($tab as $value)
       {
       $sql="SELECT * FROM $table  WHERE reponse1c='".$tab[$i]."' OR 
       reponse1f='".$tab[$i]."' OR reponse1i='".$tab[$i]."' AND 
       numero_sondage='$numero_sondage'";

      $rep=mysql_query($sql);
      }
    }
   
}

while (mysql_num_rows($rep)>0)
{ 
header(".....");
}  
Mais le temps de réponse est long.

Pb requète sql

Posté : 15 févr. 2008, 13:19
par lise
Après correction des erreurs tout est OK.
$tab=array($reponse1c,$reponse1f,$reponse1i);
$nb=count($tab);
  
  
for ($i = 0; $i<$nb; $i++)
{
    if($tab[$i] != "")
    {
       foreach ($tab as $value)
       {
       $sql="SELECT * FROM $table  WHERE reponse1c='".$tab[$i]."' OR 
       reponse1f='".$tab[$i]."' OR reponse1i='".$tab[$i]."' AND 
       numero_sondage='$numero_sondage'";

      $rep=mysql_query($sql);
      }
     
      if(mysql_num_rows($rep)>0)
      { 
       header(".....");
      }
   }
   
}

RESOLU

Posté : 15 févr. 2008, 13:25
par Truc
Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)

Ps: pense à utiliser un titre un peu plus explicite la prochaine fois.