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 :

ordre insert concaténé et paramètres


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2016
    Messages : 23
    Par défaut ordre insert concaténé et paramètres
    Bonsoir,

    je bute sur un problème que je ne comprends pas.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            //$sql="insert into Client (titreCli,nomCli,prenomCli,adresseRue1Cli,adresseRue2Cli,cpCli,villeCli,telCli) values (? ,? ,? ,? ,? ,? ,? ,? )";
            $sql="insert into " . $this->table . " " . $colonnes . ") values " . $colonnesParams .")";
     
            echo $sql; //pour voir la requête à l'écran en plus du deboggueur
            $unObjetPDO= Connexion::getConnexion();
             $req=$unObjetPDO->prepare($sql);
             $req->execute($parametres);
    la variable $colonnes contient la liste des colonnes de la table :
    (titreCli,nomCli,prenomCli,adresseRue1Cli,adresseRue2Cli,cpCli,villeCli,telCli)
    la variable $colonnesParams contient la liste des paramètres à passer à la requête :
    (? ,? ,? ,? ,? ,? ,? ,? )
    ces 2 variables sont obtenues par concaténation. l'idée est de créer un ordre insert générique.

    A l'exécution de la requête, j'ai un message :
    Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de ''
    j'affiche la requête vensée passer, j'ai ceci (echo) :
    insert into Client (titreCli,nomCli,prenomCli,adresseRue1Cli,adresseRue2Cli,cpCli,villeCli,telCli) values (? ,? ,? ,? ,? ,? ,? ,? )
    quand je fais un copier/coller du résultat de mon echo et que je met l'ordre sql en dur dans mon code, ça marche (voir la ligne commentée de la requête).
    Je ne comprends pas du tout ce qu'il se passe. J'ai essayé avec des paramètres nommés ou pas !
    Avez-vous une idée
    Merci

  2. #2
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 099
    Par défaut
    Si la requête marche après un copier / coller, c’est que l’opération de copier / coller fait quelque chose qui permet au code de marcher. À ta place, j’essayerais de voir s’il n’y a pas des caractères invisibles dans le script PHP (espaces insécables, soft hyphens, etc.) Pour ça tu peux t’aider des fonctions de ton IDE ou éditeur de texte pour voir notamment la longueur des lignes.

    Sinon comme solution simple mais qui n’aidera pas à comprendre le problème, tu peux copier / coller le script entier à la place de lui-même et voir si ça résoud le problème.

    Edit : voici un code HTML qui fait apparaître un soft hyphen. C’est un tiret qui n’apparaît qu’à la fin d’une ligne quand un mot est coupé en deux. Je ne peux pas le montrer directement car ce forum le remplace par une astérisque.
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <textarea rows="1" cols="4">aaaa­bbbb</textarea>
    Si tu redimensionnes le champ de texte, tu verras le « shy » apparaître ou disparaître selon que le mot doit être coupé en deux ou pas.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2016
    Messages : 23
    Par défaut
    Merci pour ton retour.
    Je viens de trouver en faisant un affichage du code source de la page. Voici le résultat :
    Nom : Capture.PNG
Affichages : 90
Taille : 1,0 Ko
    En fait cela vient de la conversion d'un objet en tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $attributs = (array) $objet;
    c'est cette conversion qui me pourrit la clé du tableau.

    Par contre je ne sais pas comment éviter le problème. Merci pour vos aides

  4. #4
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 099
    Par défaut
    Ce n’est pas une bonne idée de caster directement un objet en tableau. Comme tu peux le voir, PHP ajoute des caractères NUL (octet 0, noté "\0" dans les chaînes) pour indiquer qu’il s’agit d’une propriété privée.
    Ce n’est pas la solution idéale, mais tu devrais pouvoir utiliser str_replace pour supprimer les "\0". Je ne suis pas familier avec Doctrine mais je pense qu’il y a moyen de faire plus simple.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2016
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2016
    Messages : 23
    Par défaut
    Merci beaucoup, effectivement le str_replace marche bien.
    Cela me permet d'avoir un ordre insert générique. Sur ce projet, je ne suis aps sur doctrine, je me fais un petit framework.
    Bonne journée

  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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Si jamais tu maitrises les classes que tu veux caster en tableau, tu pourrais ajouter une méthode toArray dedans, dans laquelle tu appellerais get_​object_​vars et qui renverrait toutes les propriétés de l'objet sous forme de tableau.
    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]

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