If & résultat requête

Résolu
Bonjour,

De guerre las, je vous soumets mon problème.

Dans mon script ci-dessous la condition else s'affiche quand il y a des résultats, par contre la 1ère condition de "if" n'affiche rien quand la requête ne donne rien.

Qqu'un peut-il me dire où ça coince ?

Merci.

      $sql = "SELECT * 
         FROM pt_trouve
          LEFT JOIN pt_objets  ON pt_objets.objet_id = pt_trouve.objet_id
          LEFT JOIN pt_regions ON pt_regions.region_id = pt_trouve.region_id
         WHERE date_trouve between '$datedebut1' and '$datefin1' 
          AND pt_trouve.region_id = '$region_id'
          AND pt_trouve.categorie_id = '$categorie_id'";       
         
       
      //exécution de la requête:
      $requete = mysql_query($sql) ;
   
      //affichage des données:
      while($result = mysql_fetch_array($requete))
      {
  
        if (($result) == NULL)

     {
          echo '<font color="red">Aucun résultat trouvé.</font>';
     }
     
    else
    
     {
      "<div align=\"center\">".$result->trouve_id."------".$result->region."------".$result->objet." <a href=\"modification2.php?idPersonne=".$result-> date_trouve."\">modifier
               --- <a href=\"#\" onClick=\"confirme('".$result->trouve_id."')\" >supprimer</a></div>\n";      
         }
      }


7 réponses

  1. Modérateur
    Bonjour
    si ta requête ne retourne rien. ..tu n'entre pas dans le while.... donc ton if ne sert à rien à cet endroit.
    1. 		    //affichage des données:
      		    while($result = mysql_fetch_object($requete))
      		    {
      		
      		       echo(
      		           "<div align=\"center\">".$result->date_trouve."------".$result->ville."------".$result->objet." 
      		           <a href=\"modification2.php?trouve_id=".$result-> trouve_id."\">consulter</a></div>\n"
      		           ) ;
                  }
      
      1. Effectivement la condition sur $result est fausse (plus l'habitude de travailler avec l'api mysql) : $result vaut FALSE si la requête a échouée, sinon elle retourne dans tous les cas une variable ressource sur laquelle tu peux utiliser mysql_num_rows() pour récupérer le nombre de résultat, soit :
        if (!$result) {
             echo 'Erreur sql : ' . mysql_error();
        } elseif (mysql_num_rows($result) == 0)
             echo '<font color="red">Aucun résultat trouvé.</font>';
        } else {
             while($result = mysql_fetch_array($requete)) {
                 echo $result['region'];
             }
        }
        
        1. Une question avant d'essayer :

          Dans ta formule avec "if $résult".. Oui mais qu'est-ce qui définit "if $result" auparavant ? ne manquerait-il pas que chose .

          Merci de ta réponse.
        2. @maxireussiteBon cela fonctionne cette fois. Mais j'ai un problème nouveau.

          La formule de recherche retourne 1 seul résultat là où il devrait y en avoir deux...
        3. Correction : il s'agit bien de la variable $requete et non $result.
          if (!$requete) {
              echo 'Erreur sql : ' . mysql_error();
          } else {
              $nb_resultats = mysql_num_rows($requete);
          
              if ($nb_resultats == 0) {
                  echo '<font color="red">Aucun résultat trouvé.</font>';
              } else {
                  echo '<font color="green">' . $nb_resultats . ' résultats trouvés.</font>';
                  while($result = mysql_fetch_array($requete)) {
                      var_dump($result);
                  }
              }
          }
          


          Ton nouveau problème doit venir de la requête sql et/ou des données en bdd. Utilises un client mysql (PhpMyAdmin ou autre) pour tester ta requête directement sur la base.
        4. @PitetAvant la modif, avec mon script initial la requete retournait bien 2 lignes (ce qui est le résultat correct).

          Là il ne retourne qu'une seule...
        5. @maxireussiteEn fait c soit il me retourne 2 lignes qd il faut, mais à ce moment la là condition "$Requete == Nul" ou "mysql_num_rows($requete) == 0" donne une page blanche
          ou bien vice-versa.

          Quand (mysql_num_rows($requete) == 0) afiiche aucun résultat trouvé, le sript ne me donne qu'une ligne là ou il devrait y avoir 2.

          Ce truc me rend dingue !
          dernière version :

              if (!$requete) 
                {
                   echo 'Erreur sql : ' . mysql_error();
               }
               
             elseif(mysql_num_rows($requete) == 0)
                echo '<font color="red">Aucun résultat trouvé.</font>';    
               
               
             else
               {
                  echo ("<div align=\"center\">".$result->trouve_id."------".$result->region."------".$result->objet." <a href=\"modification2.php?idPersonne=".$result-> date_trouve."\">modifier
                         --- <a href=\"#\" onClick=\"confirme('".$result->trouve_id."')\" >supprimer</a></div>\n"
                       ) ;
                  }
          
      2. Mon problème demeure entier !
        1. Comme indiqué tu dois faire ton if avant ton while :
          //affichage des données:
          if (!$result) {
               echo '<font color="red">Aucun résultat trouvé.</font>';
          } else {
               while($result = mysql_fetch_array($requete)) {
                   echo $result['region'];
               }
          }
          
        2. @PitetBon ! Toujours pas de résultat quand la requete est vide...

          J'ai tenté d'adapter ton conseil. Je te mets le script au complet, merci de voir ce qui cloche.
          Cdlt.

          <?php
              if(isset($_POST['region_id'])) $region_id=$_POST['region_id'];
              else $region_id="";
           
          	if(isset($_POST['categorie_id'])) $categorie_id=$_POST['categorie_id'];
              else $categorie_id="";
              
              if(isset($_POST['datedebut'])) $datedebut=$_POST['datedebut'];
              else $datedebut="";
               
              if(isset($_POST['datefin'])) $datefin=$_POST['datefin'];
              else $datefin="";
              
              
               $datedebut1 = $datedebut?date('Y-m-d', strtotime($datedebut)):date('Y-m-d');
           	$datefin1 = $datefin?date('Y-m-d', strtotime($datefin)):date('Y-m-d');
            
              // On vérifie si les champs sont vides
              if(empty($region_id) OR empty($categorie_id) OR empty($datedebut) OR empty($datefin))
                    
                 { 
                		echo '<font color="red">Tous les champs doivent être rempli.</font>';
          			echo"<html><br /><BR><a href=\"javascript:window.history.go(-1)\">Retour</a></html>";	
                 }
                 
              
              elseif(($region_id == 'vide') AND ($categorie_id == 'vide'))
                    
                 { 
                		echo '<font color="red">Les champs Région et Categorie doivent être remplis.</font>';
          			echo"<html><br /><BR><a href=\"javascript:window.history.go(-1)\">Retour</a></html>";	
                 }
          
          
           	else
                 
                 {
          		           //requête SQL:
          		    $sql = "SELECT * 
          			      FROM pt_trouve
          		      		LEFT JOIN pt_objets  ON pt_objets.objet_id = pt_trouve.objet_id
          	      			LEFT JOIN pt_regions ON pt_regions.region_id = pt_trouve.region_id
          			     	WHERE date_trouve between '$datedebut1' and '$datefin1' 
          			      	AND pt_trouve.region_id = '$region_id'
          			      	AND pt_trouve.categorie_id = '$categorie_id'";	      
          			      
          		     
          		    //exécution de la requête:
          		    $requete = mysql_query($sql) ;
          		 
          		   
          			//affichage des données:
          			if (!$requete) 
          			
          				{
          				     echo '<font color="red">Aucun résultat trouvé.</font>';
          				} 
          			
          			else 
          			
          				{
          				     while($result = mysql_fetch_array($requete)) 
          				     
          				     {
          				        echo "<div align=\"center\">".$result->trouve_id."------".$result->region."------".$result->objet." <a href=\"modification2.php?idPersonne=".$result-> date_trouve."\">modifier
          				           --- <a href=\"#\" onClick=\"confirme('".$result->trouve_id."')\" >supprimer</a></div>\n";
          
          				     }
          				}
          	   }
      3. Merci à tous pour vos pistes. Je prends le temps de voir tout cela.
        1. Bonjour,

          Et se profilera à l'horizon 2 nouveaux problèmes sur cette ligne:
          "<div align=\"center\">".$result->trouve_id."------".$result->region."------".$result->objet." <a href=\"modification2.php?idPersonne=".$result-> date_trouve."\">modifier --- <a href=\"#\" onClick=\"confirme('".$result->trouve_id."')\" >supprimer</a></div>\n"; 

          Car il n'y a pas d'echo et d'autre part, faire un mysql_fetch_array() n'a aucun sens (hormis d'obtenir un joli message d'erreur PHP) si on veut afficher des objets comme par exemple $result->trouve_id
          Cdlt.
          1. Je pense qu'il serait bien de commencer par un print_r($result) dans le while pour voir ce que contient le réellement résultat.

            C'est peut-être
            if($result==FALSE) // au lieu de NULL

            Sinon je pense que le print_r() ou var_dump() te donneront la solution :)
            1. FALSE non plus ne donne rien.

              print_r() ou var_dump() ? Comment les utiliser ?
              MErci.