Moteur de recherche / Message aucun Resultat

Alex_torr3s
Invité n'ayant pas de compte PHPfrance

13 nov. 2014, 10:10

Bonjour a tous,

j'ai un petit soucis avec mon code.

Effectivement j'aimerais afficher un message d'erreur "Aucune correspondance, veuillez entrez un autre mot clé" lorsque l'utilisateur rentre un mot clé qui n'a aucune correspondance.

J'ai réussi a avoir le message quand rien ne correspond mais le problème c'est qu'il s'affiche tout le temps même quand j'ai des résultats.

Je pense que c'est la condition de mon code qui ne fonctionne pas correctement.

Voici mon code :
<?php 
            if(isset($_POST['requete']) AND $_POST['requete'] != NULL)
                {
                    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
                    $requete = htmlspecialchars($_POST['requete']);
                    $requete = str_replace(' ', '', $requete);
                    $reponse = $bdd -> query("SELECT * FROM gesast WHERE Equipesansespace LIKE '%$requete%' ORDER BY id ") or die (mysql_error());
                    while ($donnees = $reponse->fetch())
                                {
                                
                                    echo'<div class="couleur"><p class="titre"><strong>' . htmlspecialchars($donnees['Equipe']) . ' </strong></p>
                                                <p> ' . htmlspecialchars($donnees['Nom_Prenom']) . '</p>
                                                <p class="numero"> ' . htmlspecialchars($donnees['Date_de_debut']) . ' 
                                                    ' . htmlspecialchars($donnees['Date de fin']) . ' </p>
                                         <p><strong>' . htmlspecialchars($donnees['TEL1']) . '</strong></p>  
                                         <p><strong>' . htmlspecialchars($donnees['TEL2']) . '</strong></p></div>';
                                          


                                }
                
                    if($donnees == NULL)
                        
                                {
                                    echo 'Aucune correspondance, veuillez entrez un autre mot clé';
                                    

                                }
                }
            else
            {
                echo 'Merci de renseigner un mot dans le champs recherche.'; 
            }

        
        ?>
Je n'arrive pas a trouver ce qu'il faut que je mette pour que ça fonctionne.

Merci d'avance pour votre aide :D :D :D :D :D .

Cordialement,

Alex

Mammouth du PHP | 1966 Messages

13 nov. 2014, 17:20

Le problème c'est que à la fin de ton while, $données est toujours null car ta boucle a épuisé les lignes

le mieux est de déterminer le nombre de ligne que ta requète génère et si c'est 0 afficher ton message d'erreur.

sinon il est possible de commencer par récupéré la première donnée, si elle est null affiché ton erreur sinon faire un do ...while mais je préfère la première solution
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Nestecha
Invité n'ayant pas de compte PHPfrance

13 nov. 2014, 18:16

Pourquoi ne pas faire ça Spols ?
while ($donnees = $reponse->fetch())
                                {
                                
                                    echo'<div class="couleur"><p class="titre"><strong>' . htmlspecialchars($donnees['Equipe']) . ' </strong></p>
                                                <p> ' . htmlspecialchars($donnees['Nom_Prenom']) . '</p>
                                                <p class="numero"> ' . htmlspecialchars($donnees['Date_de_debut']) . ' 
                                                    ' . htmlspecialchars($donnees['Date de fin']) . ' </p>
                                         <p><strong>' . htmlspecialchars($donnees['TEL1']) . '</strong></p>  
                                         <p><strong>' . htmlspecialchars($donnees['TEL2']) . '</strong></p></div>';
                                          


                                }
                
                    if($donnees == NULL)
                        
                                {
                                    echo 'Aucune correspondance, veuillez entrez un autre mot clé';
                                    

                                }
qu'on remplace par :
if ($donnees == NULL) {
    echo 'Aucune correspondance, veuillez entrez un autre mot clé';
} else {
    while ($donnees = $reponse->fetch()) {
        echo '<div class="couleur"><p class="titre"><strong>' . htmlspecialchars($donnees['Equipe']) . ' </strong></p>
                                                <p> ' . htmlspecialchars($donnees['Nom_Prenom']) . '</p>
                                                <p class="numero"> ' . htmlspecialchars($donnees['Date_de_debut']) . ' 
                                                    ' . htmlspecialchars($donnees['Date de fin']) . ' </p>
                                         <p><strong>' . htmlspecialchars($donnees['TEL1']) . '</strong></p>  
                                         <p><strong>' . htmlspecialchars($donnees['TEL2']) . '</strong></p></div>';
    }
}

Mammouth du PHP | 1966 Messages

14 nov. 2014, 11:00

Le premier présente le même problème que l'original

le second tester une variable que l'on a pas encore instancier ne donnera sûrement pas une bonne réponse
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Nestecha
Invité n'ayant pas de compte PHPfrance

14 nov. 2014, 15:05

Le premier présente le même problème que l'original

le second tester une variable que l'on a pas encore instancier ne donnera sûrement pas une bonne réponse
Effectivement, j'étais fatigué >< Et avec un if(($donnees = $reponse->fetch) == NULL) ? x) Tellement l'impression que ce n'est qu'une question d'ordre ><

ynx
Mammouth du PHP | 586 Messages

14 nov. 2014, 15:25

Salut,

http://php.net/manual/fr/pdostatement.fetch.php

La méthode fetch ne retournera jamais la valeur NULL.
Au pire des cas elle retournera FALSE si la requête plante, mais qu'il y est aucun, un seul, ou plusieurs résultats, la méthode fetch retournera toujours un objet PDOStatement.

Mammouth du PHP | 737 Messages

14 nov. 2014, 17:25

Slt,

Le mieux du fait un mysql_num_rows de ta requête et si c'est supérieur à 0 tu affiches telle chose si c'est == 0 tu affiches telle autre chose.

A placer après ta requête et avant le while ;)

Mega
;)
Dyslexics are teople poo

ynx
Mammouth du PHP | 586 Messages

14 nov. 2014, 17:37

mysql_num_rows ne fonctionne pas avec PDO, il s'agit d'une fonction de l'api Mysql qui est désormais obsolète.

Plusieurs solutions possibles :
- utiliser la méthode PDOStatement::rowCount() mais qui ne fonctionne pas avec toutes les bdd (http://php.net/manual/fr/pdostatement.rowcount.php)
- effectuer une seconde requête "SELECT count(*) ..." pour récupérer le nombre de résultat (cf exemple 2 : http://php.net/manual/fr/pdostatement.r ... ample-1026)
- utiliser fetchAll() à la place de fetch pour récupérer directement l'ensemble des résultats

Nestecha
Invité n'ayant pas de compte PHPfrance

14 nov. 2014, 19:48

Et mettre tout les résultats dans un tableau multidimensionnel pour ensuite voir si le tableau est vide ou non, et boucler à travers le tableau pour les echo ?

Ca permettrait aussi d'organiser un peu mieux le code et de mettre l'extraction des données dans un fichier à part / une fonction.

Mammouth du PHP | 571 Messages

14 nov. 2014, 22:57

fetch() renvoie false si la requête ne retourne rien.Dès lors il te suffit juste de tester que le type renvoyé par fetch() n'est pas false donc un array.

if( !empty( $reponse->fetch() ) {
      while ($donnees = $reponse->fetch()) {
       //affichage des données

      }

}else{
        echo 'Aucun résultat ne correspond à votre recherche, veuillez entrez un autre mot clé';
      }
Autre variante: tester si la méthode query() de PDO renvoie un array auquel cas tu peux directement le parcourir avec une boucle foreach:
      $reponse = $bdd -> query("SELECT * FROM gesast WHERE Equipesansespace LIKE '%$requete%' ORDER BY id ") ;
  if( !empty( $reponse  ) ) {
   foreach( $reponse as $val ) {
 //affichage

 }

 }else{
        echo 'Aucun résultat ne correspond à votre recherche, veuillez entrez un autre mot clé';
      }