Recherche avec like et collate UTF8 php

Résolu
djanahana Messages postés 82 Date d'inscription   Statut Membre Dernière intervention   -  
 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

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   Statut Membre Dernière intervention   1 340
 
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
 
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
Utilisateur anonyme
 
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
 
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   Statut Membre Dernière intervention   13
 
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   Statut Membre Dernière intervention   1 340
 
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   Statut Membre Dernière intervention   13
 
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
djanahana
 
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
 
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
 
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   Statut Membre Dernière intervention   13
 
mais c'est de la langue arab ,vraiment j'ai pas compris!!!
1
djanahana
 
erreur de frappe est dans le message dans le forum et non pas dans mon programme ou mon PC
merci
1
djanahana
 

<?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
djanahana
 
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
 
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   Statut Membre Dernière intervention   13
 
j'avais un message d'erreur dans cette fonction ,c'est pour cela j'ai la supprimer;merci monsieur le pere
0
Utilisateur anonyme
 
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