Recherche avec like et collate UTF8 php

Résolu/Fermé
djanahana Messages postés 82 Date d'inscription mercredi 20 mai 2009 Statut Membre Dernière intervention 6 avril 2015 - 5 juin 2012 à 16:14
 Utilisateur anonyme - 18 juin 2012 à 10:50
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

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
A voir également:

13 réponses

mpmp93 Messages postés 6648 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
5 juin 2012 à 18:37
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



3
Utilisateur anonyme
14 juin 2012 à 17:20
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.
3
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 ?
3
Utilisateur anonyme
16 juin 2012 à 10:29
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)
3
djanahana Messages postés 82 Date d'inscription mercredi 20 mai 2009 Statut Membre Dernière intervention 6 avril 2015 13
17 juin 2012 à 10:49
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mpmp93 Messages postés 6648 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
5 juin 2012 à 16:18
Bonjour,

Essayer ceci:

$search = $_POST['titre'];
$sql = "select * from table COLLATE utf8_bin like '%$search%'";

A+

2
djanahana Messages postés 82 Date d'inscription mercredi 20 mai 2009 Statut Membre Dernière intervention 6 avril 2015 13
5 juin 2012 à 18:08
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
2
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?
2
Utilisateur anonyme
15 juin 2012 à 10:38
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...
2
Utilisateur anonyme
17 juin 2012 à 19:20
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 lignes
 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); 

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.
2
djanahana Messages postés 82 Date d'inscription mercredi 20 mai 2009 Statut Membre Dernière intervention 6 avril 2015 13
14 juin 2012 à 13:01
mais c'est de la langue arab ,vraiment j'ai pas compris!!!
1
erreur de frappe est dans le message dans le forum et non pas dans mon programme ou mon PC
merci
1

<?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.
?>
1
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 suivant


CREATE 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
0
Utilisateur anonyme
18 juin 2012 à 07:57
je pense on problème est que j'ai oublié
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Je ne crois pas, car la ligne
header('Content-Type: text/html; charset=UTF-8');
que tu as dans ton script joue normalement le même rôle
0
djanahana Messages postés 82 Date d'inscription mercredi 20 mai 2009 Statut Membre Dernière intervention 6 avril 2015 13
18 juin 2012 à 10:11
j'avais un message d'erreur dans cette fonction ,c'est pour cela j'ai la supprimer;merci monsieur le pere
0
Utilisateur anonyme
18 juin 2012 à 10:50
Quand on a un message d'erreur, il faut comprendre la cause de l'erreur et la corriger. Tu es passé à côté d'une occasion d'apprendre quelque chose et de faire des progrès en PHP.
0