Recherche avec like et collate UTF8 php
Résolu
djanahana
Messages postés
95
Statut
Membre
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
Svp, ça fait des jours que j'ai essayer de résoudre le problème que j'ai avec une recherche
d'une enregistrement de ma BD mySQL mais sans solution
la requete est
Lors de l'exécution de ma requête dans phpmyadmin elle s'exécute bien mais si je la mettre dans un script php elle me retourne 0 ligne .
j'ai tout fait SET NAMES UTF8,SET CHARACTER,<head> <meta ..charset utf8 ,........>
franchement je ne sais pas ou se trouve le problème
ma base contient de langue arabe et français,la recherche en français marche très bien .
merci d'avoir lire mon message
Svp, ça fait des jours que j'ai essayer de résoudre le problème que j'ai avec une recherche
d'une enregistrement de ma BD mySQL mais sans solution
la requete est
select * from table COLLATE utf8_bin like '%$_POST['titre']%'
Lors de l'exécution de ma requête dans phpmyadmin elle s'exécute bien mais si je la mettre dans un script php elle me retourne 0 ligne .
j'ai tout fait SET NAMES UTF8,SET CHARACTER,<head> <meta ..charset utf8 ,........>
franchement je ne sais pas ou se trouve le problème
ma base contient de langue arabe et français,la recherche en français marche très bien .
merci d'avoir lire mon message
13 réponses
-
Je vous conseille de faie toute votre chaîne logicielle en UTF8:
http://html5.immo-scope.com/index.php?page=general/applisFullUtf8
vous n'aurez plus besoin de COLLATE
-
Bonjour
Ta requête n'est pas correcte...
c'est where champ like qq chose. Si ta variable est $valeur :
$sql = "select * from table COLLATE utf8_bin WHERE unchamp like '%$valeur %'"
Et comme le disait mpmp93, en faisant tout en utf8, on n'a plus besoin de COLLATE. -
c'est juste une erreur de frappe
C'est souvent à cause des erreurs de frappe que ça ne marche pas.
L'espace entre valeur et % dans '%valeur %', c'est une faute de frappe aussi ? -
Je viens d'essayer chez moi. Deux remarques :
1 - Le COLLATE sur la table est une erreur, il faut le faire sur une colonne :$sql = "select * from these WHERE titre COLLATE utf8_bin like '%$titre%'";
ou , mieux, pas de COLLATE du tout si ta table est déjà en utf-8$sql = "select * from these WHERE titre like '%$titre%'";
2 - D'autre part, j'ai ajouté après la sélection de la base :mysql_query('SET NAMES UTF8');
Avec ces deux modifications, ton script marche bien chez moi, même sur un texte en arabe. Il trouve bien des titres complets ou incomplets (enfin, moi j'ai mis des lettres arabes au hasard)-
Bonjour monsieur le pere ,
J'avais essayé ce vous me disez mais toujours le meme probeleme ,pouvez vous me donné le script de creation de votre Base de Données ,
Le voila ce qui j'ai fait
<?php header('Content-Type: text/html; charset=UTF-8'); //requets pour l'affichage de nombre des these par facultées // connection à la DB //mysql_free_result($result); $cnx = mysql_connect( "localhost", "root", "" ) ; //sélection de la base de données: $db = mysql_select_db( "these3" ) ; mysql_query("SET NAMES 'utf8';",$cnx); mysql_query("SET CHARACTER SET 'utf8';",$cnx); mysql_query("SET COLLATE SET 'utf8_bin';",$cnx); mysql_query ("set character_set_client='utf8';",$cnx); mysql_query ("set character_set_results='utf8';",$cnx); mysql_query ("set collation_connection='utf8_bin';",$cnx); //titre: $titre = utf8_decode($_GET["titre"]) ; //auteur: $auteur = utf8_decode($_GET["auteur"]) ; //$dep=$_GET["department"]; $sql = "SELECT *FROM these WHERE (auteur COLLATE utf8_bin like '%$auteur%') AND (titre COLLATE utf8_bin like '%$titre%' ) ORDER BY auteur " ; $result = mysql_query($sql,$cnx) or die ("Erreur : ".mysql_error() ); $total = mysql_num_rows($result); // si on a récupéré un résultat on l'affiche. ?>
merci encore une fois
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Bonjour,
Essayer ceci:
$search = $_POST['titre'];
$sql = "select * from table COLLATE utf8_bin like '%$search%'";
A+
-
merci pour la réponse ,j'a fait même
$sql = "select * from table COLLATE utf8_bin like '%valeur %'"; ou valeur c'est une valeur que j'ai dans ma base mais toujours le même problème .
merci beaucoup -
salut,
oh,c'est juste une erreur de frappe ,mon problème est que la requête s'exécute bien dans la php my admin mais lorsque je la mettre dans un script php j'ai rien comme résultats? -
Nous basons nos analyses sur les éléments que tu fournis dans le forum. S'il y a une erreur dans le code que tu fournis sur le forum, nous n'avons aucune raison de deviner qu'elle n'est pas présente aussi dans ton PC.
Si tu as toujours ton problème, peux-tu montrer le code ? Un select, ce n'est pas la mer à boire... -
J'ai fait mes essais avec le script suivant :
<?php $host = 'localhost'; $user = 'root'; $pass = '; $db = 'essai'; // connection à la DB $link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() ); mysql_select_db($db) or die ('Erreur :'.mysql_error()); mysql_query('SET NAMES UTF8'); //titre: $titre = $_GET["titre"] ; //auteur: // $auteur = $_GET["auteur"] ; // $select_dep=$_GET["select_dep"]; $sql = "select * from these WHERE titre like '%$titre%'"; $result = mysql_query($sql,$link) or die ('Erreur : '.mysql_error() ); $total = mysql_num_rows($result); echo $total; // si on a récupéré un résultat on l'affiche. ?>
et ma table, très simpte :
CREATE TABLE 'these' ( 'auteur' text COLLATE utf8_bin NOT NULL, 'titre' text COLLATE utf8_bin NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Par rapport à toi :
je n'ai pas les lignesmysql_query("SET CHARACTER SET 'utf8';",$cnx); mysql_query("SET COLLATE SET 'utf8_bin';",$cnx); mysql_query ("set character_set_client='utf8';",$cnx); mysql_query ("set character_set_results='utf8';",$cnx); mysql_query ("set collation_connection='utf8_bin';",$cnx);
Je n'ai pas relu la doc mysql pour voir le rôle exact de chacune, je me suis toujours contenté de 'SET NAMES UTF8', j'ai l'impression que les autres lignes font double emploi avec.
Mais ton gros problème, c'est ce $titre = utf8_decode($_GET["titre"]) ;
Ça veut dire quoi décoder l'utf8 ? Ça ré-encode ta chaîne en ISO8859-1. Si c'est ça le but, ce n'est pas la peine de travailler en utf8. Et comme tu t'es fatigué à expliquer à ta base de données que tu travaillais en utf8, et que finalement tu lui envoies de l'ISO8859-1, elle ne travaille pas correctement.
Mais le plus grave de tout, c'est que l'ISO8859-1 ne permet pas de coder les caractères arabes, il ne permet de coder que les caractères de l'Europe de l'ouest. Donc quand tu fais utf8_decode d'une chaine en arabe, tu n'as plus d'arabe après. Je ne sais pas ce que tu as d'ailleurs, mais certainement de l'arabe.
Retire tes fonction utf8_decode. -
mais c'est de la langue arab ,vraiment j'ai pas compris!!!
-
erreur de frappe est dans le message dans le forum et non pas dans mon programme ou mon PC
merci -
<?php $host = 'localhost'; $user = 'root'; $pass = ''; $db = 'these2'; // connection à la DB $link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() ); mysql_select_db($db) or die ('Erreur :'.mysql_error()); //titre: $titre = $_GET["titre"] ; //auteur: $auteur = $_GET["auteur"] ; $select_dep=$_GET["select_dep"]; $sql = "select * from these COLLATE utf8_bin WHERE titre like '%$titre%'"; $result = mysql_query($sql,$link) or die ('Erreur : '.mysql_error() ); $total = mysql_num_rows($result); // si on a récupéré un résultat on l'affiche. ?> -
oh monsieur le père ,enfin ça marche bien
je te remercie beaucoup ,j'étais bloquée avec ce problème ça fait plus que 20 jours ,et tellement j'ai entré dans les détails des détails que je suis perdue
le script de ma BASE st le suivantCREATE TABLE 'these' ( 'id' int(10) NOT NULL auto_increment, 'titre' varchar(20) collate utf8_bin NOT NULL default '', 'auteur' varchar(20) collate utf8_bin NOT NULL default '', PRIMARY KEY ('id') ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=3 ;
je pense on problème est que j'ai oublié<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
dans la page HTMl de recherche
merci pour d'avoir m'aider pour trouver le solution et pour votre patience
a la fin c'est résolu
merci encore une fois