Erreur de recherche MySQL

Fermé
fareohh Messages postés 63 Date d'inscription samedi 9 septembre 2017 Statut Membre Dernière intervention 30 mars 2021 - Modifié le 3 mai 2018 à 20:52
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 4 mai 2018 à 09:27
Bonsoir, je reviens pour un 3 ème topic car j'ai de nouveau un problème (je pense que c'est pas fini..)

Voilà en fait, j'ai un code qui permets de rechercher dans ma table nommé "fichiers", des résultats similaire à ma variable $requete.
ma table se constitue de touts ces champs:
ID (contiens une chaîne alphanumérique de 5 caractères)
name (contiens une chaîne alphanumérique, espace et peut éventuellement contenir des ./%/&/; /[/]/(/) )
pseudo (contiens une chaîne alphanumérique, espace et peut éventuellement contenir des ./%/&/; /[/]/(/) )
type (contiens une chaîne alphanumérique (3: "Beatmap", "Skin" & "Replay"))
img (contiens une chaîne alphanumérique, espace et peut éventuellement contenir des ./%/&/; /[/]/(/) )
date (contiens une chaîne alphanumérique, espace et peut éventuellement contenir des .)

Donc dans ma table j'ai mis des données pour faire des test..



Le problème c'est que quand je fait une recherche dans 'name' avec ma variable $requete, avec pizza il m'affiche toutes les lignes avec pizza dans 'name' si il est seul.. mais lors ce qu'il y a plusieurs mots dans 'name' il ne m'affiche rien. Si je fait une recherche avec "l'historie avec nathalie.osz", il ne m'affiche rien.. Help.. :'(

Si quelqu'un au passage, sais comment je peux faire pour rechercher un résultat que par rapport a un état de variable, je m'explique:

Lors ce que l'utilisateur fait une recherche, avoir 3 boutons radio qui renvoie dans une variable $type la valeur Beatmap, Skin ou Replay. Et en fonction de ça, rechercher des résultats que si le type est Beatmap, Skin ou Replay. Exemple:
Je fait une recherche avec le mot clé "nathalie" et je sélectionne Beatmap, afficher uniquement les liges ou la colonne type est Beatmap, autrement dit, aucun résultat, et si aucun des 3 n'es sélectionné à la recherche, afficher les résultats quelque soit la variable type.

Voilà mon code:

<?php

 error_reporting(E_ALL);
 ini_set('display_errors', TRUE);
 ini_set('display_startup_errors', TRUE);

 try{
  $bdd = new PDO('mysql:host=web2.pulseheberg.net;dbname=wkmfc8_osudl;charset=utf8', 'MACLE');
  $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
 }  
 
 catch(PDOException $e) {
  die('Erreur : ' . $e->getMessage());
 }
 
 
 $requete = !empty($_POST['requete']) ? $_POST['requete'] : NULL ;
 
 if($requete){
  $sql = "SELECT * FROM fichiers WHERE name LIKE :requete ORDER BY id DESC";
  $datas = array(':requete' => $requete . '%');
 try{
  $req = $bdd->prepare($sql);
  $req->execute($datas);
  $resultat = $req->fetchAll(); 
 } 
 catch(PDOException $e) {
    die('Erreur : ' . $e->getMessage());
 }
 $nb_resultats = !empty($resultat) ? count($resultat) : 0;

 if($nb_resultats != 0){ 
  echo $nb_resultats;  
  $res = $nb_resultats>1 ? 's': '';
  echo ' résultat'.$res. '   trouvé'.$res;
  echo "<tr>";
    foreach($resultat as $donnees){
        echo "
   <td>".$donnees['ID']."</td>
   <td>".$donnees['name']."</td>
   <td>".$donnees['pseudo']."</td>
   <td>".$donnees['type']."</td>
   <td ><a href=\"http://news.osudl.re/fichiers/".$donnees['name']."\">Download</a></td>
   <td><img src=\"http://news.osudl.re/images/".$donnees['img']."\"></td>
   <td >".$donnees['date']."</td></tr><br />";
    }
  echo "</tr>";
?>
    <br/>
    <br/>
    <a href="dn.php">Nouvelle recherche</a></p>
<?php
 } 
  else {
?>
 
    <h3>Pas de résultats</h3>
    <p>Nous n'avons trouvé aucun résultat pour votre recherche "<?php echo $_POST['requete']; ?>". <a href="dn.php">Réessayez</a> avec autre chose.</p>
<?php
  }
 } 
 else {
?>
  <p>Rechercher</p>
  <form action="#" method="Post">
  
  
  <input type="text" name="requete" size="10">
  <input type='radio' name='type' value='Beatmap' />
  <input type='radio' name='type' value='Skin' />
  <input type='radio' name='type' value='replay' />
  
  <input type="submit" value="Chercher">
  </form>
  <?php 
  $conn = mysqli_connect('89.234.180.28','MACLE','wkmfc8_osudl' ) or die ("erreur de connexion");
  $req = "SELECT * FROM fichiers";
  $res = $conn->query($req);
   echo " <tr> ";
  while ($data = mysqli_fetch_array($res)) {
   echo "
   <td>".$data['ID']."</td>
   <td>".$data['name']."</td>
   <td>".$data['pseudo']."</td>
   <td>".$data['type']."</td>
   <td ><a href=\"http://news.osudl.re/fichiers/".$data['name']."\">Download</a></td>
   <td><img src=\"http://news.osudl.re/images/".$data['img']."\"></td>
   <td >".$data['date']."</td></tr><br />";  
 }
   echo "</tr>";
?>
<?php
}
?>




A voir également:

2 réponses

yg_be Messages postés 22727 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476
Modifié le 3 mai 2018 à 22:20
bonsoir,
moi je commencerais par remplacer LIKE par =.
et ensuite, faire le travail pour mettre la bonne valeur dans $type.
0
fareohh Messages postés 63 Date d'inscription samedi 9 septembre 2017 Statut Membre Dernière intervention 30 mars 2021
3 mai 2018 à 22:26
comment ça ?
0
fareohh Messages postés 63 Date d'inscription samedi 9 septembre 2017 Statut Membre Dernière intervention 30 mars 2021
Modifié le 3 mai 2018 à 22:35
le = ne fonctionne pas... Au contraire, même si je tente avec test.osz ça me trouve plus rien.
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é le 4 mai 2018 à 09:28
Bonjour,


Le problème c'est que quand je fait une recherche dans 'name' avec ma variable $requete, avec pizza il m'affiche toutes les lignes avec pizza dans 'name' si il est seul.. mais lors ce qu'il y a plusieurs mots dans 'name' il ne m'affiche rien

L'exemple de données que tu nous montres dans ta bdd ne contient qu'une seule ligne avec le mot pizza seul...
Dans quels cas ça ne fonctionne pas ???

Pour rappel, le like s'utilise avec des caractères jocker.

Actuellement, tu as utilisé juste un % à la fin ...
$requete . '%'

ce qui signifie que ta recherche se base sur : "Tout ce qui commence par $requete".

Si tu veux chercher tout ce qui "CONTIENT" $requête ( avec des mots avant et/ou après) il faut mettre également un % devant
<code php>'%'.$requete . '%'

</code>



Si quelqu'un au passage, sais comment je peux faire pour rechercher un résultat que par rapport a un état de variable

Au niveau de la requête, il suffit d'ajouter un AND dans ton WHERE
$sql = "SELECT * FROM fichiers WHERE name LIKE :requete  AND `type` = :type ORDER BY id DESC";
$datas = array(':requete' =>'%'. $requete . '%', ':type'=>$type);


Et Coté formulaire, une simple liste déroulante contenant tes différents type suffira....




0