Requête mysql marche sauf pour une condition ....

Requête mysql marche sauf pour une condition .... - PHP - Programmation

Marsh Posté le 01-04-2007 à 08:44:47    

Bon, j'ai avancé un peu dans mes affaires, mais le programme php qui exploite un formulaire coince toujours à un endroit. Et là je suis un peu paniquée, je dois terminer tout aujourd'hui. Etant grande débutante, je m'excuse pour la maladresse du code que je vous présente...
 
Toutes les requêtes marchent parfaitement, sauf si je combine le contenu du champ "Nom commence par..." à celui d'un autre (Maison, Année etc..).  J'ai tout vérifié, je ne vois pas d'où peut venir le problème.
 
J'ai testée les requêtes directement sur la base de données (hébergé chez OVH) en passant par PhPMyadmin / Recherche et j'ai repris leur code, d'où les CONVERT et autres indications. Faites comme ça, elles marchent toutes.. aussi celles qui concernent les combinaisons avec "Nom commence par". Mais dès que fais les requêtes de mon site, en passant par le formulaire html et mon programme php, le problème réapparait. C'est ça que je ne comprends pas.  
 
Voici deux test qui devraient fournir un résultat:
 
Mettre Car dans "Nom commence par" et 1523 dans "Année".
Mettre Car dans "Nom commence par" et Catherine de Médicis dans "Maison".
 
 
Voici le code html de la rubrique du formulaire:
 
<td class="label">Nom commence par</td>
<td class="input"><input type="text" id="debut" name="debut" valeur=""/></td>
<td class="help" colspan="2"><i>Ex.: "Mont" ou "Montmorency"...</i></td>

 
Et voici le programme php associé:
 
<?php    
  /* Etablit la connexion au fichier qui contient les mots de passe et  
  informations sur le serveur et la base de données */
  require ("../connect.php" );
   
  /* Etablit la connexion avec le serveur mysql et la base de données mysql */
  $connexion = mysql_pconnect($serveur, $user, $mdp) or die("Connexion au serveur impossible" );
  $db = mysql_select_db($base, $connexion)or die("Connexion à la base impossible" );
   
  /* Variables pour le contenu des champs de saisie */
   
  $debut = $_GET['debut'];
  $motcle = $_GET['motcle'];
  $reineroi = $_GET['reineroi'];
  $year = $_GET['year'];
  $compil = $_GET['compil'];
   
/* requêtes sur nom et motclé uniquement */
   
if (($debut) && (!$motcle) && (!$reineroi) && (!$year) && (!$compil))
{$requete="SELECT * FROM `Etat` WHERE `Identification` LIKE CONVERT( _utf8 '$debut%' USING latin1 )COLLATE latin1_swedish_ci LIMIT 0 , 30";
$resultat=mysql_query($requete) or die("<p>Exécution de la requête impossible</p>" );}
 
elseif (($motcle) && (!$debut) && (!$reineroi) && (!$year) && (!$compil))
      {$requete="SELECT * FROM `Etat` WHERE `Identification` LIKE CONVERT( _utf8 '%$motcle%' USING latin1 ) COLLATE latin1_swedish_ci LIMIT 0 , 30";
$resultat=mysql_query($requete) or die("<p>Exécution de la requête impossible</p>" );}
   
elseif (($debut) && ($motcle) && (!$reineroi) && (!$year) && (!$compil))
 {$requete="SELECT * FROM `Etat` WHERE `Identification` LIKE CONVERT( _utf8 '$debut%' USING latin1 )COLLATE latin1_swedish_ci OR `Identification` LIKE CONVERT( _utf8 '%$motcle%' USING latin1 ) COLLATE latin1_swedish_ci LIMIT 0 , 30";
$resultat=mysql_query($requete) or die("<p>Exécution de la requête impossible</p>" );}
   
/* Requete sur nom, motclé et maison */
   
elseif (($debut) && (!motcle) && ($reineroi) && (!$year) && (!$compil))
{$requete="SELECT * FROM `Etat` WHERE `Maison` LIKE CONVERT( _utf8 '$reineroi' USING latin1 ) COLLATE latin1_swedish_ci AND `Identification` LIKE CONVERT( _utf8 '$debut%' USING latin1 ) COLLATE latin1_swedish_ci LIMIT 0 , 30";
$resultat=mysql_query($requete) or die("<p>Exécution de la requête impossible</p>" );}
   
elseif (($motcle) && (!$debut) && ($reineroi) && (!$year) && (!$compil))
{$requete="SELECT * FROM `Etat` WHERE `Maison` LIKE CONVERT( _utf8 '$reineroi' USING latin1 ) COLLATE latin1_swedish_ci AND `Identification` LIKE CONVERT( _utf8 '%$motcle%' USING latin1 ) COLLATE latin1_swedish_ci LIMIT 0 , 30";
$resultat=mysql_query($requete) or die("<p>Exécution de la requête impossible</p>" );}
   
elseif (($debut) && ($motcle) && ($reineroi) && (!$year) && (!$compil))
 {$requete="SELECT * FROM `Etat` WHERE `Maison` LIKE CONVERT( _utf8 '$reineroi' USING latin1 ) COLLATE latin1_swedish_ci AND `Identification` LIKE CONVERT( _utf8 '$debut%' USING latin1 ) COLLATE latin1_swedish_ci OR `Identification` LIKE CONVERT( _utf8 '%$motcle%' USING latin1 ) COLLATE latin1_swedish_ci LIMIT 0 , 30";
$resultat=mysql_query($requete) or die("<p>Exécution de la requête impossible</p>" );}
   
/* Requete sur nom, motclé et annee */
   
elseif (($debut) && (!motcle) && (!$reineroi) && ($year) && (!$compil))
{$requete="SELECT * FROM `Etat` WHERE `Annee` ='$year' AND `Identification` LIKE CONVERT( _utf8 '$debut%' USING latin1 ) COLLATE latin1_swedish_ci LIMIT 0 , 30";
$resultat=mysql_query($requete) or die("<p>Exécution de la requête impossible</p>" );}
   
elseif (($motcle) && (!$debut) && (!$reineroi) && ($year) && (!$compil))
{$requete="SELECT * FROM `Etat` WHERE `Annee` ='$year' AND `Identification` LIKE CONVERT( _utf8 '%$motcle%' USING latin1 ) COLLATE latin1_swedish_ci LIMIT 0 , 30";$resultat=mysql_query($requete) or die("<p>Exécution de la requête impossible</p>" );}
   
elseif (($debut) && ($motcle) && (!$reineroi) && ($year) && (!$compil))
 {$requete="SELECT * FROM `Etat` WHERE `Annee` ='$year' AND `Identification` LIKE CONVERT( _utf8 '$debut%' USING latin1 ) COLLATE latin1_swedish_ci OR `Identification` LIKE CONVERT( _utf8 '%$motcle%' USING latin1 ) COLLATE latin1_swedish_ci LIMIT 0 , 30";
$resultat=mysql_query($requete) or die("<p>Exécution de la requête impossible</p>" );}
   
/* Requete sur nom, motclé et periode */
 
elseif (($debut) && (!motcle) && (!$reineroi) && (!$year) && ($compil))
{$requete="SELECT * FROM `Etat` WHERE `Periode` LIKE CONVERT( _utf8 '$compil' USING latin1 ) COLLATE latin1_swedish_ci AND `Identification` LIKE CONVERT( _utf8 '$debut%' USING latin1 ) COLLATE latin1_swedish_ci LIMIT 0 , 30";
$resultat=mysql_query($requete) or die("<p>Exécution de la requête impossible</p>" );}
   
elseif (($motcle) && (!$debut) && (!$reineroi) && (!$year) && ($compil))
{$requete="SELECT * FROM `Etat` WHERE `Periode` LIKE CONVERT( _utf8 '$compil' USING latin1 ) COLLATE latin1_swedish_ci AND `Identification` LIKE CONVERT( _utf8 '%$motcle%' USING latin1 ) COLLATE latin1_swedish_ci LIMIT 0 , 30";
$resultat=mysql_query($requete) or die("<p>Exécution de la requête impossible</p>" );}
   
elseif (($debut) && ($motcle) && (!$reineroi) && (!$year) && ($compil))
 {$requete="SELECT * FROM `Etat` WHERE `Periode` LIKE CONVERT( _utf8 '$compil' USING latin1 ) COLLATE latin1_swedish_ci AND `Identification` LIKE CONVERT( _utf8 '$debut%' USING latin1 ) COLLATE latin1_swedish_ci OR `Identification` LIKE CONVERT( _utf8 '%$motcle%' USING latin1 ) COLLATE latin1_swedish_ci LIMIT 0 , 30";
$resultat=mysql_query($requete) or die("<p>Exécution de la requête impossible</p>" );}
   
else
      { echo "<p>Vous avez indiqué trop de conditions: merci de choisir soit une maison, soit une année ou une période, mais pas deux ou trois à la fois.</p>";
 
echo '<p><a href="http://cour-de-france.fr/cour/bases/fr_bases/curia_recherche_avancee.php">Retour au formulaire de recherche</a></p>';}
       
        while ($ligne = mysql_fetch_array($resultat)) {
 extract($ligne);
   echo '<table class="result">';
   echo '<tr class="title">
           <td class="big">Notice de l\'état de maison</td>
    <td class="middle">Maison de</td>
    <td class="small">Année</td>
    <td class="middle">Periode</td>
    <td class="middle">Charge</td>
    </tr>';
       
   echo '<tr class="result">
    <td class="big">'."$Notice".'</td>
    <td class="middle">'."$Maison".'</td>
    <td class="small">'."$Annee".'</td>
    <td class="middle">'."$Periode".'</td>
    <td class="middle">'."$Charge".'</td>
    </tr>';
   echo '</table>';
   }
   exit;
?>


Message édité par 1cat le 02-05-2007 à 18:23:28
Reply

Marsh Posté le 01-04-2007 à 08:44:47   

Reply

Marsh Posté le 01-04-2007 à 09:19:34    

Quels sont les symptomes ?
Est-ce qu'il y a un message d'erreur ?
Est-ce que cela ne fait rien ?
Est-ce que cela donne un autre résultat que celui qui est attendu ?
 
A première vue, le code présente une faible qui est une source de problèmes potentiels : Le programme n'est pas structuré. Cela se traduit concrétement par les deux choses suivantes :
 
1. Les conditions contiennent des parties qui sont redondantes, par exemple, le test sur ($debut) que l'on voit partout, alors qu'il ne faudrait l'avoir qu'une fois, et avoir des sous-conditions.
 
2. Il manque des parenthèses dans les requêtes. En conséquence, tous les opérateurs sont traités au même niveau, alors que les règles sur la priorité des opérateurs peuvent nous jouer des tours.

Reply

Marsh Posté le 01-04-2007 à 09:28:47    

Merci pour tes indications. Le message d'erreur est:  
 
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home.10.11/courdefr/cgi-bin/formulaires/avancee.php on line 186
 
 
Sur la ligne 186 se trouve:  
 
 while ($ligne = mysql_fetch_array($resultat)) {


Message édité par 1cat le 01-04-2007 à 09:29:43
Reply

Marsh Posté le 01-04-2007 à 09:33:04    

J'essaie de mettre en oeuvre tes conseils; est-ce que le résultat devrait être ainsi:
 
if ($debut, $motcle) {
     $requete="blabla...";
     $resultat=mysql_.... }
 
c'est à dire indiquer que ce qui doit retourner "VRAI" ?
 
Je ne sais pas comment faire pour indiquer qu'une fois $debut et mettre des sous-conditions  [:dfefe67]  
 
 :jap:


Message édité par 1cat le 01-04-2007 à 09:35:44
Reply

Marsh Posté le 01-04-2007 à 09:42:31    

Il faudrait voir la requête qui a provoqué ce message d'erreur.
 
Pour les conditions, la solutions actuelle marche peut-être.
Cependant, j'aurais remplacé ceci:

if (($debut) && (!$motcle) && (!$reineroi) && (!$year) && (!$compil))  
  requete1
elseif (($motcle) && (!$debut) && (!$reineroi) && (!$year) && (!$compil))  
  requete2  
elseif (($debut) && ($motcle) && (!$reineroi) && (!$year) && (!$compil))  
  requete3
elseif (($debut) && (!motcle) && ($reineroi) && (!$year) && (!$compil))  
  requete4
elseif (($motcle) && (!$debut) && ($reineroi) && (!$year) && (!$compil))  
  requete5  
elseif (($debut) && ($motcle) && ($reineroi) && (!$year) && (!$compil))  
  requete6
elseif (($debut) && (!motcle) && (!$reineroi) && ($year) && (!$compil))  
  requete7
elseif (($motcle) && (!$debut) && (!$reineroi) && ($year) && (!$compil))  
  requete8
elseif (($debut) && ($motcle) && (!$reineroi) && ($year) && (!$compil))  
  requete9


par cela, qui est plus clair pour moi, et permet tout de suite repérer des cas non prévus :

if (!$compil) {
  if ($debut) {
    if ($motcle) {
      if ($reineroi) {
        if ($year)
          requete_manquante
        else  
          requete6
      }
      else {
        if ($year)
          requete9
        else  
          requete3
      }
    }
    else {
      if ($reineroi) {
        if ($year)
          requete_manquante
        else  
          requete4
      }
      else {
        if ($year)
          requete7
        else
          requete1
      }
    }
  }
  else {
    if ($motcle) {
      if ($reineroi) {
        if ($year)
          requete_manquante
        else  
          requete5  
      }
      else {
        if ($year)
          requete8
        else
          requete2
      }
    }
    else {
      requete_manquante
    }
  }
}

Reply

Marsh Posté le 01-04-2007 à 09:51:40    

Mama mia, je te remercie beaucoup ... et je vais essayer de comprendre, et d'appliquer !

Reply

Marsh Posté le 01-04-2007 à 09:58:22    

La requête qui provoque l'erreur est :
 
Car dans "Nom commence par" et 1523 dans "Année"
ou
Car dans "Nom commence par" et Catherine de Médicis dans "Maison".  
 
Dans les deux cas, un résultat devrait s'afficher. Ce qui marche d'ailleurs quand je fais cette requête en passant par PHPMyadmin.


Message édité par 1cat le 01-04-2007 à 09:58:42
Reply

Marsh Posté le 01-04-2007 à 10:06:13    

Une seule question par rapport au code que tu proposes, pour que je comprenne bien : qu'est-ce qui se passe quand "$compil" renvoie une valeur "vrai" ?

Reply

Marsh Posté le 05-04-2007 à 19:18:04    

Uff... quelques jours plus tard, j'ai retravaillé tout en fonction des conseils de olivthill et maintenant ça marche à merveille...  
 
Un gros merci, qu'est-ce que je ferais sans le forum et des gens géniaux comme olivthill qui s'est tapé au moins une heure à m'écrire le code exemple ???
 
 
 :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed