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 "T CONSTANT ENCAPSED STRING"


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2012
    Messages : 164
    Par défaut Erreur "T CONSTANT ENCAPSED STRING"
    Bonjour,

    Ma ligne de code ci-dessous rencontre une petite erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bdd->exec('UPDATE restos SET nom='.$nom.', adresse='.$adresse.', telephone='.$tel.', horaire='.$horaire.', emporte='.$emporte.', livre='.$livre' , specificite ='.$spe.' WHERE ID = '.$id.'');
    Voici l'erreur :
    ( ! ) Parse error: syntax error, unexpected '' , specificite ='' (T_CONSTANT_ENCAPSED_STRING) in C:\wamp\www\DjibRestos\traitement\action_modif.php on line 14
    Je ne comprends pas ce qu'est une erreur T_CONSTANT_ENCAPSED_STRING

    Merci de m'aider !

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Salut,

    ton problème vient du fait que tu n'échappes aucune de tes données.
    En fonction de la connexion à la base de donnée : PDO ou mysql_ ou mysqli_, tu devras adapter l'échappement.

    Poste le code complet stp.

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2012
    Messages : 164
    Par défaut Echaper une donnée
    Je vais paraître bête mais... Que veut dire "Échapper une donnée ? "

    Est-ce le fameux CLOSE Cursor ?

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Échapper une donnée veut dire : la rendre inoffensive.
    Tu ne dois pas être sans savoir que les termes d'un langage (humain ou informatique) sont interprétés et que ces mêmes termes produisent un résultat.
    Le but en informatique c'est que le résultat produit soit exactement et uniquement celui attendu et rien d'autre.

    Par exemple : tu veux mettre à jour une colonne de type texte :
    le SQL attend quelque chose comme ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE restos SET nom = 'un_nom'
    Maintenant tu injectes ta valeur avec une variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE restos SET nom = '$nom'
    Si $nom contient un ' comme dans L'auberge, ton SQL sera au final comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE restos SET nom = 'L'auberge'
    Tu peux voir que nom s'arrêtera à L, la chaîne commence au premier ' (ouvrant) et s'arrête dès qu'un autre ' est rencontré (fermant), le reste de la chaîne auberge produira une erreur car le moteur SQL ne saura pas l'interpréter.

    Dans notre cas, l'échappement de la valeur L'auberge aura pour conséquence de rendre le ' inoffensif.

    Il y a plein d'autres cas concernant les failles dans du code SQL non échappé, mais sache que tu dois absolument toujours échapper les données en provenance d'un utilisateur sauf si t'es absolument sûr du type de donnée manipulé (entier, décimal...).

    PHP offre plein de manières pour sécuriser le SQL.
    PDO est le plus recommandé car il permet de gérer le SQL de manière uniforme sur une douzaine de moteurs de bases de données différents.
    En gros, tu feras toujours : $stmt->execute(); pour du MySQL, PostgreSQL, Oracle... alors que si tu passes par les fonctions spécifiques tu devras faire : mysqli_stmt_execute(), pg_execute() ou encore oci_execute().

    Enfin, PDO propose un mécanisme de préparation des requêtes facilitant leur échappement et leur réutilisation. PDO a été maintes et maintes fois abordé sur le forum alors fait une petite recherche et tu devrais trouver ton bonheur.
    En attendant voici la doc vers PDO::prepare

    Et n'oublie pas de poster ton code stp.

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2012
    Messages : 164
    Par défaut Merci.Solution : Requête préparée
    Merci pour cette explication très constructive. Je connaissais effectivement le principe de "s'échapper", mais, sans savoir pourquoi, je ne l'imaginais pas en Bdd. Donc, forcement, l'exemple de "L'Auberge" est très parlant. Au final, une simple requête préparée et la solution est trouvée :

    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
    <?php include("../include/connect.php");
     
    //Recupération des variables envoyées par le formulaire
    $id=$_POST['ID'];
    $nom=$_POST['nom'];
    $adresse=$_POST['adresse'];
    $tel=$_POST['telephone'];
    $horaire=$_POST['horaire'];
    $emporte=$_POST['emporte'];
    $livre=$_POST['livre'];
    $spe=$_POST['specificite'];
     
     
    $req = $bdd->prepare('UPDATE restos SET nom = :nnom, adresse = :nadresse, telephone = :ntel, horaire = :nhoraire, emporte = :nemporte, livre = :nlivre, specificite = :nspe WHERE ID = '.$id.'');
    $req->execute(array(
    'nnom' => $nom,
    'nadresse' => $adresse,
    'ntel' => $tel,
    'nhoraire' => $horaire,
    'nemporte' => $emporte,
    'nlivre' => $livre,
    'nspe' => $spe
    ));
    J'espère que ce code pourra aider certaines personnes et qui trouveront leurs réponses comme j'ai pu le faire grâce à ce cours d'informatique passionnant et surtout UTILE !

    Merci !

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

Discussions similaires

  1. Erreur de compilation sur std::string avec Dev C++
    Par dada57 dans le forum Dev-C++
    Réponses: 4
    Dernier message: 20/03/2006, 18h06
  2. Réponses: 4
    Dernier message: 22/02/2006, 14h11
  3. Erreur ORA-01704 : constante de chaine trop longue
    Par verrec_s dans le forum Oracle
    Réponses: 22
    Dernier message: 13/12/2004, 15h30
  4. Réponses: 6
    Dernier message: 03/09/2003, 10h29

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