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.
    2
    1. Mon problème demeure entier !
      1
      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'];
             }
        }
        
        0
      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";
        
        				     }
        				}
        	   }
        0
    2. 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 :)
      0
      1. FALSE non plus ne donne rien.

        print_r() ou var_dump() ? Comment les utiliser ?
        MErci.
        0
    3. 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.
      0
      1. Merci à tous pour vos pistes. Je prends le temps de voir tout cela.
        0
        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'];
               }
          }
          
          0
          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.
            0
          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...
            0
          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.
            0
          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...
            0
          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"
                         ) ;
                    }
            
            0
        2. 		    //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"
          		           ) ;
                      }
          
          0