Problème Résultat requete mysql

Fermé
AAAid - Modifié par jordane45 le 21/04/2015 à 19:17
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 22 avril 2015 à 01:08
Salut à tous,

voilà mon problèmes se situe dans mon code et pour être plus précis dans la requete sql suivante :
<table>
<tr id="entetetab">
<td><b>ID</b></td><td><b>Titre</b></td><td><b>ISBN</b></td><td><b>Nom Auteur</b></td><td><b>Prénom Auteur</b></td>
<td><b>Theme</b></td>
</tr>
<?php
if(isset($_POST['titre']) && isset($_POST['auteur']))
 {
 $titre=$_POST['titre'];
 $auteur=$_POST['auteur'];
 $req="SELECT `livre`.`id_livre`, `livre`.`Titre`, `livre`.`ISBN`,`auteur`.`Nom`, `auteur`.`prenom`,`theme`.`Nom` FROM `livre`,`auteur`,`theme`
  WHERE `livre`.`id_auteur`=`auteur`.`id_auteur` AND `livre`.`id_theme`=`theme`.`id_theme` AND `livre`.`Titre` LIKE '%$titre%' OR `auteur`.`Nom` LIKE '%$auteut%' OR `auteur`.`prenom` LIKE '%$auteut%'";
 $oPDOStatement=$idcom->query($req);
 $oPDOStatement->setFetchMode(PDO::FETCH_OBJ);
 while ($row = $oPDOStatement->fetch())
     {
      echo "<tr><td>$row->id_livre</td><td>$row->Titre</td><td>$row->ISBN</td><td>$row->Nom</td><td>$row->prenom</td><td>$row->Nom</td>
   </tr>";
  }

}

$idcom=NULL;
?>
</table>


le résutat que je veux obtenir sont les informations du livre obtenu à partir de la recherche effectué par l'utilisateur soit par le nom ou prénom auteur et le titre de livre alors que dans la requete il affiche tout les livres ainsi que tout les auteurs .

merci d'avance

5 réponses

jee pee Messages postés 39649 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 26 avril 2024 9 238
21 avril 2015 à 18:57
Salut,

Déjà ta condition sur titre nom prénom, il faudrait la mettre avec des parenthèses:

AND ( titre ...OR nom ... OR prenom ....)

Ensuite il se pose un problème si l'un des 3 n'est pas renseigné. Le like se fait donc avec like '%%', c'est à dire toutes les lignes.

Tu pourrais essayer de remplacer NULL par une valeur qui n'arrive pas (exemple AAAZZZZEEE333) quand tu affectes les variables en php

cdlt
0
salut,
merci pour ton aide mais rien n'a changé c'est le même :(
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié par jordane45 le 21/04/2015 à 19:23
Bonjour,

Peux tu tester avec cette requête :
SELECT L.Titre
       ,L.ISBN
       ,A.Nom
       ,A.prenom
       ,T.nom
FROM livre L
LEFT JOIN auteur A ON A.id_auteur = L.id_auteur
LEFT JOIN theme  T ON T.id_theme  = L.id_theme
WHERE A.Nom LIKE '%$auteur%'
   OR A.prenom LIKE '%$auteur%'
   OR L.Titre  LIKE '%$titre%' 

NB : Es-tu sûr que ta variable c'est bien $auteut ? et pas $auteur ...(j'ai corrigé dans ma requête ci-dessus ! )

Cordialement,
Jordane
0
jee pee Messages postés 39649 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 26 avril 2024 9 238
Modifié par jee pee le 21/04/2015 à 19:49
Salut,

Je suis un vieil utilisateur d'Oracle, et cette syntaxe nativement n'existait pas. Elle a été introduite après pour être sql ansi, mais les anciens n'ont jamais accroché ;-) Pourtant, et c'est clair dans cet exemple, cela permet de bien dissocier jointure et critères de sélection.

En php (je ne pratique pas) '%$auteur%' va bien détecter la variable $auteur pas $auteur% ? il n'y a pas des délimiteurs type '%"$auteur"%' ou '%{$auteur}%'

Et comme je l'écrivais, si l'un des 2 criteres est vide, on ramène toutes les lignes.

Et surtout le choix de départ est mauvais. Si dans le formulaire le champ "Nom prénom" contient 'Victor Hugo', jamais on ne peut trouver l'auteur avec A.Nom LIKE '%$auteur%' OR A.prenom LIKE '%$auteur%'.
0
Salut,
merci pour ton aide mais malheureusement le problème n'est pas résolu et tu as raison c'est auteur pas auteut ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié par jordane45 le 22/04/2015 à 01:12
Comme le suggère Jee Pee.. si un des champs AUTEUR ou TITRE n'est pas renseigné dans ton formulaire... normal que ça te retourne plus de lignes que ce que tu souhaites......

A la limite il faudrait procéder ainsi :
if(isset($_POST)) {
 $titre=isset($_POST['titre']) && $_POST['titre'] !='' ? $_POST['titre'] : NULL;
 $auteur=isset($_POST['auteur']) && $_POST['auteur'] !='' ? $_POST['auteur'] : NULL;

$strAuteur = $auteur ?  " (A.Nom LIKE '%$auteur%'   OR A.prenom LIKE '%$auteur%' )" : '';
$strTitre = $titre ? " L.Titre  LIKE '%$titre%' "

// a remplacer par un OR si tu veux que ça soit l'un OU l'autre
$And_titre = $auteur ? " AND " : '' ;
 if($titre || $auteur ){
 $req="SELECT L.Titre
                 ,L.ISBN
                 ,A.Nom
                 ,A.prenom
                 ,T.nom
           FROM livre L
           LEFT JOIN auteur A ON A.id_auteur = L.id_auteur
           LEFT JOIN theme  T ON T.id_theme  = L.id_theme
           WHERE $strAuteur  $And_titre $strTitre ";

  // le temps des tests pour voir la requête... et éventuellement
  // la tester directement dans ta BDD :
  echo "<pre><b>Requête :</b><br>".$req."</pre>";

 $oPDOStatement=$idcom->query($req);
 $oPDOStatement->setFetchMode(PDO::FETCH_OBJ);
 while ($row = $oPDOStatement->fetch())  {
   echo "<tr>
              <td>".$row->id_livre."</td>
              <td>".$row->Titre."</td>
              <td>".$row->ISBN."</td>
              <td>".$row->Nom."</td>
              <td>".$row->prenom."</td>
              <td>".$row->Nom."</td>
     </tr>";
  }


}else{
 echo "<br> Aucun Titre ou Auteur passé en paramètre !";
}
}// fin du IF POST
0