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

Langage PHP Discussion :

str_replace et recherche


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 22
    Par défaut str_replace et recherche
    Bonjour à tous,

    je suis entrain de coder un petit moteur de recherche pour mon site et je me heurte à quelques difficultés notamment avec la fonction str_replace.

    Exemple :

    si je tape 'bonjour<' ou 'bon<jour', il ne comprend pas.

    Pourtant, j'ai bien spécifié:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $mot = str_replace("<", "", $mot);
    De même, si je tape un mot avec apostrophe, par exemple 'n'importe quoi', il me renvoi un message d'erreur:

    Une erreur est survenue avec la base de données:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'importe%' OR pays LIKE '%n'importe%' OR ville LIKE '%n'importe%'OR titre LIKE '%' at line 1

    Sur ce second point, c'est surtout niveau sécurité que cela m'inquiète.
    Pourtant, idem j'ai bien spécifié dans mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $mot = str_replace("\'", "'", $mot);
    J'ai essayé la fonction addslashes mais toujours la même erreur...


    Merci d'avance pour votre aide.

    Voici mon fichier traitement.php:

    Code : 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
    <?php
     
    /*TRAITEMENT DES DONNEES RECUPEREES*/ 
     
    /*Nettoyage de la requete de l'utilisateur*/
    $mot = strtolower(trim($mot));
    $mot = str_replace(array(",", "-", ".", ":", ";", "'"), " ", $mot);
    $mot = str_replace(" ", " ", $mot);
     
    $mot = str_replace("<", "", $mot);
    $mot = str_replace(">", "", $mot);
    $mot = str_replace("\'", "'", $mot);
    $mot = str_replace("_", " ", $mot);
    $mot = str_replace("&", "et", $mot);
    $mot = str_replace("+", " ", $mot);
    $mot = str_replace("?", "", $mot);
     
    $mot = str_replace("é", "e", $mot);
    $mot = str_replace("è", "e", $mot);
    $mot = str_replace("ë", "e", $mot);
    $mot = str_replace("ê", "e", $mot);
    $mot = str_replace("à", "a", $mot);
    //etc, etc...je les met pas toutes, ça serait trop long
     
    /*Extraction des mots clefs*/
    $mots = explode( " ", $_POST['mot'] );
     
    /*Requête*/
     
    $query = "";
     
    {
       foreach( $mots as $Mot )
       {
          //Ajout de la whereclause
          $query .= ( (empty($query)) ? '' : ' AND' )." (theme LIKE '%{$Mot}%' OR pays LIKE '%{$Mot}%' OR ville LIKE '%{$Mot}%'OR titre LIKE '%{$Mot}%' OR contenu LIKE '%{$Mot}%'OR motscles LIKE '%{$Mot}%' )";
       }
       $query = "SELECT * FROM culture WHERE $query ORDER BY date ASC";
       $reponse = mysql_query( $query ) or exit( "Une erreur est survenue avec la base de données:<br />\n".mysql_error() );
    }
     
     
    ?>

  2. #2
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Bonjour,

    si je tape 'bonjour<' ou 'bon<jour', il ne comprend pas.
    C'est à dire ? (une erreur dans la requête, pas de remplacement de <)

    Sinon pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $mot = str_replace(" ", " ", $mot);
    Et puis aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $mot = str_replace(array(",", "-", ".", ":", ";", "'"), " ", $mot);
    alors que après tu t'osccupe du caractère spécial ' ?

    Tu devrais faire un echo final de tes remplacements pour voir ou ça cloche et ensuite essayer mot avec juste son str_replace associé (car tu as peut être un problème dans le déroulement de tes replace

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 22
    Par défaut
    Tout d'abord merci de t'interrèsser à mon problème.

    Citation Envoyé par Fench Voir le message
    Bonjour,


    C'est à dire ? (une erreur dans la requête, pas de remplacement de <)
    C'est celà il ne remplace pas le symbole.

    Citation Envoyé par Fench Voir le message
    Sinon pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $mot = str_replace(" ", " ", $mot);
    J'avoue celui-ci est inutile.

    Citation Envoyé par Fench Voir le message
    Et puis aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $mot = str_replace(array(",", "-", ".", ":", ";", "'"), " ", $mot);
    alors que après tu t'osccupe du caractère spécial ' ?

    Tu devrais faire un echo final de tes remplacements pour voir ou ça cloche et ensuite essayer mot avec juste son str_replace associé (car tu as peut être un problème dans le déroulement de tes replace
    Oui, je vais essayer de les tester un par un pour voir ou ça cloche. Mais qu'entend tu par un echo des remplacements? (dsl je viens de passer la nuit dessus, mon cerveau tourne au ralenti )

  4. #4
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    ça c pour envoyer avant la requête...
    histoire de voir si $mot ou $query sont corrects avant de faire le mysql_querry

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 22
    Par défaut
    okok je vais m'y atteler.

    Mais il y a vraiment un truc qui cloche car je viens de tester quelque chose :

    j'ai supprimé cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $mot = str_replace("ô", "o", $mot);
    Je fais une recherche avec 'bônjour' et là par contre il comprend bien 'bonjour', alors que le remplacement n'est pas spécifié dans mon code...

  6. #6
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Bizzarrrrre en effet:

    Essayes le contraire, c à dire tu mets tout en commentaire sauf le replace du ô, puis tu testes, si ça marche (ce qui serait normal), c que de ta liste de replaces, ya des problèmes !!!

    Attention qd je dis tout, c avec le trim et le strtolower ...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 22
    Par défaut
    Je viens d'aller encore plus loin :

    j'ai carrément essayé en supprimant toutes les fonctions de traitement du mot recherché et gardé que la requête :

    Code : 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
    <?php
     
    /*Extraction des mots clefs*/
    $mots = explode( " ", $_POST['mot'] );
     
    /*Requête*/
     
    $query = "";
     
    {
       foreach( $mots as $Mot )
       {
          /*Ajout de la whereclause*/
          $query .= ( (empty($query)) ? '' : ' AND' )." (theme LIKE '%{$Mot}%' OR pays LIKE '%{$Mot}%' OR ville LIKE '%{$Mot}%'OR titre LIKE '%{$Mot}%' OR contenu LIKE '%{$Mot}%'OR motscles LIKE '%{$Mot}%' )";
       }
       $query = "SELECT * FROM culture WHERE $query ORDER BY date ASC";
       $reponse = mysql_query( $query ) or exit( "Une erreur est survenue avec la base de données:<br />\n".mysql_error() );
    }
     
    ?>
    Eh bien je te le donne dans le mille : 'bônjour' pour lui c'est bien 'bonjour'

    Je me demande une chose : lors de la création de ma table, mysql me met en index fulltext certains champs automatiquement par défaut. Es-ce que ça peut venir de là ?

    J'avoue que je patauge là...

  8. #8
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Et avec phpMyAdmin tu as quoi dans les champs ?

    Sinon, l'echo de $query est Ok avec bonjour écrit comme 'bônjour' avant de faire le mysql_query ?

    En fait, je comprends pas trop
    Eh bien je te le donne dans le mille : 'bônjour' pour lui c'est bien 'bonjour'
    Ou ça dans la base dans la requête ?

    Sinon moi aussi je suis un peu long à la détente mais c à cause des Jo

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 22
    Par défaut
    re,

    je viens de tester comme tu me l'a suggéré la partie traitement du mot clé avec un echo des remplacements.

    Verdict : aucun problème de ce coté là...il traite correctement tous les remplacements. Pour 'bon<jour' ou 'bonjour<' ça m'affiche bien 'bonjour'.

    Le problème vient donc d'ailleurs. Il y a un moment dans la partie requète ou ça foire.

    L'autre test que j'ai fais c'est de supprimer cette fois toute la partie de traitement du mot clé et de ne garder donc que la requète.

    Donc logiquement si je tape 'bônjour', le moteur ne devrait pas comprendre puisque le remplacement de la voyelle 'ô' par 'o' n'est plus spécifié.
    Il me renvois tout de même le résultat comme si j'avais tapé 'bonjour'.
    Un peu comme si j'effectuais une requête en FULLTEXT avec MATCH ()AGAINST ou il me renverrai des résultats ressemblant au mot recherché.

    Donc j'ai bien, l'impression qu'il ne prend pas en compte la partie de traitement des voyelles et caractères spéciaux dans mon code et donc qu'elle soit présente ou pas il me renvoit les même résultats. Comme si il manquait un lien entre ces 2 parties. Je sèche là...

    Sinon pour phpmyadmin, j'ai certains champs qui sont passés en clé primaire et index fulltext alors qu'à la création de la table je ne l'ai pas spécifié. Mais bon, c'est peut-être normal mais je ne suis pas une bête de mysql donc...

    Je crois bien que je vais me caler devant les J.O aussi pour me détendre le cerveaux


    EDIT : c'est bon j'ai trouvé...
    J'ai mis le doigt dessus plus haut dans ce message justement. Il manquait une relation entre le traitement du mot récupéré et celui utilisé dans la requète justement. Le explode se faisait directement sur le mot récupéré et non pas sur celui qui était traité ...J'ai donc quelque peu modifié mon code et voilà il prend bien en compte le mot après traitement...

    Je vais maintenant pouvoir me consacrer exclusivement...aux JO

  10. #10
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Ah ouiiiii excellent le truc

    Le coup du c fatal et moi aussi à cause des Jo je crois, j'ai pas les yeux en face des trous

    Ya des fois, on passe du temps pour rien, c ça l'informatique, la possibilité de te faire tourner en rond pour une erreur de concentration !!! c un sport de grosse concentration

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

Discussions similaires

  1. recherche des algorythmes pour images 2d
    Par exxos dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 24/05/2002, 14h46
  2. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 23h18
  3. Réponses: 8
    Dernier message: 17/05/2002, 10h08
  4. [PRO*C] Recherche information
    Par Anonymous dans le forum Interfaces de programmation
    Réponses: 2
    Dernier message: 04/04/2002, 18h53
  5. Recherche de documentation complète en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2002, 13h09

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