IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Autoriser la recherche dans une bdd avec des mots contenant une apostrophe


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 293
    Par défaut Autoriser la recherche dans une bdd avec des mots contenant une apostrophe
    Bonjour à tous.
    Je vous explique mon problème:
    J'ai une info telle que(bières spéciales: l'abbaye d'aulne)
    Quand j'introduit les mots : bières spéciales, bière, abbaye, aulne dans le formulaire de recherche, il me renvoie la ligne contenant cette info; mais lorsque j'introduit l'expression (abbaye d'aulne) contenant l'apostrophe, il me renvoie(pas d'enregistrement dans cette table) Problèmes d'apostrophe?

    Comment résoudre ce problème en tenant compte que j'utilise like %$h% dans la requête de selection dans ma bdd($h correspond au $_POST[donnees]?
    Comme d'habitude, je compte sur vos bienveillants conseils.
    Merci
    Claudine

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 817
    Billets dans le blog
    14
    Par défaut
    D'une manière générale, quand on veut utiliser une apostrophe dans une requête SQL, il faut la doubler :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT la_colonne
    FROM la_table
    WHERE une_autre_colonne = 'L''Abbaye de la bonne bière'

    Normalement, les modules PHP qui font l'interface avec le SGBD gèrent ça sans problème :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $recherche = "L'Abbaye de la bonne bière";
     
    $sql : "
    	SELECT la_colonne
    	FROM la_table
    	WHERE une_autre_colonne = :recherche
    ";
     
    $prep = $connexion->prepare($sql);
    $prep->bindValue(':recherche', $recherche, PDO::PARAM_STR);
    $prep->execute();
     
    $result = $prep->fetch(PDO::FETCH_ASSOC);
    => C'est PDO qui se débrouille avec l'apostrophe dans $recherche.

    Maintenant, sans votre code et sans savoir quel SGBD vous utilisez, ça va être difficile de vous aider efficacement.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 28
    Par défaut
    Salut,

    Je pense que tu auras besoin la commande :


  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 293
    Par défaut
    Bonjour CinePhil,
    Désolée d'avoir tarder à vous remercier et répondre à votre proposition, mais j'ai lu que vous faisiez appel à PDO et de ce fait , j'ai dû adapter mon search.php à la place de mysqli, ce qui m'a causé pas mal de problèmes. Bref ça fonctionne normalement, si ce n'est l'affichage (pas d'enregistrements dans la bd ) l'echo le renseigne même lorsqu'il affiche les lignes du tableau;
    Voudriez-vous voir la ligne de code(problèmes )?
    Je suis impatiente de voir comment adapter votre proposition avec l'apostrophe: a cet effet, j'ai ajouter une colonne dans ma bdd"Rech1" avec indication 'l'abbaye d'Aulne' dans celle-ci.

    Donc code sql devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Select infos 
    From coordonnees
    Where Recht1='l'abbaye d'Aulne' // les mots introduits dans le formulaire de recherche
    //Mais comment adapter une double requête dans mon search.php ci-dessous sans perturber la requête existante?
    monVoiciCode search.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    <?php
     
    try
     {
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
     
    $bdd = new PDO('mysql:host=localhost;dbname=jf96clients', 'root', '', $pdo_options);
     
    $h=$_POST['vosdonnees'];
    $v=$_POST['ville'];
     
    if ($_POST['ville']=="")
      {
    //on recupère tout le contenu de la table coordonnées
     
    $reponse=$bdd ->query("SELECT * FROM coordonnees WHERE   categorie LIKE '%$h%' or selection LIKE '%$h%'or infos LIKE'%$h%' or motscles LIKE '%$h%' or ville LIKE '%$h%' or Rech1 LIKE'%$h%' ");
     
    {
     //on affiche les donnees dans le tableau  
    //echo '<div id="infos"></div>';
    // si on a récupéré un résultat on l'affiche.
     
     
        echo '<table bgcolor="FFFFFF">'."\n";
            // première ligne on affiche les titres prénom et surnom dans 2 colonnes
        echo '<tr>';
       echo '<td bgcolor="#669999"><b><u>selection</u></b></td>';
       echo '<td bgcolor="#669999"><b><u>nom</u></b></td>';
       echo '<td bgcolor="#669999"><b><u>prenom</u></b></td>';
     
       echo '<td bgcolor="#669999"><b><u>MaPage</u></b></td>';
     
       echo '<td bgcolor="#669999"><b><u>Ouverture</u></b></td>';
     
       echo '<td bgcolor="#669999"><b><u>ville</u></b></td>';
     
       echo '<td bgcolor="#669999"><b><u>SiteWeb</u></b></td>';
     
       echo '<td bgcolor="#669999"><b><u>numtel</u></b></td>';
       echo '<td bgcolor="#669999"><b><u>adresse</u></b></td>';
       echo '<td bgcolor="#669999"><b><u>province</u></b></td>';
       echo '</tr>'."\n";
        // lecture et affichage des resultats 
     
       While($donnees=$reponse->fetch())
           {
           echo '<tr>';
    	//138
       echo '<td bgcolor="#CCCCCC">'.$donnees["selection"].'</td>';
       echo '<td bgcolor="#90EE90">'.$donnees["nom"].'</td>';
       echo '<td bgcolor="#90EE90">'.$donnees["prenom"].'</td>';
     
       echo'<td bgcolor="#CCCCCC"onClick="showPopup(event, \'' . addslashes($donnees['infos']) . '\')">'.$donnees["MaPage"].'</a></td>'; 
     
       echo'<td bgcolor="#CCCCCC"onClick="showPopup(event, \'' . addslashes($donnees['horaire']) . '\')">'.$donnees["Ouverture"].'</a></td>'; 
     
       echo '<td bgcolor="#CCCCCC">'.$donnees["ville"].'</td>';
     
       echo '<td bgcolor="#CCCCCC">'.$donnees["SiteWeb"].'</td>';
     
       echo '<td bgcolor="#9ACD32">'.$donnees["numtel"].'</td>';
       echo '<td bgcolor="#9ACD32">'.$donnees["adresse"].'</td>';
       echo '<td bgcolor="#9ACD32">'.$donnees["province"].'</td>';	
       echo '</tr>'."\n";
        }
        echo '</table>'."\n";
        // fin du tableau.
         } 
    	if($donnees==0 and $donnees['selection']==0 and $donnees['infos']==0) 
    {echo 'Pas d\'enregistrements dans cette table...';
    }
     
    //on affiche le résultat
     
    }
    else 
    // suite.........

    Sincères remerciements pour votre aide.
    Claudine

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 817
    Billets dans le blog
    14
    Par défaut
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    or ville LIKE '%$h%'
    Cela ne devrait-il pas être $v ici ?

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($_POST['ville']=="")
      {
    $reponse=$bdd ->query("SELECT * FROM coordonnees WHERE   categorie LIKE '%$h%' or selection LIKE '%$h%'or infos LIKE'%$h%' or motscles LIKE '%$h%' or ville LIKE '%$h%' or Rech1 LIKE'%$h%' ");
    Si la ville est vide on lance une requête dans laquelle on cherche une ville ?

    D'autre part, votre accolade ouvrante du if n'est pas fermée. Vous enchaînez avec une autre accolade ouvrante.

    Autres remarques :
    1) Il vaut mieux éviter la guerre des étoiles !

    2) Un code indenté et aéré est plus agréable à lire et à déboguer.

    3) Attention aux injections SQL en utilisant directement $_POST !
    Il vaut donc mieux préparer la requête avec des paramètres puis "binder" ces paramètres :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    <?php
     
    try
    {
    	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
     
    	$bdd = new PDO('mysql:host=localhost;dbname=jf96clients', 'root', '', $pdo_options);
     
    	$h = $_POST['vosdonnees'];
    	$v = $_POST['ville'];
     
    	if ($_POST['ville'] == "")
    	{
    		//on recupère tout le contenu de la table coordonnées
     		$sql = "
    			SELECT /* les colonnes nécessaires et pas étoile ! */
    			FROM coordonnees
    			WHERE categorie LIKE :recherche
    				OR selection LIKE :recherche
    				OR infos LIKE :recherche
    				OR motscles LIKE :recherche
    				OR ville LIKE :recherche
    				OR Rech LIKE :recherche
    		";
     
    		$prep = $bdd->prepare($sql);
    		$prep->bindValue(':recherche', '%'.$h.'%', PDO::PARAM_STR);
    		$prep->execute();
     
    		$reponse = $prep-fetchAll(PDO::FETCH_ASSOC);
    	} // Fin if ($_POST['ville'] == "")
    	// Ne faudrait-il pas un else ici si la ville a été renseignée ? Sinon à quoi sert le champ ville et la variable $v qui en découle ?
     
    } // Fin try
    catch (PDO_EXCEPTION $e)
    {
    	echo '<br/>ERREUR PDO dans '.$e->getFile(). ' L.'.$e->getLine().' : '.$e->getMessage();
    }
     
     
    //on affiche les donnees dans le tableau  
    //echo '<div id="infos"></div>';
    // si on a récupéré un résultat on l'affiche.
     
     
    echo '<table bgcolor="FFFFFF">'."\n";
            // première ligne on affiche les titres prénom et surnom dans 2 colonnes
    	echo '<tr>';
    		echo '<td bgcolor="#669999"><b><u>selection</u></b></td>';
    		echo '<td bgcolor="#669999"><b><u>nom</u></b></td>';
    		echo '<td bgcolor="#669999"><b><u>prenom</u></b></td>';
    		echo '<td bgcolor="#669999"><b><u>MaPage</u></b></td>';
    		echo '<td bgcolor="#669999"><b><u>Ouverture</u></b></td>';
    		echo '<td bgcolor="#669999"><b><u>ville</u></b></td>';
    		echo '<td bgcolor="#669999"><b><u>SiteWeb</u></b></td>';
    		echo '<td bgcolor="#669999"><b><u>numtel</u></b></td>';
    		echo '<td bgcolor="#669999"><b><u>adresse</u></b></td>';
    		echo '<td bgcolor="#669999"><b><u>province</u></b></td>';
    	echo '</tr>'."\n";
     
    // lecture et affichage des resultats 
     
    foreach($reponse as $key => $donnees)
    {
    	echo '<tr>';
    		echo '<td bgcolor="#CCCCCC">'.$donnees["selection"].'</td>';
    		echo '<td bgcolor="#90EE90">'.$donnees["nom"].'</td>';
    		echo '<td bgcolor="#90EE90">'.$donnees["prenom"].'</td>';
    		echo'<td bgcolor="#CCCCCC"onClick="showPopup(event, \'' . addslashes($donnees['infos']) . '\')">'.$donnees["MaPage"].'</a></td>'; 
    		echo'<td bgcolor="#CCCCCC"onClick="showPopup(event, \'' . addslashes($donnees['horaire']) . '\')">'.$donnees["Ouverture"].'</a></td>'; 
    		echo '<td bgcolor="#CCCCCC">'.$donnees["ville"].'</td>';
    		echo '<td bgcolor="#CCCCCC">'.$donnees["SiteWeb"].'</td>';
    		echo '<td bgcolor="#9ACD32">'.$donnees["numtel"].'</td>';
    		echo '<td bgcolor="#9ACD32">'.$donnees["adresse"].'</td>';
    		echo '<td bgcolor="#9ACD32">'.$donnees["province"].'</td>';	
    	echo '</tr>'."\n";
    } // Fin foreach($reponse as $key => $donnees)
     
    echo '</table>'."\n";
    // fin du tableau.
     
    /* Là ça devient un peu la pagaille ! 
         } // Ça ferme quoi ?
    */
     
    if($donnees==0 and $donnees['selection']==0 and $donnees['infos']==0) 
    {
    	echo 'Pas d\'enregistrements dans cette table...';
    }
     
    //on affiche le résultat
     
    /* else de quoi ?
    }
    else 
    // suite.........

    4) Isolez la partie HTML du PHP et isolez le CSS du HTML, c'est plus propre !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 293
    Par défaut
    merci CinePhil pour ces bons conseils qui assurent une lisibilité totale: c'est superbe;
    Pour ce qui est du nouveau code: que ce soit sur mon serveur local(easy PHP) ou sur mon hébergeur: c'est impossible voir message ci-dessous: j'ai même simplifier (pas de recherche par ville)

    [Sat Oct 21 06:03:41 2017] [error] [client 91.182.145.101] PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in /datas/vhosts/...../httpdocs/searchpasville.php:113\nStack trace:\n#0 /datas/vhosts/...../httpdocs/searchpasville.php(113): PDOStatement->execute()\n#1 {main}\n thrown in /datas/vhosts/...../httpdocs/searchpasville.php on line 113, referer: http://......./

    Je reste sceptique et débordée par tous ces messages d'erreurs: invalid catalog: c'est- à dire ?
    je crois que le plus simple, c'est de doubler dans les infos par exemple: abbaye d'Aulne(abbaye Aulne), ce qui permet d'avoir les infos de cette lignes si un consommateur tape dans le formulaire de recherche:abbaye d'aulne

    sincères remerciements
    Claudine

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 817
    Billets dans le blog
    14
    Par défaut
    [Sat Oct 21 06:03:41 2017] [error] [client 91.182.145.101] PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected'
    Ça veut dire qu'il ne trouve pas votre base de données MySQL.

    Vérifiez votre configuration ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$bdd = new PDO('mysql:host=localhost;dbname=jf96clients', 'root', '', $pdo_options);
    Quand ce sera fait et que vous n'avez plus le message d'erreur, autre bonne habitude à prendre : créez un user MySQL pour votre application qui a tous les droits sur votre BDD et aucune autre.
    Et donnez un mot de passe à l'utilisateur root !

    Votre BDD est une passoire, en l'état !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ouvrir une bdd avec des fichier .MYI . MYD et . FRM
    Par djams9 dans le forum Débuter
    Réponses: 2
    Dernier message: 16/07/2018, 18h48
  2. [XL-2010] Recherche dans un tableau avec des cases vide alternée
    Par tlt dans le forum Excel
    Réponses: 7
    Dernier message: 23/12/2016, 14h29
  3. Remplir une bdd avec des données libre de droit
    Par wyzer dans le forum Débuter
    Réponses: 0
    Dernier message: 29/06/2011, 16h31
  4. Erreur dans une requête avec des valeurs contenant \
    Par KIK83 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 11/12/2009, 16h06
  5. Réponses: 10
    Dernier message: 02/04/2007, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo