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 :

Erreur de syntaxe lors de concaténation de chaine


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut Erreur de syntaxe lors de concaténation de chaine
    Bonsoir,

    Étrangement, j'ai une erreur de syntaxe lors de l'excécution d'un pg_query :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sql = "SELECT COUNT(*) FROM ".$this->table." WHERE ".$this->champlogin." = '".$login."' AND ".$this->champassword." = ".$password."";
    Par contre la requête suivante fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sql = "SELECT COUNT(*) FROM ma_table WHERE champ_login = '".$login."' AND champ_password = '".password."'";
    L'erreur se situe entre le FROM ma_table et le WHERE si je me base sur le code couleur de mon éditeur de texte.

    Clarification :
    - tous les champs et nom de tables sont en minuscules,
    - les champs texte dans la requête sont entre simple quote conformément à ce que PG demande,
    - les variables auxquelles font références les $this sont toutes en double quote.

    J'ai bien essayé de faire des switch entre simple et double quote sans résultat et j'ai bien du mal à comprendre l'erreur.
    Exprimer une différence d'opinion vaut mieux que :

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1/ echo $sql; ?

    2/ Message d'erreur ?

  3. #3
    Membre chevronné

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 576
    Points : 1 989
    Points
    1 989
    Par défaut
    Bonsoir, si tu pouvais donner l'erreur cela serait plus simple ici je pense que c'est un problème de guillemets.

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut

    dans la 1ère requête tu as oublié d'encadrer le mot de passe de guillemets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->champassword." = ".$password."";
    essaie avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->champassword." = '".$password."'";
    Tout le reste est correct

  5. #5
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut
    Je n'ai plus le log à portée de clic. De mémoire, la requête est correctement formatée jusqu'a la définition de la première valeur. Le log d'erreur PHP montrait pour le champ login des double quote, ce qui correspond à une erreur de syntaxe pour une chaine avec PostgreSQL.

    A vérifier. Update à venir au plus tard lundi.

    Merci pour les réponses.
    Exprimer une différence d'opinion vaut mieux que :

  6. #6
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut
    Je viens d'effectuer le test en entourant ce que j'ai dans le WHERE par des simple quotes. Même message d'erreur.

    Le message d'erreur :

    WHERE champ_login = ''mavaleur...

    Evidement, PostgreSQL refuse de le traiter correctement, les string ne doivent pas être entourées de double guillemets.

    La logique de mon code :
    - récupération des données en POST, le login et mot de passe,
    - Initialisation de la classe d'authentification avec le nom de la table, du champ login, et celui de mot de passe fourni au constructeur, l'ensemble de ces string sont en simple quote,
    - la méthode de login de la classe d'autentification est appelée, avec pg_connect, l'ensemble de la requête SQL est entre double quote, les valeurs passées en paramètres sont entourés de simple quote dans la requête,
    - utilisation de pg_escape_string, qu'elle soit utilisée ou non ne change rien au message d'erreur.

    C'est comme si la requête était interprétée avec les simple quote fournis dans ma requête auquel on ajoute une simple quote des valeurs que je passe en paramètre.

    Je sèche.
    Exprimer une différence d'opinion vaut mieux que :

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Si au moins tu montrais ton code... ?
    + ce que renvoie echo $sql; (comme déjà demandé).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE champ_login = ''mavaleur...
    Tu as mis 2 ' (simple quote) au lieu d'1 " (double quote), à moins qu'elles soient mal placées (?).

  8. #8
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $dbConn = pg_connect($connectionString);
     
    $login = pg_escape_string($login);
    $password = pg_escape_string($password);
     
     
    $sql = "SELECT COUNT(*) FROM ".$this->table." WHERE ".$this->champlogin." = '".$login."' AND ".$this->champpassword." = '".$password."'";
     
    $query = pg_query($connectionString, $sql);
    echo pg_last_error($connectionString);
    Exprimer une différence d'opinion vaut mieux que :

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    + ce que renvoie echo $sql; (comme déjà demandé)
    C'est le B.A.-BA du débogage*.

    + nous montrer le VRAI message d'erreur (= complet) n'est pas inutile non plus si tu veux VRAIMENT une réponse.


    *Telle qu'on voit ta requête, elle semble correcte.
    Donc, c'est que l'erreur est ailleurs, non ?
    Le fait qu'un des paramètres que tu veux transmettre soit vide, par exemple...

  10. #10
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut
    OK, je dis rien sur le B A BA du debug parce que ma réflexion risque d'être pris comme du troll contre ce [...] de langage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "SELECT COUNT(*) FROM ".$this->table." WHERE ".$this->champlogin." = '".$login."' AND ".$this->champpassword." = '".$password."'";
    Il me semblait l'avoir saisi correctement à la base.

    Tout mon code fonctionne correctement, sauf que.. énième changement de direction, au lieu de faire du pg_query, je dois me retapper le SQL effectué en utilisant sql_prepare et d'isoler le tout dans une couche d'accès aux données. Pour la petite histoire c'est ce que je voulais faire à la base.

    Comme d'habitude, mon script aussi banal que de faire tourner une simple requête SQL prend trois plombes à débugger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //param 1: nom de la table, param 2: champ de login, param 3: login, param 4: champ de password, param 5: password
    $sql = pg_prepare($dbConn, "login", "SELECT COUNT(*) FROM $1 WHERE $2 = '$3' AND $4 = '$5'");
     
    		$query = pg_execute($dbConn, "ma_requete", ["table_user", "user_login", "user@unmail.com", "user_password","motdepasse"]);
     
    		$dataSet = pg_fetch_all($query);
    Le message d'erreur exact :

    pg_prepare(): Query failed: ERREUR: erreur de syntaxe sur ou pr\xc3\xa8s de \xc2\xab $1 \xc2\xbb\nLINE 1: SELECT COUNT(*) FROM $1 WHERE $2 = '$3' AND $4 = '$5'\n, referer: http://localhost/index.php

    Au delà du ton du message, je reprends les choses logiquement :
    pg_prepare sert à mettre en cache une requête donnée pour pouvoir la réutiliser et gagner en perfs, la requête fournie en paramètre prend des pseudo variables ($numéro) qui sont ensuite remplacés par le contenu du tableau fourni dans le 3ème paramètre de pg_execute.

    Pour re clarifier, les paramètres $3 et $5 sont des champs de type VARCHAR dans la BDD et doivent donc normalement être entre simple quote.

    Il y a un truc qui me chiffonne sur le gain de perfs de pg_prepare :

    Mon code est encapsulé dans ma classe d'accès aux données dans une méthode spécifique. Si cette requête est créée à cet endroit, elle n'aura qu'une durée de vie que lors de l’exécution de la méthode et jamais au delà, le gain de perf est donc nul non ? Dois-je donc mettre l'ensemble de mes requêtes préparés dans le constructeur de la classe pour les appeler ensuite dans les méthodes de la classe ?

    J'éditerai le message s'il manque de clarté, je ne serai pas contre un oreiller, des vacances ou une Piña colada sur une plage dans l'immédiat.

    EDIT :
    Bon, mon code fonctionne de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $sql = pg_prepare($dbConn, "login", "SELECT COUNT(*) FROM $table WHERE $champlogin = $1 AND $champpassword = $2");
     
    $query = pg_execute($dbConn, "login", [$login, $password]);
    La partie sur les questions de perfs de pg_prepare est toujours valable.

    Ce que je ferai à PHP >
    Exprimer une différence d'opinion vaut mieux que :

  11. #11
    Invité
    Invité(e)
    Par défaut
    C'était trop difficile d'écrire dans ton code et de nous montrer CE QUI EST AFFICHE A L'ECRAN ??

  12. #12
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut
    Non, en effet.
    Exprimer une différence d'opinion vaut mieux que :

Discussions similaires

  1. Erreur invalid syntax lors d'un print
    Par yvkoe dans le forum Général Python
    Réponses: 3
    Dernier message: 10/08/2009, 11h59
  2. Erreur de syntaxe lors d'un INSERT INTO
    Par amerex dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 29/09/2008, 23h23
  3. [MySQL] Erreur de syntaxe lors de l'import de fichier .sql
    Par dadoo91 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 29/05/2008, 07h47
  4. Erreur de syntaxe lors de la construction d'un lien
    Par sosophie dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 04/06/2007, 17h02
  5. [PEAR][Services_Google] Erreur de syntaxe lors de son utilisation
    Par blueice dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 17/05/2006, 11h13

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