Rercherche Db

stampia02 Messages postés 105 Statut Membre -  
stampia02 Messages postés 105 Statut Membre -
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. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    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
    1. stampia02 Messages postés 105 Statut Membre 1
       
      Merci, par contre quand je clique sur rechercher j'ai un Warning : Division by Zero à la ligne du select.
      0
    2. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      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 ")
      0
    3. stampia02 Messages postés 105 Statut Membre 1
       
      J'ai plus d'erreur, par contre le site ne reagit toujours pas quand je clique sur le bouton rechercher...
      0
    4. stampia02 Messages postés 105 Statut Membre 1
       
      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
      0
    5. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      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
      0
  2. Pitet Messages postés 2845 Statut Membre 530
     
    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
  3. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    '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à.
    1