IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

unexpected character : erreur à l'exécution d'une requête MySQL avec PHP


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 94
    Points : 66
    Points
    66
    Par défaut unexpected character : erreur à l'exécution d'une requête MySQL avec PHP
    Bonsoir tout le monde,

    Je viens à vous car je cherche en vain depuis plusieurs heures.

    La requête que j'essaye d'exécuter avec une variable type texte comme paramètre de l'instruction WHERE produit l'erreur suivante :

    syntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
    la ligne de code de la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach ( $phrases_h as $h ) { 
    $resultat_h=$connexion->query("SELECT libelle_h FROM phrase_h_heuh WHERE phrase_h='$h'");
    ...
    }
    Le problème vient de la variable $h, pourtant la syntaxe paraît correcte, d'ailleurs si je remplace '$h' par une des valeurs
    que cette variable peut prendre, par exemple 'H301', la requête fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach ( $phrases_h as $h ) { 
    $resultat_h=$connexion->query("SELECT libelle_h FROM phrase_h_heuh WHERE phrase_h='H301'");
    //là ça fonctionne !!!
    ...
    }
    $h provient d'un tableau de type string, obtenu à partir d'une chaîne de caractères avec le séparateur ',' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $phrases_h = explode(",", $resultH);
    J'ai vérifié en les affichant et les variables $h contiennent bien les valeurs attendues, par exemple : 'H301'

    J'ai comme l'impression que c'est un problème de format, de guillemets, mais je n'arrive pas à savoir ce qui cloche : le tableau d'où est
    issu $h contient des chaînes de caractères, et $h est bien une chaîne (ce que j'ai vérifié en utilisant gettype())

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    L'erreur que tu cites est une erreur JavaScript, ça n'a rien à voir avec une requête SQL...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    @Bovino : m'est avis qu'il a cette erreur parce qu'il appelle son script PHP via une fonctionnalité Ajax qui mappe la réponse toute seule (genre jQuery ou Angular) et que le script PHP retourne quelque chose comme "Fatal Error :..." au lieu de renvoyer un json propre.

    @sub_zero : ce qui serait utile, ce serait d'avoir le vrai message d'erreur, celui qui parle de ta requête qui plante.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    Ok merci, mais je suis un peu un padawan, comment je fais pour obtenir le message d'erreur de la requête à partir du script PHP ?

    Sinon juste une indication, quand j'écris dans la requête une valeur qui ne fait pas partie de ma table phrase_h_heuh, par exemple 'H419', j'obtiens exactement le même message d'erreur.

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    Je vais essayer avec un try catch en PHP et j'afficherais l'exception dans mon formulaire ...

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tu passes bien par de l'Ajax ? Si c'est le cas, tu peux surveiller les requêtes HTTP avec par exemple Firebug ( Firebug : V-B. Les requêtes HTTP à la loupe). Tu as sans doute le message d'erreur PHP dans la réponse de ta requête AJAX.

    Si tu as le problème pour d'autres valeurs, m'est avis que le problème est plutôt au niveau de l'exploitation du résultat. On peut voir la suite du code ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    Oui je passe bien par de l'Ajax. Dans la page php appelée il y a une première requête puis une deuxième requête qui utiliser un des résultats de la première.
    J'ai installé Firebug (merci, au passage), et j'obtiens ce message d'erreur qui semble me dire que ma variable $result n'est pas un objet :

    <b>Notice</b>: Trying to get property of non-object in <b>C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\CalculRisquesChimiques\infos_substance.php</b> on line <b>22</b><br />
    La ligne 22 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lib = $result->libelle_h;
    Le code de la page php qui contient la ligne 22 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    include('connexion.php');
    $num_cas = $_POST['numCas'];
    $resultats=$connexion->query("SELECT Phrases, H, GHS, Pictogrammes FROM substance WHERE Num_cas='$num_cas'");
    $resultats->setFetchMode(PDO::FETCH_OBJ);
    while( $resultat = $resultats->fetch() ) {
    	$resultPhrases = $resultat->Phrases;
    	$resultH = $resultat->H;
    	$resultGhs = $resultat->GHS;
    	$resultPictos = $resultat->Pictogrammes;
    }
    $phrases_h = explode(",", $resultH);
    //la chaîne contenant les phrases H est découpée et ses éléments insérés dans un tableau
    $phrases_h_lib = array();
    foreach ( $phrases_h as $h ) { 
    	$resultat_h=$connexion->query("SELECT libelle_h FROM phrase_h_heuh WHERE phrase_h='$h'");
    	$resultat_h->setFetchMode(PDO::FETCH_OBJ);
    	$result = $resultat_h->fetch();
    	$lib = $result->libelle_h;                //ligne 22
    }
    $resultSubst = array('Phrases' => $resultPhrases,
    		   'Libelle' => $lib,
                                   'H' => $resultH,
    		   'GHS' => $resultGhs,
    		   'Pictogrammes' => $resultPictos);
    echo json_encode($resultSubst);
    ?>

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Et bien il faut continuer le debugage mon ami ....
    si $result n'est pas un objet, qu'est-il ?
    Ca devrait donner FALSE si la requête n'a pas donné de résultat ou NULL si la requête n'a pas fonctionné du tout.
    Dans le deuxième, active les erreurs PDO.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    Avec les outils de débugage je n'ai rien trouvé de plus. Par contre en faisant plusieurs test sur différentes données j'ai trouvé d'où venait l'erreur : lorsque la requête renvoie une réponse contenant du texte avec des accents ou des caractères spéciaux, c'est là que ça bug

    J'ai donc remplacé la ligne 22
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lib = $result->libelle_h
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lib = utf8_decode($result->libelle_h);
    Et là ça ne provoque plus d'erreur et le libellé est affiché dans la page, mais je perds les accents : j'ai des '?' à la place ...

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ajax utilise unicode.
    Tu dois donc uniformiser vers UTF8.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    merci, chef.

    Voilà ce qui est fait :

    la page php dans laquelle s'affiche les résultats de la requête, était précisé le jeu de caractères (utf-8) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    J'avais exporté les données au format utf-8 et importé en utf-8 aussi

    Au niveau du champ de la table qui pose problème, dans la structure de la table il y a Interclassement : latin1_swedish_ci, j'ai modifié en 'utf8_unicode_ci', mais ça ne change rien au problème.

    Est-ce qu'il y aurait d'autres choses à faire ?

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    J'ai lu ton lien, et finalement il y a eu un truc qui m'a servi dedans : j'ai remplacé decode par encode et j'obtiens enfin les caractères accentués :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lib = utf8_encode($result->libelle_h);
    Merci à tous

  14. #14
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    Juste une précision, ça peut servir à d'autres.

    Il y avait une deuxième raison qui entraînait l'échec de la requête PHP : la fonction explode, pour des raisons que j'ignore, avait ajouté des sauts de ligne avant chaque valeur, je l'ai vu dans Firebug. Je les ai donc supprimés avec l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $h= str_replace("\n",'',$h);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur d'exécution d'une requête liée sous sqlserver 2008
    Par zanoubya dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 25/05/2012, 13h56
  2. Erreur d'exécution d'une requête SQL
    Par KnowPart dans le forum JDBC
    Réponses: 3
    Dernier message: 30/12/2010, 15h48
  3. [AC-2003] Erreur à l'exécution d'une requête d'ajout
    Par flet le kid dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 29/05/2009, 17h27
  4. Erreur d'exécution d'une requête sql
    Par marceline dans le forum Oracle
    Réponses: 2
    Dernier message: 11/07/2006, 13h12
  5. [MySQL] Message d'erreur à l'exécution d'une requête
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/02/2006, 14h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo