Problème Résultat requete mysql

AAAid -  
jordane45 Messages postés 40051 Date d'inscription   Statut Modérateur Dernière intervention   -
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
A voir également:

5 réponses

jee pee Messages postés 42547 Date d'inscription   Statut Modérateur Dernière intervention   9 773
 
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
AAAid
 
salut,
merci pour ton aide mais rien n'a changé c'est le même :(
0
jordane45 Messages postés 40051 Date d'inscription   Statut Modérateur Dernière intervention   4 761
 
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 42547 Date d'inscription   Statut Modérateur Dernière intervention   9 773
 
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
AAAid
 
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 40051 Date d'inscription   Statut Modérateur Dernière intervention   4 761
 
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