Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/11/2011, 15h59   #1
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Par défaut echec d'une comparaison

Bonjour,

je compare 2 variables (if (strtolower($patr[1])==$fstname))) qui, quand je fais un echo semblent identiques, mais que quand j'affiche la longueur des strings, la première fait un caractère de plus : d'où cela peut-il venir et comment le supprimer (car elles devraient être identiques) ?
__________________
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 16h00   #2
Modérateur
 
Avatar de Golgotha
 
Homme cédric
Développeur informatique
Inscription : août 2007
Messages : 732
Détails du profil
Informations personnelles :
Nom : Homme cédric
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2007
Messages : 732
Points : 1 562
Points : 1 562
Envoyer un message via Skype™ à Golgotha
Citation:
Envoyé par laurentSc Voir le message
Bonjour,

je compare 2 variables (if (strtolower($patr[1])==$fstname))) qui, quand je fais un echo semblent identiques, mais que quand j'affiche la longueur des strings, la première fait un caractère de plus : d'où cela peut-il venir et comment le supprimer (car elles devraient être identiques) ?
Au hasard, un espace ?

Essaye trim()
__________________
modérateur webmasters - développements web & php
faq jQuery - règles du forum - faqs web
mon espace perso
Venez participez au deuxième defi Web !
Golgotha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 16h40   #3
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
J'ai essayé trim (if (trim(strtolower($patr[1]))==trim($fstname))), mais la différence persiste
__________________
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 16h47   #4
Modérateur
 
Avatar de Golgotha
 
Homme cédric
Développeur informatique
Inscription : août 2007
Messages : 732
Détails du profil
Informations personnelles :
Nom : Homme cédric
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2007
Messages : 732
Points : 1 562
Points : 1 562
Envoyer un message via Skype™ à Golgotha
Je ne suis pas expert en php mais, il devrais y avoir des fonctions de comparaison de chaine.

Le "==" par expérience n'est jamais sûr...

Essaye avec similar_text() ou strcmp()

http://php.net/manual/fr/function.similar-text.php
http://php.net/manual/fr/function.strcmp.php
__________________
modérateur webmasters - développements web & php
faq jQuery - règles du forum - faqs web
mon espace perso
Venez participez au deuxième defi Web !
Golgotha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 17h08   #5
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
J'oubliais, il y a du mieux avec le trim car la longueur des strings est devenue identique, mais la comparaison continue d'échouer :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
// deb test             
 
	echo "patr1=".strtolower($patr[1])."<br>";
	echo "strlen(patr1)=".strlen(trim(strtolower($patr[1])))."<br>";
	echo "firstname=".$fstname."<br>";
	echo "strlen(firstname)=".strlen(trim($fstname))."<br>";
	echo "test2:".trim((strtolower($patr[1]))==trim($fstname))."<br>";
	//fin test
 
	if (strcmp(trim(strtolower($patr[1])),trim($fstname)))
...
__________________
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 17h17   #6
Modérateur
 
Avatar de Golgotha
 
Homme cédric
Développeur informatique
Inscription : août 2007
Messages : 732
Détails du profil
Informations personnelles :
Nom : Homme cédric
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2007
Messages : 732
Points : 1 562
Points : 1 562
Envoyer un message via Skype™ à Golgotha
Citation:
Envoyé par laurentSc Voir le message
J'oubliais, il y a du mieux avec le trim car la longueur des strings est devenue identique, mais la comparaison continue d'échouer :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
// deb test             
 
    echo "patr1=".strtolower($patr[1])."<br>";
    echo "strlen(patr1)=".strlen(trim(strtolower($patr[1])))."<br>";
    echo "firstname=".$fstname."<br>";
    echo "strlen(firstname)=".strlen(trim($fstname))."<br>";
    echo "test2:".trim((strtolower($patr[1]))==trim($fstname))."<br>";
    //fin test
 
    if (strcmp(trim(strtolower($patr[1])),trim($fstname)))
...
Il reste la casse

faire un strtolower des deux coté.
__________________
modérateur webmasters - développements web & php
faq jQuery - règles du forum - faqs web
mon espace perso
Venez participez au deuxième defi Web !
Golgotha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 17h27   #7
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
mais ça continue d'échouer : if (strcmp(trim(strtolower($patr[1])),trim(strtolower($fstname))))
__________________
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 17h33   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 161
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 161
Points : 8 530
Points : 8 530
les chaines viennent d’où ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 17h39   #9
Modérateur
 
Avatar de Golgotha
 
Homme cédric
Développeur informatique
Inscription : août 2007
Messages : 732
Détails du profil
Informations personnelles :
Nom : Homme cédric
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2007
Messages : 732
Points : 1 562
Points : 1 562
Envoyer un message via Skype™ à Golgotha
Citation:
Envoyé par laurentSc Voir le message
mais ça continue d'échouer : &nbsp;&nbsp;&nbsp;&nbsp;if (strcmp(trim(strtolower($patr[1])),trim(strtolower($fstname))))
Si les deux chaines on la même orthographe, je sèche là
__________________
modérateur webmasters - développements web & php
faq jQuery - règles du forum - faqs web
mon espace perso
Venez participez au deuxième defi Web !
Golgotha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 17h41   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 161
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 161
Points : 8 530
Points : 8 530
Citation:
Envoyé par Golgotha Voir le message
Si les deux chaines on la même orthographe, je sèche là
normale c'est pas le même encodage, visuellement c'est la même chose, mais pas au niveau des caractères
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 17h43   #11
Modérateur
 
Avatar de Golgotha
 
Homme cédric
Développeur informatique
Inscription : août 2007
Messages : 732
Détails du profil
Informations personnelles :
Nom : Homme cédric
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2007
Messages : 732
Points : 1 562
Points : 1 562
Envoyer un message via Skype™ à Golgotha
Citation:
Envoyé par stealth35 Voir le message
normale c'est pas le même encodage, visuellement c'est la même chose, mais pas au niveau des caractères
ça arrive qu'en php ça

__________________
modérateur webmasters - développements web & php
faq jQuery - règles du forum - faqs web
mon espace perso
Venez participez au deuxième defi Web !
Golgotha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 17h48   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 161
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 161
Points : 8 530
Points : 8 530
Citation:
Envoyé par Golgotha Voir le message
ça arrive qu'en php ça

non aucun rapport c'est coté client le problème, PHP lui voit bien que la chaine est différente

Code :
1
2
3
4
5
6
7
8
9
10
var_dump(
    mb_convert_encoding('hello', 'UTF-8'),
    mb_convert_encoding('hello', 'UTF-16'),
    mb_convert_encoding('hello', 'UTF-32')
);
/*
string(5) "hello"
string(10) "hello"
string(20) "hello"
*/
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/11/2011, 18h10   #13
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Citation:
les chaines viennent d’où ?
La 1e (trim(strtolower($patr[1]))) est tirée d'un fichier xml :
Code :
1
2
3
4
5
  $dom->load("http://...);
  foreach($listeText as $text) {
    $patronyme=strtolower($text->firstChild->nodeValue);
    $patr=explode(",",$patronyme);
...
et la 2e (trim(strtolower($fstname))) est tirée d'un fichier xls :
Citation:
require_once 'excel_reader2.php';
$data = new Spreadsheet_Excel_Reader($_SESSION(['nom_fichier']);
$patr="2";
$lastname=$data->val($patr,"3");
while (isset($lastname)&&($lastname!="")) {
$lastname=$data->val($patr,"3");
$fstname=$data->val($patr,"4");
$patr++;
...
Il s'agit d'un outil PHP puissant qui permet de lire des fichiers xls, mais j'ignore complètement comment il marche.
__________________
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 18h22   #14
Modérateur
 
Inscription : septembre 2010
Messages : 7 161
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 161
Points : 8 530
Points : 8 530
fait un mb_convert_encoding comme dans mon exemple, pour trouver l'encodage c'est pareil, si la chaine est 2 foix plus longue c'est que c'est de l'UTF-16, et 3 fois de l'UTF-32
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 21h12   #15
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Quelle que soit la conversion (voici un exemple :
Code :
1
2
if (strcmp(mb_convert_encoding(trim(strtolower($patr[1])),'UTF-32'),mb_convert_encoding(trim(strtolower($fstname)),'UTF-32'))
)
) (j'ai fait 3 cas), le résultat est le même : certaines sont jugées identiques et d'autres non, alors que la longueur avec le trim est la même (sans le trim, il y avait un caractère d'écart entre les 2 chaînes (qui font entre 4 et 13)) ; que suggères-tu ?
__________________
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 21h23   #16
Modérateur
 
Inscription : septembre 2010
Messages : 7 161
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 161
Points : 8 530
Points : 8 530
c'est pas ce qu'il faut faire, déjà enlève tout les fonction inutile pas,
comme je te l'ai dit plut haut il faut d’abord savoir quelle est l'encodage de la chaine ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 21h46   #17
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Génial , mais je n'y comprends rien : j'ai viré le trim et pour en avoir le coeur net la conversion aussi (if (strcmp(strtolower($patr[1]),strtolower($fstname))))...et ça marche !
__________________
Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 11h44   #18
Membre éclairé
 
Avatar de Sekigawa
 
Développeur Web
Inscription : mars 2008
Messages : 426
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2008
Messages : 426
Points : 316
Points : 316
Bonjour,

J'ai le même problème mais je ne comprend pas votre solution...

Je compares 2 chaines qui sont en faites sous la forme "X.X.X." ou X corresponds à un chiffre...

Quand je fais

Code :
1
2
 
var_dump(strcmp($Ref1, $Ref2));
J'obtiens --> int(-1) alors que je compare exactement la même chaîne (par exemple $Ref1 = 1.4.0. et $Ref2 = 1.4.0.)...

Même en faisant

Code :
1
2
 
var_dump($Ref1 == $Ref2);
J'obtiens --> bool(false)

Si c'est une histoire d'encodage comment contourner le problème ? Sachant que je récupères mes chaines d'une base de données mysql...

__________________
Cookie : Anciennement petit gâteau sucré, qu'on acceptait avec plaisir. Aujourd'hui : petit fichier informatique drôlement salé, qu'il faut refuser avec véhémence.
Sekigawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 12h40   #19
Modérateur
 
Avatar de Golgotha
 
Homme cédric
Développeur informatique
Inscription : août 2007
Messages : 732
Détails du profil
Informations personnelles :
Nom : Homme cédric
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2007
Messages : 732
Points : 1 562
Points : 1 562
Envoyer un message via Skype™ à Golgotha
Bonjour,

essaye peut être de vérifier l'encoding de tes chaines :

Code :
1
2
3
var a1 = mb_check_encoding($Ref1,'UTF-32')
var a2 = mb_check_encoding($Ref1,'UTF-16')
var a3 = mb_check_encoding($Ref1,'UTF-8')
Quelle est la valeur qui renvoie vrai ?

Code :
1
2
3
var b1 = mb_check_encoding($Ref2,'UTF-32')
var b2 = mb_check_encoding($Ref2,'UTF-16')
var b3 = mb_check_encoding($Ref2,'UTF-8')
Quelle est la valeur qui renvoie vrai ?

Si les encoding sont différent il faut d'abord faire un ré-encoding des chaînes avant la comparaison.
__________________
modérateur webmasters - développements web & php
faq jQuery - règles du forum - faqs web
mon espace perso
Venez participez au deuxième defi Web !
Golgotha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 13h21   #20
Membre éclairé
 
Avatar de Sekigawa
 
Développeur Web
Inscription : mars 2008
Messages : 426
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2008
Messages : 426
Points : 316
Points : 316
C'est bien un problème d'encodage :

Citation:
REF1 => bool(false) bool(true) bool(true)
REF2 => bool(false) bool(false) bool(true)
donc REF1 est encodé en UTF-16 et UTF-8
et REF2 est encodé en UTF-8

C'est possible ? Comment je dois faire pour ré-encoder ?
__________________
Cookie : Anciennement petit gâteau sucré, qu'on acceptait avec plaisir. Aujourd'hui : petit fichier informatique drôlement salé, qu'il faut refuser avec véhémence.
Sekigawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h11.


 
 
 
 
Partenaires

Hébergement Web