Pb requète sql

lise
Invité n'ayant pas de compte PHPfrance

14 févr. 2008, 22:32

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

Mammouth du PHP | 881 Messages

15 févr. 2008, 00:18

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.
Soyez artisans de paix

lise
Invité n'ayant pas de compte PHPfrance

15 févr. 2008, 00:46

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!

ViPHP
ViPHP | 2144 Messages

15 févr. 2008, 02:44

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.

Mammouth du PHP | 881 Messages

15 févr. 2008, 06:02

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
Soyez artisans de paix

lise
Invité n'ayant pas de compte PHPfrance

15 févr. 2008, 12:16

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.

lise
Invité n'ayant pas de compte PHPfrance

15 févr. 2008, 13:19

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

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

15 févr. 2008, 13:25

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.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute