PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 08-06-2017 10:38:13

celyne
Membre
Inscription : 08-06-2017
Messages : 3

Mettre en gras certains mots dans le PHP

Bonjour tout le monde,

Je débute dans le domaine informatique et surtout en PHP/MySQL et pour mon stage je dois créer un outils qui permettrai à l'entreprise de rechercher plus rapidement dans sa base de donnée car elle a 3 tables avec plusieurs champs et de nombreuse lignes sur chaque table et recherche dans ces tables un truc devient un parcours du combattant.

Voila j'ai regardé un peu partout et je désespère car je ne trouve pas de solution à mon problème.


Donc je vous explique mon problème. J'ai une BDD avec 3 tables ((clients, interactions, adresse) (elles sont fictifs car je fais d'abords sur des fausse pour ensuite faire sur les leurs afin de pas faire n'importe quoi) dans ces 3 tables j'ai plusieurs champs et plusieurs lignes. Ma table interaction est celle qui met en relation les 3 tables. (c'est une représentation identique a la BDD de mon tuteur de stage).

Donc jusque là tout va bien. J'arrive à affiché mes tables mais j'ai créer à coté une recherche par mots clefs pour que sur ma page j'ai que les lignes voulues (selon ma recherche) qui ne s'affiche. La recherche fonctionne sur une seule table (je n'arrive pas à faire en sorte qu'elle fonctionne pour les 3 tables, je ne sais pas pourquoi?).

Et en plus quand je fais ma recherche je devrais avoir les mots clefs rechercher qui ressorte en gras dans mes lignes car chaque lignes possèdent plusieurs champs mais tout les champs ne font pas partie de la recherche.

C'est a dire :

Table 1
1 id champs1 champs2 champs3 champs4 champs5
2 id champs1 champs2 champs3 champs4 champs5
3 id champs1 champs2 champs3 champs4 champs5
4 id champs1 champs2 champs3 champs4 champs5...

Table 2
1 id champs1 champs2 champs3 champs4 champs5
2 id champs1 champs2 champs3 champs4 champs5
3 id champs1 champs2 champs3 champs4 champs5
4 id champs1 champs2 champs3 champs4 champs5...

Table 3
1 id champs1 champs2 champs3 champs4 champs5
2 id champs1 champs2 champs3 champs4 champs5
3 id champs1 champs2 champs3 champs4 champs5
4 id champs1 champs2 champs3 champs4 champs5...


Ma recherche ce fait sur la champs1, champs2 et champs4 donc les mots rechercher de ces champs devraient ressortir en gras mais ce n'ai pas le cas.

Voici mon code php (Ce code corresponds du coup pour une table avec la recherche et sa fonctionne pour cette table car je n'arrive pas a faire fonctionné cette recherche toutes les tables.)


<?php

if(isset($_POST['valider'])){
    $_SESSION['table']=$_POST['valider'];
}

if(isset($_SESSION['table'])){

  if(isset($_POST['Sup'])){
    $id=$_POST['id'];
    $supprimer = $_POST['Sup'];
      try{ $bdd->query("DELETE FROM ".$_SESSION['table']. " WHERE id_".$_SESSION['table']. "=".$id);
      }catch(PDOException  $e ){
        echo "Error: ".$e;
      }
  }
  // Ceci est l'action pour supprimer la ligne d'une table
   
 
   
  if(isset($_POST['Modif'])){
    $id=$_POST['id'];
    $modifier = $_POST['Modif'];
    $preparation="";
    foreach ($_POST as $clef => $value) {
      if ($clef !='valider' && $clef != 'Modif' && $clef !='id'){
        $preparation=$preparation.$clef.'="'.$value.'",';
      }
     
    }
    $preparation = substr($preparation, 0, -1);
    $modifier=$bdd->query("UPDATE ".$_SESSION['table']. " SET ".$preparation. " WHERE id_".$_SESSION['table']. "=".$id);
  }
  // Ceci est l'action pour modifier la ligne d'une table
  if(isset($_POST['Envoyer'])){
    $preparation="";
    $insert="";
    foreach ($_POST as $clef => $value) {
      if ($clef !='valider' && $clef != 'Modif' && $clef !='id' && $clef !='Envoyer' && $clef !='"_$j_"' ){
        $insert=$insert.$clef.",";
        $preparation=$preparation."'".$value."',";
      }
    }
    $preparation = substr($preparation, 0, -1);
    $insert = substr($insert, 0, -1);
    $ajouter=$bdd->query('INSERT INTO '.$_SESSION['table'].'('.$insert.') VALUES('.$preparation.')');
  }
  // Ceci est l'action qui permet de faire envoyer ce qu'on a écrit.
  echo "<h1>".$_SESSION['table']."</h1>";
  echo "<table>";

  $entete=$bdd->query("SHOW COLUMNS FROM ".$_SESSION['table']);
    echo "<tr>";
  $enteteELT=$entete->fetchAll();

  for($x=0 ; $x<sizeof($enteteELT) ; $x++){
    echo '<th>'.$enteteELT[$x]['Field']. '</th>';
  }
    echo "</tr>";

  if(!empty($_POST['id])){
          $_SESSION['id]=$_POST['id];
        }
        if(empty($_SESSION['id])){
          $_SESSION['id']="%%"; // Permet d'avoir tous les résultats su aucune recherche n'a été effectuée
        }
            //Champ 1 = Code départemental
        if(!empty($_POST['champs1'])){
          $_SESSION['champs1']="%".$_POST['champs1']."%";
        }
        if(empty($_SESSION['champs1'])){
          $_SESSION['champs1']="%%";
        }

        //Champ 2
        if(!empty($_POST['champs2'])){
          $_SESSION['champs2']="%".$_POST['champs2']."%";
        }
        if(empty($_SESSION['champs2'])){
          $_SESSION['champs2']="%%";
        }

            //Champ 3
        if(!empty($_POST['champs3'])){
          $_SESSION['champs3']="%".$_POST['champs3']."%";
        }
        if(empty($_SESSION['champs3'])){
          $_SESSION['champs3']="%%";
        }

            //Champ 4
        if(!empty($_POST['champs4'])){
          $_SESSION['champs4']="%".$_POST['champs4']."%";
        }

        if(empty($_SESSION['champs4'])){
          $_SESSION['champs4']="%%";
        }

            //Champ 5
         if(!empty($_POST['champs5'])){
          $_SESSION['champs5']="%".$_POST['nom']."%";
        }
        if(empty($_SESSION['champs5'])) {
          $_SESSION['champs5']="%%"; // Permet d'avoir tous les résultats su aucune recherche n'a été effectuée
        }


        if(isset($_POST['reset'])){
        $_SESSION['id']="%%";
        $_SESSION['champs1']="%%"; // Permet d'avoir tous les résultats si aucune recherche n'a été effectuée
        $_SESSION['champs2']="%%";
        $_SESSION['champs3']="%%";
        $_SESSION['champs4']="%%";
        $_SESSION['champs5']="%%";
      }
 

            //Permet d'envoyer les requêtes
          $requete=$bdd->prepare('SELECT * FROM table WHERE id LIKE :id AND champs1 LIKE :champs1 AND  champs2 LIKE :champs2 AND  champs3 LIKE :champs3 AND  champs4 LIKE :champs4 AND  champs5 LIKE :champs5  LIMIT 100' ); //Selectionne ma table

          $requete->bindValue(':id,$_SESSION['id']);
          $requete->bindValue(':champs1',$_SESSION['champs1']);
          $requete->bindValue(':champs2',$_SESSION['champs2']);
          $requete->bindValue(':champs3',$_SESSION['champs3']);
          $requete->bindValue(':champs4',$_SESSION['champs4']);
          $requete->bindValue(':champs5,$_SESSION['champs5']);


      $requete->execute();
 
 


  while($requeteELT=$requete->fetch(PDO::FETCH_ASSOC)){
    echo "<tr>";
    echo '<form method="POST" action="travail.php">';
    $nb_colonne=0;
    foreach ($requeteELT as $clef => $valeur) {
      $nb_colonne++;      if (substr($clef, 0, 3)=='id_'){
        echo "<td>".$valeur.'</td>
        <input type="hidden" NAME="id" value="'.$valeur.'"/>';
      }
      else {
        echo "<td><input TYPE='text' NAME='".$clef."'  value='".$valeur."'></td>";
      }
    }

// boucle while qui permet la récupération de données des tables

    echo '<td>
    <input type="hidden" NAME="valider" VALUE="'.$_SESSION['table'].'"/>
    <input TYPE="submit" NAME="Modif" VALUE="Modifier"/>
    <input TYPE="submit" NAME="Sup" VALUE="Supprimer"/>
    </td>'; // Ces boutons permettent d'envoyer la modification ou la suppression d'une ligne de la table
    echo '</form>';
    echo "</tr>";
  }

  echo '<tr>';
  echo '<form method="POST" action="travail.php">'; // la fonction "action='..'" permet de redériger vers une page, ici on reste sur la même.
  echo '<input type="hidden" NAME="valider" VALUE="'.$_SESSION['table'].'"/>';


    $entete=$bdd->query("SHOW COLUMNS FROM ".$_SESSION['table']);
    echo "<tr>";
    while($enteteELT=$entete->fetch()){
      if(substr($enteteELT["Field"], 0, 3)=='id_'){
        echo '<td><input type="hidden" NAME="id"/></td>';
      }

      else {
        echo "<td><input TYPE='text' NAME='".$enteteELT["Field"]."'></td>";
      }
     
  }

  ?>
  <td>
  <input TYPE="submit" NAME="Envoyer" VALUE="Ajouter"/></td> <!-- permet d'ajouter une ligne sur la table
  </form>
  </tr>
  <?php echo "</table>"; // affiche la table

} else {
  echo " "; // permet de voir les tables sans le détails, sans les lignes, juste le nom de la table qui apparait.
}


?>

 

Sinon mon code pour mettre en lien les 3 tables c'est ca :


$requete=$bdd->prepare("SELECT  c.*, i.*, a.* FROM clients c
              LEFT OUTER JOIN  interaction i ON 'i.champs1'='c.champs1' LEFT OUTER JOIN adresse a  ON 'a.champs2'='i.champs2'
              WHERE 'i.champs4' LIKE '%%' AND 'c.champs5' AND 'c.champs3'
              ORDER BY 'i.champs1' DESC" );
 

Donc ma question est la suivante : Quelqu'un pourrait m'explique comment je peux faire (avec un exemple car sinon je n'arriverais pas à comprendre) pour que j'ai les mots qui ressorte en gras quand j'ai effectué une recherche ?? roll

J'espère qu'une personne va pouvoir m'expliquer afin que je puisse comprendre et refaire ! smile

Je vous remercie de toute l'aide que vous pourrez m'apporter mais également du temps que vous allez accorder à ce problème.

Dernière modification par celyne (08-06-2017 10:53:27)


Hors ligne

#2 08-06-2017 10:52:49

celyne
Membre
Inscription : 08-06-2017
Messages : 3

Re : Mettre en gras certains mots dans le PHP

Pour Info voici ce que j'ai essayé en code pour mettre en gras (après je sais pas si je l'avais bien placé ou si il y avait des erreurs je suis trop novice pour le voir par moi même) :


// recherche 1 Pour mettre les mots rechercher en gras dans le résultat

  echo "<br/>";

  $motclefs = " ";
  $search = explode(" ", $motclefs);

  foreach ($search as $data) {
    $bdd = " (id LIKE '%".$data."%' OR table LIKE '%".$data."%')";
  }

  $WHERE = 'WHERE'. implode(" ", (array) $bdd);

  echo $WHERE.'<hr>';

  $search = explode ("AND ", $motclefs);
  $WHERE = 'WHERE';
  $COUNT = 0;

  reset($search);

  while (list ($data) = each($search)) {
    $COUNT = $COUNT ++ ;
    if($COUNT==1) $WHERE = "( table LIKE '%".$data."%' OR id LIKE '%".$data."%')"; //recherche sur 1 mot
      else $WHERE = "AND (id '%".$data."%' OR table  LIKE '%".$data."%')"; //recherche sur plusieurs mots
  }

  echo $WHERE.'<hr>';
 
 

 
  $id="";
  $gras="N";
  $motclefs="";
  //$motclefs=$_POST['table];
 
  // Requete pour joindre plusieurs tables entre elles
  $requete=$bdd->prepare("SELECT  c.*, i.*, a.* FROM clients c
              LEFT OUTER JOIN  interaction i ON 'i.champs1'='c.champs1' LEFT OUTER JOIN adresse a  ON 'a.champs2'='i.champs2'
              WHERE 'i.champs4' LIKE '%%' AND 'c.champs5' AND 'c.champs3'
              ORDER BY 'i.champs1' DESC" );
  $requete->execute();
 
// On parcours toutes les tables


  while ($row=$requete->fetch(PDO::FETCH_ASSOC)){
      $id=stripslashes($row['id']);
     
    if ($id==$motclefs){
     
      // Fin controle
      $gras = "0";
      if ($gras=="0") echo("".$motclefs."<br/>");
      if ($gras="N") echo("<b>".$motclefs."</b> <br/>");
    }

  }

  var_dump($requete);

 
//Recherche 2 On determine l'expression a rechercher
  if(isset($_POST['motclefs'])){
 
  //On récupère ce qu'a rentrer l'utilisateur dans le champ texte et on utilise la fonction htmlentities pour se protéger d'une faille web
        $rec = htmlentities($_POST['motclefs']);
    }
    else {
    $rec = $bdd; //$bdd (c'est ma variable de connexion déclarer en début du code
    }

 
  //On determine le type de recherche
  if(isset($_POST['type'])){

        if($_POST['type']=='un')//Un des mots
        {
                $type = 1;
        }
        elseif($_POST['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($_POST['surligner']) or $_POST['surligner']!='true'){
        $surligner = false;
  }
  else{
        $surligner = true;
  }

    //On fait notre requete on va chercher toutes les entrées de "matable" ou les motclés correspondent a ce que vient de rentrer l'utilisateur
        $req = 'SELECT id, nom FROM table WHERE  ';
         

    if($type==1){
  //ayant un des mots dans leurs informations
        $motclefs = explode(' ',$rec);//En separre lexpression en mots clef
        foreach($motclefs as $mot){
                $req .= ' LIKE "%'.$mot.'%" OR';
        }
        $req .= ' 1=0';
  }

  elseif($type==2){
  //ayant tout des mots dans leurs informations
        $motclefs = explode(' ',$rec);//En separre lexpression en mots clef
        foreach($motclefs as $mot)
        {
                $req .= ' infos LIKE "%'.$mot.'%" AND';
        }
        $req .= ' 1=1';
  }
  else{
  //ayant l'expression exacte dans leurs informations
        $req .= 'infos LIKE "%'.$rec.'%"';
  }
         
    //On fait une boucle et on affiche tous les sujets par exemple ou motclés = mot
        // while($data= $req->fetch(PDO::FETCH_OBJ))
     
        // {
        //     echo '<a href="'.$data['unChamps'].'"> '.$data['unChamps'].'</a><br> </br>';
        // }


//Le formulaire de recherche

?>
<h2>Résultats</h2>

<?php
//On affiche les resultats
while($requeteELT=$requete->fetch(PDO::FETCH_ASSOC)){
?>
          <tr>
                  <td><?php echo $requeteELT['id']; ?></td>
                  <td><?php echo $requeteELT['champs1']; ?></td>
                  <td><?php echo $requeteELT['champs2']; ?></td>
                  <td><?php echo $requeteELT['champs3']; ?></td>
                  <td><?php echo $requeteELT['champs4']; ?></td>
                  <td><?php echo $requeteELT['champs5']; ?></td>
                  <td>
<?php
  if($surligner){//Si il faut surligner les mots, on les surligne
    echo "<tr>";
          if($type==3){
                  echo preg_replace('#('.preg_quote($rec).')#i', '<strong>$1</strong>', $requeteELT['infos']);//On surligne l'expression exacte
          }
          else{
                  echo preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $requeteELT['infos']);//On surligne les mots clef de la recherche
          }
  }
  else{
          echo $requeteELT['infos'];//On ne surligne pas

  }
}

  // Recherche 3

    while($motclefs = $requete->fetch(PDO::FETCH_ASSOC)){
    echo "<tr>";
    echo '<form method="POST" action="travail.php">';
    $motclefs[0] == 1;
    //Si la variable $_POST['nom'] existe et n'est pas vide, alors $motclefs = $_POST['unChamps']  sinon elle vaut NULL
    foreach ($motclefs as $clef => $valeur) {
      if (substr($clef, 0, 3)=='id_'){
        echo "<td>".$valeur.'</td>
        <input type="hidden" NAME="id" value="'.$valeur.'"/>';
      }
      $motclefs = !empty($_POST['unChamps']) ? $_POST['unChamps'] : NULL;
      if ($requete['mot'] == $motclefs){
      echo '<input style="font-weight: bold;"';
      }
    }
  var_dump($motclefs); // ça me met boolean falses

// Recherche 4 essaie par fonction
  function MotEnGras($motclefs, $phrase) {
  $motclefs = strtolower(strtr( $motclefs, "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ", "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn" ));
  $requete = array("a","e","i","o","u","y","c","n" );
  $remplacement = array("[a|à|á|â|ã|ä|å]{1}","[e|è|é|ê|ë]{1}","[i|ì|í|î|ï]{1}","[o|ò  |ó|ô|õ|ö|ø]{1}","[u|ù|ú|û|ü]{1}","[y|y]{1}","[c|ç]{1}","[n|ñ]{1}" );
  $motclefs = str_replace($requete, $remplacement, $motclefs);
  return eregi_replace("($motclefs)", "<strong><b></strong>\\1<strong></b></strong>", $phrase);
}


   // Recherche 5 essaie par fonction
  function MotEnGras($motclefs, $phrase) {
  $motclefs = strtolower(strtr( $motclefs, "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ", "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn" ));
  $requete = array("a","e","i","o","u","y","c","n" );
  $remplacement = array("[a|à|á|â|ã|ä|å]{1}","[e|è|é|ê|ë]{1}","[i|ì|í|î|ï]{1}","[o|ò  |ó|ô|õ|ö|ø]{1}","[u|ù|ú|û|ü]{1}","[y|y]{1}","[c|ç]{1}","[n|ñ]{1}" );
  $motclefs = str_replace($requete, $remplacement, $motclefs);
  return eregi_replace("($motclefs)", "<strong><b></strong>\\1<strong></b></strong>", $phrase);
}
    while($motclefs = $requete->fetch(PDO::FETCH_ASSOC)){
    echo "<tr>";
    echo '<form method="POST" action="travail.php">';
    //Si la variable $_POST['nom'] existe et n'est pas vide, alors $motclefs = $_POST['nom']  sinon elle vaut NULL
    foreach ($motclefs as $clef => $valeur){
      $motclefs++;      if (substr($clef, 0, 3)=='id_'){
        echo "<td>".$valeur.'</td>
        <input type="hidden" NAME="id" value="'.$valeur.'"/>';
      }
      $motclefs = !empty($_POST['nom']) ? $_POST['nom'] : NULL;
      if ($requete['mot'] == $motclefs){
      echo '<input style="font-weight: bold;"';
      }
    }
  }

var_dump($motclefs); // ça me met boolean falses

 

Hors ligne

#3 17-06-2017 15:13:42

GPN
Membre
Inscription : 17-06-2017
Messages : 5

Re : Mettre en gras certains mots dans le PHP

Bonjour Celyne

Si j'ai bien compris ton problème tu cherches à mettre en gras certains mots d'une chaine.
J'ai déjà fait cela et le script était du genre :


<?php
$tabcle = array('motcle1', 'motcle2') ; // liste des mots clés à passer en gras
$chaine_originale = $chaine_rectifiee = 'voici le texte contenant tous les mots dont le motcle1 et les autres' ;
// boucler sur chaque mot clé de la liste
for ( $i = 0; $i < count($tabcle); $i++) { $chaine_rectifiee = str_replace( $tabcle[$i], '<B>' . $tabcle[$i] . '</B>' , $chaine_rectifiee); }
echo $chaine_originale . '<BR />' ;// affichage des 2 chaines originale et rectifiee
echo $chaine_rectifiee . '<BR />' ;
?>
 

Voici ma proposition en espérant que cela puisse t'aider.
Bon courage
GPN

Dernière modification par GPN (17-06-2017 15:16:48)

Hors ligne

Pied de page des forums