Partage
  • Partager sur Facebook
  • Partager sur Twitter

Script PHP recherche sur une table Warning: mysql

    21 janvier 2019 à 10:53:34

    Bonjour,

    Je souhaite faire un petit moteur de recherche sur une table mysql. Cela me permet de rechercher un licencié par son numéro.

    J'ai trouvé un petit script qui fait très bien ce que je veux, mais dés que je remplace les noms des colonnes et la table de recherche vers ma table j'ai cette erreur.

    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /volume1/web/cpbvrc/liste/recherche.php on line 86

    Je ne comprends pas car si je test avec les colonnes et une autre table de mon site (Mes utilisateurs) ça fonctionne, mes dés que je remplace par ma table "race_licence_ffvrc" et que j'appel les nom, prenom et licence j'ai l'erreur.

    J'ai aussi une table de test "utilisateurs" ça fonctionne aussi.

    Es que cela vient de ma table ? C'est un import d'un fichier excel en OpenDocument.

    Voici le code avec le quel j'ai l'erreur.
    Merci pour votre aide.

    <?php
    mysql_connect('localhost','utilisateur','code');
    mysql_select_db('base_de_donnees');
    //On determine l'expression a rechercher
    if(isset($_GET['recherche']))
    {
            $rec = htmlentities($_GET['recherche']);
    }
    else
    {
            $rec = 'php MYSQL';
    }
    //On determine le type de recherche
    if(isset($_GET['type']))
    {
            if($_GET['type']=='un')//Un des mots
            {
                    $type = 1;
            }
            elseif($_GET['type']=='tout')//Tout les mots
            {
                    $type = 2;
            }
            else//L'expression exacte
            {
                    $type = 3;
            }
    }
    else
    {
            $type = 1;//type par defaut: L'expression exacte
    }
    //On determine si on doit surligner les mots dans les resultats
    if(!isset($_GET['surligner']) or $_GET['surligner']!='true')
    {
            $surligner = false;
    }
    else
    {
            $surligner = true;
    }
    //On dertermine les identifiants, les noms et les informations des utilisateur
    $req = 'SELECT nom, prenom, licence FROM race_licence_ffvrc WHERE ';
    if($type==1)
    {//ayant un des mots dans leurs informations
            $mots = explode(' ',$rec);//En separre lexpression en mots cles
            foreach($mots as $mot)
            {
                    $req .= ' licence LIKE "%'.$mot.'%" OR';
            }
            $req .= ' 1=0';
    }
    elseif($type==2)
    {//ayant tout des mots dans leurs informations
            $mots = explode(' ',$rec);//En separre lexpression en mots cles
            foreach($mots as $mot)
            {
                    $req .= ' licence LIKE "%'.$mot.'%" AND';
            }
            $req .= ' 1=1';
    }
    else
    {//ayant l'expression exacte dans leurs informations
            $req .= 'licence LIKE "%'.$rec.'%"';
    }
    //Les utilisateur seront ranges par identifiant en ordre croissant
    $req .= ' order by id asc';
    $requete = mysql_query($req);
    //Le formulaire de recherche
    ?>
    <form action="" method="get">
    Expression &agrave; rechercher: <input type="text" name="recherche" value="<?php echo $rec; ?>" /><br />
    Type de recherche: <input type="radio" name="type" value="un"<?php if($type==1){echo 'checked="checked"';} ?> /> Un des mots <input type="radio" name="type" value="tout"<?php if($type==2){echo 'checked="checked"';} ?> /> Tout les mots <input type="radio" name="type" value="exacte"<?php if($type==3){echo 'checked="checked"';} ?> /> Expression exacte<br />
    Mettre en gras les mots recherch&eacute;s: <input type="checkbox" name="surligner" value="true" <?php if($surligner){echo 'checked="checked"';} ?> /><br />
    <input type="submit" value="Rechercher" />
    </form>
    <h2>R&eacute;sultats</h2>
    <table>
            <tr>
                    <th>Identifiant</th>
                    <th>Nom</th>
                    <th>Informations</th>
            </tr>
    <?php
    //On affiche les resultats
    while($dnn = mysql_fetch_array($requete))
    {
    ?>
            <tr>
                    <td><?php echo $dnn['nom']; ?></td>
                    <td><?php echo $dnn['prenom']; ?></td>
                    <td><?php
    if($surligner)//Si il faut surligner les mots, on les surligne
    {
            if($type==3)
            {
                    echo preg_replace('#('.preg_quote($rec).')#i', '<strong>$1</strong>', $dnn['licence']);//On surligne l'expression exacte
            }
            else
            {
                    echo preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $dnn['licence']);//On surligne les mots cles de la recherche
            }
    }
    else
    {
            echo $dnn['licence'];//On ne surligne pas
    }
    ?></td>
            </tr>
    <?php
    }
    ?>
    </table>




    -
    Edité par titis14 21 janvier 2019 à 10:55:36

    • Partager sur Facebook
    • Partager sur Twitter
      21 janvier 2019 à 11:05:45

      Salut !

      PAS DE htmlspecialchars() NI htmlentities() SUR DES DONNÉES QU'ON ENVOIE EN BASE

      Ces deux fonctions ne sont absolument pas prévues pour sécuriser des données dans ce contexte. Plus d'informations ici et .
      Donc oubliez l'appel à htmlentities() ligne 7.

      Il faudra utiliser mysql_real_escape_string() sur les mots-clés dans les trois branches du if lignes 44 à 65, parce qu'actuellement, ce script est une jolie passoire.

      Ligne 68, il serait très intéressant d'ajouter or exit(mysql_error()) avant la fin de l'instruction, l'erreur sera jetée avant, mais avec des informations plus pertinentes.

      Il faut aussi savoir que ce code ne fonctionnera pas sur PHP 7.0 ou plus récent, les fonctions mysql_*() y ayant été supprimées. Il serait temps de penser à utiliser une autre API de connexion à la base de données, à mon avis (et il sera partagé par bien d'autres personnes).

      -
      Edité par Ymox 21 janvier 2019 à 11:07:14

      • Partager sur Facebook
      • Partager sur Twitter
        21 janvier 2019 à 11:35:45

        Je suis peut être hors sujet, mais je tente, 

        Pourquoi ne pas utiliser un système AJAX pour la recherche ?
        • Partager sur Facebook
        • Partager sur Twitter
          21 janvier 2019 à 15:39:47

          Bonjour, merci pour vos réponse détaillé.

          Comme le script est vieux je suis passé sur du AJAX j'ai trouvé un script, mais le problème c'est qu'il faut que j'ai un résultat avec un lien exemple index.php?recherche=064512 pour un formulaire, celui que j'ai trouvé est un live seach es que c'est possible d'ajouter une tel fonction ?

          J'ai utilisé celui-ci

          Merci

          https://www.webslesson.info/2016/03/ajax-live-data-search-using-jquery-php-mysql.html

          -
          Edité par titis14 21 janvier 2019 à 15:55:54

          • Partager sur Facebook
          • Partager sur Twitter
            21 janvier 2019 à 15:59:53

            Bonjour,

            Cela voudrait dire que la  requête est fausse. Il faudrait l'afficher :

            echo $query;
            $result = mysqli_query($connect, $query);
            if(mysqli_num_rows($result) > 0)

            Pour la passer éventuellement dans phpMyAdmin en test.

            • Partager sur Facebook
            • Partager sur Twitter
              21 janvier 2019 à 16:05:30

              pour ajax, je te conseille ce code , a adapter bien sûr :) 


              function RechercheQuantite(chaine) {
                  var xhr = new XMLHttpRequest(); // instanciation d'un objet XMLHttpRequest
              
                  xhr.onreadystatechange = function() // gestion de la réponse du serveur
                  {
                      if (xhr.readyState==4 && xhr.status==200)
                      {
                          document.getElementById("tableau").innerHTML = xhr.responseText; // modification du contenu de la page web
                      }
                  }
                  
                  xhr.open("GET", "AJAX/RechercheQuantite.php?quantite="+chaine, true); // préparation de la requête HTTP (ici la méthode GET, appel d'un script PHP avec un paramètre)
                  xhr.send(); // envoi de la requête HTTP
              }

              -
              Edité par Fox Aera 21 janvier 2019 à 16:05:55

              • Partager sur Facebook
              • Partager sur Twitter
                21 janvier 2019 à 16:17:52

                Merci pour ta réponse Mathieu, je suis pas très calé en codage, ton bout de code il faudrait que je l'ajoute dans cette page ?

                Merci

                <?php
                //fetch.php
                $connect = mysqli_connect("localhost", "root", "password", "bade_de_donnee");
                $output = '';
                if(isset($_POST["query"]))
                {
                 $search = mysqli_real_escape_string($connect, $_POST["query"]);
                 $query = "
                  SELECT * FROM race_licences_ffvrc 
                  WHERE licence LIKE '%".$search."%'
                  OR nom LIKE '%".$search."%' 
                  OR prenom LIKE '%".$search."%' 
                  OR club LIKE '%".$search."%' 
                  OR ligue LIKE '%".$search."%'
                 ";
                }
                else
                {
                 $query = "
                  SELECT * FROM race_licences_ffvrc ORDER BY licence
                 ";
                }
                $result = mysqli_query($connect, $query);
                if(mysqli_num_rows($result) > 0)
                {
                 $output .= '
                  <div class="table-responsive">
                   <table class="table table bordered">
                    <tr>
                     <th>Licence</th>
                     <th>Nom</th>
                     <th>Prenom</th>
                     <th>Club</th>
                     <th>Ligue</th>
                    </tr>
                 ';
                 while($row = mysqli_fetch_array($result))
                 {
                  $output .= '
                   <tr>
                    <td>'.$row["licence"].'</td>
                    <td>'.$row["nom"].'</td>
                    <td>'.$row["prenom"].'</td>
                    <td>'.$row["club"].'</td>
                    <td>'.$row["ligue"].'</td>
                   </tr>
                  ';
                 }
                 echo $output;
                }
                else
                {
                 echo 'Data Not Found';
                }
                
                ?>



                • Partager sur Facebook
                • Partager sur Twitter
                  22 janvier 2019 à 14:47:42

                  Bonjour,

                  J'ai avancé, j'ai trouvé un système bien plus à jour qui fonctionne même avec php 7.3, qui me donne un lien de recherche bref parfait. Mais j'ai une petite galère (Enfin 2 mais on verra plus tard), mes recherches son sous forme de tableau, j'ai bien réussi à faire ma ligne pour le titre de mes colonnes, mais j'ai 2x la recherche qui s'affiche
                  Exemple ici avec un résultat http://192.168.1.8/cpbvrc/liste/moteurPHP5.5/moteur-ajax-click-PHP5.5.php?q=poujardieu Il me dit bien 2 résultats mais m'affiche 2x le même.

                  Je me suis basé sur ce script: https://blog.internet-formation.fr/2013/09/moteur-de-recherche-php-objet-poo-complet-pagination-surlignage-fulltext/

                  Voici le code, cela se passe au niveau de la ligne 85 à 119 je n'arrive pas à trouver mon erreur.

                  Merci de votre aide.

                  EDIT:

                  J'ai trouvé mon erreur, il fallait retirer tout les $texte

                  				<tr>
                  					<td>'.$key['licence'].'</td>
                  					<td>'.$key['nom'].'</td>
                  					<td>'.$key['prenom'].'</td>
                  					<td>'.$key['club'].'</td>
                  					<td>'.$key['ligue'].'</td>
                  					<td>'.$key['type_licence'].'</td>
                  					<td>'.$key['type_pilote'].'</td>
                  					<td>'.$key['espoir'].'</td>
                  					<td>'.$key['expert'].'</td>
                  					<td>'.$key['date_licence'].'</td>				
                  				</tr>

                  Le problème c'est que maintenant il me répète la barre des titres lors d'une recherche

                  Exemple: http://sebr.fr/cpbvrc/liste/moteurPHP5.5/moteur-ajax-click-PHP5.5?q=michel

                  Comment éviter cela ? Merci

                  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                  <html xmlns="http://www.w3.org/1999/xhtml">
                  <head>
                  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                  <title>Test du moteur de recherche</title>
                  <link rel="stylesheet" href="css/click-trigger.css" type="text/css" />
                  <script type="application/javascript" src="js/jquery.js"></script>
                  <script type="application/javascript" src="js/ajaxTrigger.js"></script>
                    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
                    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
                    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
                  </head>
                  
                  <body>
                  <div class="container">
                  		<h2 align="center">Rechercher un licencier</h2><br />
                  			<form id="searchForm" name="moteurSubmit" method="GET" action="">
                  				<input type="text" class="form-control" value="<?php if(isset($_GET['q'])) { echo htmlspecialchars($_GET['q']); } ?>" name="q" id="moteur" />
                  				<div class="input-group">
                  				<input type="submit" value="Rechercher" />
                  			</form>
                  			</div>
                  	</div>
                  <?php
                  include_once("class.inc/BDD-PHP5.5.class-inc.php"); // Class PHP 5.5 (avec mysqli)
                  include_once("class.inc/stopwords.php");
                  include_once("class.inc/moteur-php5.5.class-inc.php"); // Class PHP 5.5
                  $output = '';
                  
                  //
                  // $link se trouve dans BDD.class-inc.php, il s'agit de la variable de connexion
                  // Attention, elle doit absolument être utilisée (sous ce nom ou un autre) en PHP 5.5 ou supérieur
                  // N.B. : elle s'ajoute en début d'appel des class moteurRecherche($link...), autoCompletion($link...) et alterTableFullText($link...)
                  //
                  
                  if(isset($_GET) && !empty($_GET['q'])) {
                      $moteur = new moteurRecherche($link, stripslashes($_GET['q']), 'race_licences_ffvrc', 'regexp', $stopwords);
                      $colonnesWhere = array('licence', 'nom', 'prenom', 'club', 'ligue', 'ligue', 'type_licence', 'type_pilote', 'espoir', 'expert', 'date_licence');
                      $moteur->moteurRequetes($colonnesWhere);
                  }
                  
                  if(isset($moteur)) {
                      // Affichage de la requête avec $moteur->requete
                      echo '<h3>Résultats de la recherche : <em>'.$moteur->requete.'</em></h3>';
                  
                  	// Création de la table des mots corrects
                  	if($moteur->isIndex("correctindex", "table_search") == false) {
                  		// Créé l'index correct
                  		$moteur->createIndex();
                  	}
                  
                  	// Tableau des mots puis ajout dans la table
                  	$motsCorrects = array("lorem", "ipsum", "dolor", "amet", "sit");
                  	$moteur->setIndex($motsCorrects);
                  
                  	// Affichage de la correction des résultats
                  	$corrections = $moteur->getCorrection();
                  	$moteur->getCorrectedResults();
                  	if(!empty($corrections)) {
                  		echo "<p>Tentez avec une autre orthographe : ".$corrections."</p>\n";
                  	}
                  
                  	// Fonction d'affichage des résultats (callback appelé ensuite)	
                  	function display($requete, $nbResults, $mots) {
                  
                  		if($nbResults == 0) { // Si aucun résultat n'est retourné
                  			echo "<p>Aucun résultat, veuillez effectuer une autre recherche !</p>";    
                  		} else { // Sinon on affiche les résultats en boucle
                  	 
                  			// Affichage du nombre de résultats (optionnel)
                  			// N.B. : important pour l'affichage de résultats suivants (class "numR") !!!
                  			$affichageResultats = new affichageResultats();
                  			echo $affichageResultats->nbResultats(true);
                  			
                  			// Instanciation des ID (et du numéro de résultat si besoin)
                  			$nb = 0;
                  			while(($key = mysqli_fetch_assoc($requete))) {
                  				$nb++; // Incrémentation de l'ID
                  				
                  				// On encode chaque clé/valeur de résultats en UTF-8
                  				foreach($key as $k => $v) {
                  					 $key[$k] = utf8_encode($v);
                  				}
                  			// Résultats de recherche à afficher (à personnaliser)				
                  				{
                  				 $output .= '
                  				  <div class="table-responsive">
                  				   <table class="table table bordered">
                  					<tr>
                  					 <th>Licence</th>
                  					 <th>Nom</th>
                  					 <th>Prenom</th>
                  					 <th>Club</th>
                  					 <th>Ligue</th>
                  					 <th>Type de licence</th>
                  					 <th>Type de pilote</th>
                  					 <th>Espoir</th>
                  					 <th>Expert</th>
                  					 <th>Date de la licence</th>
                  					</tr>
                  				 ';
                  				 {
                  				  $output .= '
                  				<tr>
                  					<td>'.$key['licence'].'</td>
                  					<td>'.$key['nom'].'</td>
                  					<td>'.$key['prenom'].'</td>
                  					<td>'.$key['club'].'</td>
                  					<td>'.$key['ligue'].'</td>
                  					<td>'.$key['type_licence'].'</td>
                  					<td>'.$key['type_pilote'].'</td>
                  					<td>'.$key['espoir'].'</td>
                  					<td>'.$key['expert'].'</td>
                  					<td>'.$key['date_licence'].'</td>				
                  				</tr>
                  				';
                  				 }
                  				 echo $output;
                  				}
                  				
                  				// Affichage du contenu après surlignage des mots recherchés
                  				// N.B. : optionnel --> possibilité de remplacer par echo $texte;
                  				$surlignage = new surlignageMot($mots, $texte);
                  				echo $surlignage->contenu;
                  			} // Fin de la boucle while
                  		}
                  	} // Fin de la fonction display (callback)
                  
                  	// Nombre de résultats par "tranche d'affichage"
                  	$limit = 10;
                  	
                  	// Lancement de la fonction d'affichage avec paramètres
                  	$moteur->moteurAffichage('display', '', array(true, 0, $limit, false));
                  	
                  	// Affichage de la zone de chargement
                  	echo '<div id="loadMore">Afficher plus de résultats...</div>';
                  }
                  ?>
                  <script type="application/javascript">
                  jQuery(document).ready(function () {
                  	// Tableau des arguments optionnels (ici les valeurs par défaut)
                  	var args = {
                  		target: 'queryAjax-PHP5.5.php',				// Cible contenant le contenu à charger (boucle PHP/MySQL en général)
                  		limit: 5,									// Nombre de résultats à afficher par chargement
                  		nbResult: jQuery('.numR').text(),			// Nombre total de résultats (récupéré dynamiquement)
                  		duration: 300,								// Durée d'affichage de l'image de chargement (en ms) --> 0 pour annuler !
                  		classLast: '.results',						// Class des résultats affichés (obligatoire pour fonctionner !)
                  		loadImg: 'img/loadingBlue.gif',				// Image de chargement ('' pour ne pas afficher d'image)
                  		idImg: 'imgLoading',						// ID du bloc contenant l'image de chargement
                  		attrID: 'id',								// Attribut contenant le numéro du résultat affiché ('id' conseillé !)
                  		evt: 'click',								// Type d'événement Javascript pour lancer la fonction
                  	};
                  	
                  	// Options complémentaires (requête de recherche par exemple ici --> Totalement personnalisable !)
                  	var options = {
                  		q: '<?php if(isset($moteur->requeteCorrigee)) { echo $moteur->requeteCorrigee; } elseif(isset($_GET['q'])) { echo $_GET['q']; } ?>'
                  	};
                  	
                  	// Lancement de la fonction sur l'élément "Afficher plus"
                  	jQuery('#loadMore').ajaxTrigger(args, options);
                  });
                  </script>
                  </body>
                  </html>




                  -
                  Edité par titis14 22 janvier 2019 à 21:04:51

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Script PHP recherche sur une table Warning: mysql

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown