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. 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.
    2. 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. Merci à tous pour vos pistes. Je prends le temps de voir tout cela.
        1. 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";
            
            				     }
            				}
            	   }
        2. 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"
                         ) ;
                    }
            
        3. 		    //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"
          		           ) ;
                      }