Rercherche Db

Bonjour,

J'ai ajouter une function qui me permettrai de faire une recherche dans ma Db et d'afficher les livres concerné grâce à un mot clé. Sauf que rien ne fonctionne, je n'ai pas d'erreur particulière mais le site ne réagit pas..

Quelqu'un à une idée?
Voici tout mon code, je débute en php.

Merci

	public function select($mot = ''){
		require_once(MODEL . 'Livre.php');
		
		if($mot != ''){
			$query = "SELECT * FROM livres WHERE titre LIKE %'".$mot."'%";
		}else{

		$query = 'SELECT * FROM livres ORDER BY no DESC'; //select dans la table des livres

		$result = $this->_db->query($query);

		$tableau = array();
		if ($result->rowcount() != 0 ){
			while($row = $result->fetch()){
				$tableau[] = new Livre($row->no,$row->titre,$row->auteur); //attribue a chaque colonnes les attribut de la classe Livre
			}
		} 	
		return $tableau;	
		}
	}


	public function run(){
		require_once(MODEL . 'Db.php');
		$mot = '';
		$tabLivres='';
		$tabLivres=Db::getInstance()->select($mot);

		#Ajouter d'un livre dans la DB
			if(!empty($_POST['submit_ajouter'])){ //IMPORTANT !!
				if(!empty($_POST['titre'] && !empty($_POST['auteur']))){
				$titre = $_POST['titre'];
				$auteur = $_POST['auteur'];

				Db::getInstance()->insert(htmlspecialchars($titre),htmlspecialchars($auteur));	
			}
		}
		$tabLivres=Db::getInstance()->select($mot);

		#Effectuer une recherche dans la DB
		if(!empty($_POST['submit_recherche'])){
			if(!empty($_POST['keyword'])){
				$mot = $_POST['keyword'];
				Db::getInstance()->select($mot);
			}else{
				$tabLivres=Db::getInstance()->select($mot);
			}
		}


			<label>Rechercher:</label>
			<form action="index.php?action=livres" method="POST">
				<input type="text" name="keyword">
				<input type="submit" name="submit_recherche" value="Rechercher">
			</form><br><br>


3 réponses

  1. Bonjour,

    Dans cette requête :
    $query = "SELECT * FROM livres WHERE titre LIKE %'".$mot."'%";

    la requête SQL une fois les variables remplacées devient :
    SELECT * FROM livres WHERE titre LIKE %'mot'%

    Or la bonne syntaxe est avec les % à l'intérieur de la chaîne de caractères :
    SELECT * FROM livres WHERE titre LIKE '%mot%'


    Xavier
    1. Merci, par contre quand je clique sur rechercher j'ai un Warning : Division by Zero à la ligne du select.
    2. Alors tu n'as pas dû mettre le % comme il faut.
      Ta ligne doit ressembler à ça :
      $query = "SELECT * FROM livres WHERE titre LIKE '%$mot%'";

      Xavier

      (PS : quitte à utiliser les guillemets doubles, autant inclure les variables simples directement dans le texte comme je l'ai fait, ça facilite la lecture et évite la multiplication des . et des ")
    3. J'ai plus d'erreur, par contre le site ne reagit toujours pas quand je clique sur le bouton rechercher...
    4. Ca fonctionne ! par contre je ne comprend pas trop pourquoi, dans la function run() j'ai d'abord mis le code de la recherche puis le code de l'ajout d'un livre et la a fonctionne... Mais je ne comprend pas trop ce que cela change
    5. Ah j'ai vu pourquoi.
      Tu as une erreur de syntaxe dans ton bloc d'insertion, du coup le script s'arrêtait là.
      if(!empty($_POST['titre'] && !empty($_POST['auteur']))){

      Le parenthésage est foireux. Il faut mettre :
      if (!empty($_POST['titre']) && !empty($_POST['auteur'])) {

      Xavier
  2. Salut,

    Si ce n'est pas déjà fait, commence par activer l'affichage des erreurs PHP : http://www.infowebmaster.fr/tutoriel/afficher-erreur-php

    Si tu utilises PDO, active l'affichage des erreurs sql : https://www.php.net/manual/fr/pdo.error-handling.php

    As tu des erreurs après avoir activé leurs affichages ?

    La méthode "rowcount" retourne le nombre de ligne affectée par une requête DELETE, UPDATE ou INSERT mais ne garantie pas de retourner le nombre de ligne d'une requête SELECT.
    Voir https://www.php.net/manual/fr/pdostatement.rowcount.php#example-1076

    Enfin, nous n'avons pas le code où tu affiches les résultats de ta recherche.

    Bonne journée,
    1. Contributeur
      'lut,

      au passage, tu n'utilises pas les requêtes préparées, et ton code montre clairement une vulnérabilité d'injection SQL:
      $_POST['keyword']
      finit inséré directement dans ta requête SQL.

      Explications plus approfondies ici.
      Doc PHP sur les requêtes préparées là.