Partage
  • Partager sur Facebook
  • Partager sur Twitter

[AJAX] comparaison de chaînes identique retourne faux

Soucis causé par l'inclusion d'un fichier dans le script PHP

Sujet résolu
Anonyme
    4 avril 2010 à 18:46:32

    Bonjour à tous.

    J'ai un soucis avec un script AJAX.

    J'essaie de tester la valeur de retour de la requête AJAX dans une condition, par simple comparaison avec une chaine de caractère et, bien que la valeur de retour et la chaine à comparer soient identiques, la condition n'est pas complétée. Voici la condition qui pose problème :

    if (res == 'already-exists')
    


    Quand je fais un "alert" de la variable "res", celle-ci contient bien la chaîne de caractère 'already-exists'. J'ai vérifié qu'il n'y avait pas de saut de ligne avant ni après la chaîne de caractère contenue dans "res".


    Je me suis rendu compte qu'en supprimant l'inclusion de certains fichiers dans mon script PHP, appelé par la requête AJAX, la condition était validée. Ces inclusions concernent des classes.

    Bien qu'ayant à priori localisé la source du problème, je n'arrive pas à comprendre précisément ce qui génère ce bug :o

    Je précise que j'inclus d'autre classes et que seules 2 d'entre-elles posent problème.
    Ce qui est également surprenant, c'est que le bug ne survient que dans les cas où les classes posant problème sont inclues mais pas utilisée.

    Merci d'avance pour toute personne m'aidant à résoudre ce problème :)
    • Partager sur Facebook
    • Partager sur Twitter
      4 avril 2010 à 19:06:58

      Avec si peu de code c'est difficile de dire ce qui ne va pas...

      Une page online serait un vrai plus.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        4 avril 2010 à 19:27:41

        Merci pour ta réponse :

        Voici le script AJAX :
        function addAttribut(type)
        {
        	if (type == 'genre' || type == 'mention' || type == 'categorie-places')
        	{
        		if ($('#libelle-'+ type).val() != '')
        		{
        			$.ajax(
        			{
        				type :		'POST',
        				url :		'./includes/ajoutSelect.inc.php',
        				async :		true,
        				data : 		'type='+ type + '&libelle=' + $('#libelle-'+ type).val(),
        				error :		function(msg) { alert( "Error !: " + msg ); },
        				success :	function(res)
        						{
        							if (res == 'already-exists')
        							{
        								// Traitement
        							}
        							else if(res == 'error')
        							{
        								// Traitement
        							}
        							else
        							{
        								// Traitement
        							}
        						}
        			});
        		}
        	}
        }
        


        Et le script PHP :
        <?php
        	
        	include ('../../includes/config.inc.php');
        	include ('../../libs/classes/DB.class.php');
        	include ('../../libs/classes/MonException.class.php');
        	include ('../../libs/classes/Secure.class.php');
        	include ('../../libs/classes/Artiste.class.php');
        	include ('../../libs/classes/AttributSpectacle.class.php');
        	include ('../../libs/classes/CategoriePlaces.class.php');
        	
        	const TABLE_CATEGORIES_PLACES = 'categories_places';
        	const TABLE_GENRES = 'genres';
        	const TABLE_MENTIONS = 'mentions';
        	
        	const TABLE_AUTEURS = 'auteurs';
        	const TABLE_COMEDIENS = 'comediens';
        	const TABLE_METTEURS_EN_SCENE = 'metteurs_en_scene';
        	
        	
        	if (isset($_POST['type']))
        	{
        		$pdo = DB::getInstance();
        		
        		switch ($_POST['type'])
        		{
        			case 'genre' :
        			case 'mention' :
        				$type =		Secure::get_post('type', 'string', 'POST');
        				$libelle =	Secure::get_post('libelle', 'string', 'POST');
        				
        				if ($type == 'genre')	$nomTable = TABLE_GENRES;
        				else 					$nomTable = TABLE_MENTIONS;
        				
        				// Récupération du nom du champ de la clé primaire
        				$req = $pdo->prepare("SHOW COLUMNS FROM ". BDD_PREFIXE.$nomTable);
        				$req->execute();
        				$champId = $req->fetchColumn();
        				
        				$req = $pdo->prepare("SELECT ". $champId ." FROM ". BDD_PREFIXE.$nomTable ." WHERE libelle = ?");
        				$req->execute(array($libelle));
        				
        				if($req->rowCount() !== 1)
        				{
        					$req = $pdo->prepare("INSERT INTO ". BDD_PREFIXE.$nomTable ." (libelle) VALUES(?)");
        					$res = $req->execute(array($libelle));
        					
        					if ($res)
        					{
        						$res = '<option value=""></option>';
        						
        						$listeAttributs = AttributSpectacle::get_allAttributs($type .'s');
        						
        						foreach($listeAttributs as $attribut)
        							$res .= '<option value="'. $attribut->get_idAttribut() .'">'. $attribut->get_libelle() .'</option>';
        						
        						echo $res;
        					}
        					else
        						echo 'error';
        				}
        				else
        					echo 'already-exists';
        				
        				break;
        			
        			case 'categorie-places' :
        				$libelle =	Secure::get_post('libelle', 'string', 'POST');
        				
        				$req = $pdo->prepare("SELECT idCategorie FROM ". BDD_PREFIXE.TABLE_CATEGORIES_PLACES ." WHERE libelle = ?");
        				$req->execute(array($libelle));
        				
        				if($req->rowCount() !== 1)
        				{
        					$req = $pdo->prepare("INSERT INTO ". BDD_PREFIXE.TABLE_CATEGORIES_PLACES ." (libelle) VALUES(?)");
        					$res = $req->execute(array($libelle));
        					
        					if ($res)
        					{
        						$res = '<option value=""></option>';
        						
        						$listeCategories = CategoriePlaces::get_allCategories();
        						
        						foreach($listeCategories as $categorie)
        							$res .= '<option value="'. $categorie->get_idCateg() .'">'. $categorie->get_libelle() .'</option>';
        						
        						echo $res;
        					}
        					else
        						echo 'error';
        				}
        				else
        					echo 'already-exists';
        				
        				break;
        				
        			case ('auteur' OR 'comedien' OR 'metteur en scene') :
        				$type =		Secure::get_post('type', 'string', 'POST');
        				$nom =		Secure::get_post('nom', 'string', 'POST');
        				$prenom =	Secure::get_post('prenom', 'string', 'POST');
        				
        				if ($type == 'auteur')			$nomTable = TABLE_AUTEURS;
        				elseif ($type == 'comedien')	$nomTable = TABLE_COMEDIENS;
        				else 							$nomTable = TABLE_METTEURS_EN_SCENE;
        				
        				// Récupération du nom du champ de la clé primaire
        				$req = $pdo->prepare("SHOW COLUMNS FROM ". BDD_PREFIXE.$nomTable);
        				$req->execute();
        				$champId = $req->fetchColumn();
        				
        				$req = $pdo->prepare("SELECT ". $champId ." FROM ". BDD_PREFIXE.$nomTable ." WHERE nom = ? AND prenom = ?");
        				$req->execute(array($nom, $prenom));
        				
        				if($req->rowCount() !== 1)
        				{
        					$req = $pdo->prepare("INSERT INTO ". BDD_PREFIXE.$nomTable ." (nom, prenom) VALUES(?, ?)");
        					$res = $req->execute(array($nom, $prenom));
        					
        					if ($res)
        						echo 'success';
        					else
        						echo 'error';
        				}
        				else
        					echo 'already-exists';
        				
        				break;
        				
        			default : echo '';
        		}
        	}
        	else
        		echo '';
        	
        ?>
        


        Le soucis semble provenir des classes 'Artiste' et 'CategoriePlaces'.

        Le projet est bien en ligne, mais je doute que ça ne t'avance :/
        • Partager sur Facebook
        • Partager sur Twitter
          5 avril 2010 à 2:40:39

          Si tu ajoutes un alert(res+' : '+res.length+' : '+(typeof res)) entre les lignes 15 et 16 de ton JS, ça t'affiche quoi, précisément ?
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            5 avril 2010 à 14:08:04

            Je n'avais pas pensé afficher la taille de la chaîne récupérée :/ Et en effet, j'obtiens ceci :

            Citation

            already-exists : 16 : string



            Il y a bien 2 caractères en trop :o

            Après vérification, les 2 classes à priori à l'origine de l'erreur en ajoutent chacune un.

            Quand je regarde mes classes, je ne vois nul part un saut de ligne ou autre caractère susceptible de déclencher ce bug :/

            [EDIT]

            Ce que je trouvé également étonnant, c'est que lorsque, dans le switch, je n'inclus que la classe qui m'est utile dans le cas courant, aucun caractère supplémentaire ne survient suite à l'inclusion des ces 2 classes. :o
            • Partager sur Facebook
            • Partager sur Twitter
              5 avril 2010 à 15:34:03

              Maintenant fais un truc dans ce goût là juste avant l'alert() :

              res = res.replace(/^[\s]*([\S\s]+?)[\s]*$/,'$1');
              


              Ca change quelque chose ?
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                5 avril 2010 à 17:32:32

                Ca n'a rien changé.

                J'ai fais d'autres test, et en fait, y'a 2 caractères identique devant la chaîne. Celui-ci a pour code ASCCI 65279. J'ai fais des recherche, mais je n'ai pas trouvé grand chose à ce sujet, ce caractère n'apparaît dans presque aucune table...
                • Partager sur Facebook
                • Partager sur Twitter
                  5 avril 2010 à 18:14:36

                  Apparemment le caractère 65279 serait l'espace insécable sans chasse :-°
                  65279 en hexa => FEFF

                  http://fr.wikipedia.org/wiki/Table_des [...] icode%2FUFE70

                  Essaye un replace comme ça :

                  res = res.replace(/^\ufeff*([\s\S]+?)\ufeff*$/,'$1');
                  


                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    5 avril 2010 à 19:27:26

                    Ça fonctionne :p

                    Par contre cela ne me dit toujours d'où vient le soucis :-° lol

                    C'est étonnant ça quand même ! Pourtant ttes mes classes sont encodées de la même manière, écrites de la même manière etc...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 avril 2010 à 20:02:30

                      C'est dans le PHP en fait que ce bug a lieu, c'est ça ?

                      Si tu veux vraiment connaître l'origine, va voir dans le forum PHP ;)

                      Pense à mettre ton sujet en résolu à l'aide du bouton approprié ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        6 avril 2010 à 0:27:42

                        D'accord :)

                        Merci beaucoup pour ton aide en tout cas, ce n'est pas la première fois que tu réponds à mes sujets et tu les résous systématiquement avec patience et compréhension. Merci à toi ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          5 mai 2010 à 1:32:04

                          Un mois, après, j'ai enfin trouvé la source du problème : la présence du BOM dans l'encodage de mon fichier.

                          http://www.alsacreations.com/astuce/li [...] t-ilnbsp.html

                          ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 mai 2010 à 1:36:13

                            On ne fait JAMAIS ajouter un include par l'utilisateur!
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              13 mai 2010 à 2:28:59

                              Citation : wapper

                              On ne fait JAMAIS ajouter un include par l'utilisateur!



                              Tu fais référence à ceci, lors de l'appel du script AJAX ?
                              include ('../../includes/config.inc.php');
                              include ('../../libs/classes/DB.class.php');
                              include ('../../libs/classes/MonException.class.php');
                              include ('../../libs/classes/Secure.class.php');
                              include ('../../libs/classes/Artiste.class.php');
                              include ('../../libs/classes/AttributSpectacle.class.php');
                              include ('../../libs/classes/CategoriePlaces.class.php');
                              


                              :o
                              • Partager sur Facebook
                              • Partager sur Twitter
                                13 mai 2010 à 10:39:04

                                Non, je fais référence à ton code AJAX, dans ton 2ème post ;)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  13 mai 2010 à 14:51:47

                                  A ceci si je comprends bien :

                                  url : './includes/ajoutSelect.inc.php',
                                  


                                  :o

                                  Je ne comprends pas bien le soucis en fait :euh:
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    13 mai 2010 à 16:43:16

                                    Ben, un include, c'est un élément qu'on intègre dans une page, pas une page en elle-même...

                                    En général, d'ailleurs, on ne laisse pas les includes accessibles...
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      13 mai 2010 à 19:19:00

                                      Donc ce que tu veux me dire c'est que le terme "include" est mal choisi dans mon cas ; un script PHP appelé en AJAX ne doit pas être nommé "include" ? :o
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        14 mai 2010 à 3:00:42

                                        Exactement, c'est un script à part entière, d'ailleurs, tu y inclus d'autres includes, non?

                                        Mon conseil, fais-en un vrai script (pas inc), et sécurise ton dossier inclmudes, de manière à ce qu'ils ne soient accessibles pas le client.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          14 mai 2010 à 14:55:34

                                          Merci pour le conseil ^^

                                          Et question pratique : tu placerais ce genre de script dans un répertoire portant quel nom ? :p
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            14 mai 2010 à 14:59:51

                                            Ben, dans ton www, tout simplement et vire-lui le .inc ^^
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Anonyme
                                              14 mai 2010 à 18:37:04

                                              Ce n'est pas vraiment sa place dans le www lol Je vais aviser, merci pour m'avoir signalé cela ;)
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              [AJAX] comparaison de chaînes identique retourne faux

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                              • Editeur
                                              • Markdown