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 :

BindParam et UPDATE [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut BindParam et UPDATE
    Bonjour, j'essaies ceci avec des variantes de syntaxe et je n'y arrive pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        $pdo_statement=$pdo_conn->prepare("UPDATE onglet SET titre = :titre, texte = :texte WERE id = :id");
     
        $pdo_statement->bindParam(':id', $_GET['id'], PDO::PARAM_INT);
        $pdo_statement->bindParam(':titre', $_POST['titre'], PDO::PARAM_STR);
        $pdo_statement->bindParam(':texte', $_POST['texte'], PDO::PARAM_STR);
     
        $result = $pdo_statement->execute();
    L'erreur obtenu:
    PHP Parse error: syntax error, unexpected '$_GET' (T_VARIABLE),

    Je ne vois pas c'est quoi le problème.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    ce code à l'air correct, vous avez peut-être une apostrophe simple non fermée dans le code avant.

  3. #3
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut J'ai modifié pour tester
    Toujours le même erreur après avoir modifié.
    L'erreur:
    syntax error, unexpected ''$id'' (T_CONSTANT_ENCAPSED_STRING), expecting ')' in



    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
    27
    28
    29
    30
    31
    32
    33
     
     
    ​<?php
    require_once("db.php");
     
    $id = $_GET['id'];
     
    if(!empty($_POST["save_record"])) {
        $pdo_statement=$pdo_conn->prepare(' UPDATE onglet SET titre = :titre, texte = :texte WERE id = :id ');
     
    $pdo_statement->bindParam(':id',  $id,  PDO::PARAM_INT);
    $pdo_statement->bindParam(':titre', $_POST["titre"], PDO::PARAM_STR);
    $pdo_statement->bindParam(':texte', $_POST["texte"], PDO::PARAM_STR);
     
        $result = $pdo_statement->execute();
        if($result) {
            header('location:index.php');
        }
    }
     
    $pdo_statement = $pdo_conn->prepare('SELECT id,titre,texte FROM onglet WHERE id= :id');
    $pdo_statement->bindParam(':id', $id, PDO::PARAM_INT);
    $pdo_statement->execute();
    $result = $pdo_statement->fetchAll();
     
    ?>
     
    <form name="frmAdd" action="" method="POST" accept-charset="utf-8">
          <textarea name="titre" rows="5" required ><?php echo htmlspecialchars($result[0]['titre']); ?></textarea>
          <textarea name="texte" rows="5" required ><?php echo htmlspecialchars($result[0]['texte']); ?></textarea>
          <input name="save_record" type="submit" value="Sauvegarder" />
          <input type="button" name="cancel" value="Annuler" />         
    </form>
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Bonjour,

    Vous avez déjà un indice, il faut bien lire le message d'erreur. D'ailleurs, il devrait mentionner la ligne mais en réalité c'est souvent la ligne du dessus qui pose problème à cause d'une mauvaise clôture, par exemple un ; manquant.

    Dans le code que vous avez posté, il semble y avoir des espaces ou caractères invisibles. C'est peut-être donc une erreur de parsing un peu pernicieuse. Je vous conseille de réviser tous les interlignes.

  5. #5
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    Aucune idée du problème.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Donne le message d'erreur complet
    Indente correctement ton script
    Après un header('Location: ...') on met généralement un exit() pour forcer immédiatement la redirection
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Citation Envoyé par dancom5 Voir le message
    Aucune idée du problème.
    Si je fais copier-coller de votre code, j'ai aussi un problème de parsing. Il y a des caractères invisibles au niveau des lignes blanches. Ces erreurs disparaissent quand je supprime les interlignes, quitte à les re-créer en tapant Enter...

  8. #8
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Citation Envoyé par binarygirl Voir le message
    Si je fais copier-coller de votre code, j'ai aussi un problème de parsing. Il y a des caractères invisibles au niveau des lignes blanches.
    c'est la balise code du forum qui ajoute ça dans la lignes vides.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Un truc que je remarque, ce code va chercher $id dans GET et le reste des variables dans POST.
    C'est possible mais est-ce voulu ? Est-ce que $_GET['id'] renvoie quelque chose ?
    Il manque de la validation de paramètres, normalement ce code n'est pas susceptible aux injections SQL mais un attaquant peut quand même le faire crasher.

    Ceci dit, il y a quand même un problème de parsing, et d'après le nouveau message d'erreur ce serait au niveau de la 4ème ligne (ou juste avant):
    Et comme par hasard c'est la première ligne blanche. Je persiste à penser qu'il y a une crasse dans le code.

  10. #10
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Que donne ceci ?

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?php
    require_once("db.php");
    if(! empty($_GET['id'])){
    	$id = $_GET['id'];
     
    	if(!empty($_POST["save_record"])) {
    		$pdo_statement=$pdo_conn->prepare(' UPDATE onglet SET titre = :titre, texte = :texte WERE id = :id ');
    		$pdo_statement->bindParam(':id',  $id,  PDO::PARAM_INT);
    		$pdo_statement->bindParam(':titre', $_POST["titre"], PDO::PARAM_STR);
    		$pdo_statement->bindParam(':texte', $_POST["texte"], PDO::PARAM_STR);
     
    		$result = $pdo_statement->execute();
    		if($result) {
    			header('location:index.php');
    			exit();
    		}
    	}
     
    	$pdo_statement = $pdo_conn->prepare('SELECT id,titre,texte FROM onglet WHERE id= :id');
    	$pdo_statement->bindParam(':id', $id, PDO::PARAM_INT);
    	$pdo_statement->execute();
    	$result = $pdo_statement->fetchAll(PDO::FETCH_ASSOC);
    	if(count($result) == 0){
    		header('location:index.php');
    		exit();
    	}
    }
    else{
    	header('location:index.php');
    	exit();
    }
    ?>
    <form name="frmAdd" action="#" method="POST" accept-charset="utf-8">
    	<textarea name="titre" rows="5" required ><?php echo htmlspecialchars($result[0]['titre']); ?></textarea>
    	<textarea name="texte" rows="5" required ><?php echo htmlspecialchars($result[0]['texte']); ?></textarea>
    	<input name="save_record" type="submit" value="Sauvegarder" />
    	<input type="button" name="cancel" value="Annuler" />         
    </form>
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  11. #11
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    Que donne ceci ?
    Erreur à la ligne 6 :
    unexpected 'if' (T_IF)

    J'ai dû reviser la notion de PDO à la base car j'ai des problèmes avec bindParam que je n'arrive pas à faire fonctionner.. alors, j'ai changé pour bindValue et là, j'obtiens des résultat mais plus sur ce code soumis. Merci d'avoir tenter de m'aider sur le sujet.

    Pourquoi je n'arrive pas à utiliser binParm, je ne sais pas.

    Je soumets quand même au cas oû il y aurait une solution:

    Connexion:
    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
     
    <?php
     
    $db =     'bdd';
    $user = 'bdd';
    $pass = 'juq';
     
    class Connection
    {
        public static function make($host, $db, $user, $pass)
        {
            $dsn = "mysql:host=$host;dbname=$db;charset=UTF8";
     
            try {
                $options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
                    PDO::ATTR_EMULATE_PREPARES => false];
     
                return new PDO($dsn, $user, $pass, $options);
            } catch (PDOException $e) {
                die($e->getMessage());
            }
        }
    }
     
    return Connection::make($host, $db, $user, $pass);
    Et le code test:

    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
     
    <?php
    $pdo = require 'conn.php';
     
    $_POST["description"] = 'test2';
     
    $sql = 'UPDATE meta SET description = :description WHERE id = :id';
    $statement = $pdo->prepare($sql);
    $statement->bindValue(':id', $_GET["id"], PDO::PARAM_INT);
    $statement->bindValue(':description', $_POST["description"]);
    if ($statement->execute()) {
        echo "The meta has been updated successfully!";
    }
     
    //ok
    $sql = 'SELECT * FROM meta WHERE id= :id';
    $statement = $pdo->prepare($sql);
    $statement->bindValue(':id', $id, PDO::PARAM_INT);
    $statement->execute();
    $item = $statement->fetch(PDO::FETCH_ASSOC);
    if ($item) {
        echo $item['id'] . ' ' . $item['description'];
    } else {
        echo "item not found.";
    }
    Je n'ai pas mis les code de sécurité car c'est la partie PHP et SQL binParam. UPDATE et SELECT sont sur la même page.

    Mise à jour et affichage après.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  12. #12
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Et quelle est la question avec ce nouveau code ? le résultat souhaité ? le résultat obtenu ? quel débugage avez-vous fait ?

  13. #13
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    Le résultat souhaité.

    Parfois, je ne comprends pas pourquoi la syntaxe ne fonctionne pas.
    Là, j'ai testé avec le nouveau code bindParam et bindValue et ça fonctionne.
    Mais, je n'ai toujours pas cerné la différence entre les deux et le pourquoi.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  14. #14
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    @dancom5 : le bouton "répondre avec citation" n'est utile que si vous ne répondez pas au dernier message ou bien que vous ne répondez qu'à une partie du dernier message. Dans ce deuxième cas, il ne faut conserver dans la citation que la partie du message à laquelle vous faites référence.
    Le plus souvent "répondre" (sans citation donc) est suffisant.

    Ca évite de surcharger inutilement le fil de discussion

    J'ai modifié vos interventions précédentes pour supprimer les citations inutiles.

  15. #15
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut Résolution au problème
    Il me manquait une variable dans la connexion $host et ça résolu mon problème. Pour aider quelqu'un, je soumets ma solution.

    Fichier de connexion:
    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
    27
     
    <?php
     
    $host = '127.0.0.1';
    $db =     'bdd';
    $user = bdd';
    $pass = 'tv5juq';
    
    class Connection
    {
        public static function make($host, $db, $user, $pass)
        {
            $dsn = "mysql:host=$host;dbname=$db;charset=UTF8";
    
            try {
                $options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
                    PDO::ATTR_EMULATE_PREPARES => false];
    
                return new PDO($dsn, $user, $pass, $options);
            } catch (PDOException $e) {
                die($e->getMessage());
            }
        }
    }
    
    return Connection::make($host, $db, $user, $pass);

    Requête SELECT et UPDATE :
    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
    27
     
    <?php
    $pdo = require 'conn.php';
     
    $_GET["id"] = 1;
     
    $_POST["description"] = 'test';
     
    $sql = 'UPDATE meta SET description = :description WHERE id = :id';
    $statement = $pdo->prepare($sql);
    $statement->bindParam(':id', $_GET["id"], PDO::PARAM_INT);
    $statement->bindParam(':description', $_POST["description"], PDO::PARAM_STR);
    if ($statement->execute()) {
        echo "The meta has been updated successfully!";
    }
     
     
    $sql = 'SELECT * FROM meta WHERE id= :id';
    $statement = $pdo->prepare($sql);
    $statement->bindParam(':id', $_GET["id"], PDO::PARAM_INT);
    $statement->execute();
    $item = $statement->fetch(PDO::FETCH_ASSOC);
    if ($item) {
        echo $item['id'] . ' ' . htmlspecialchars($item['description']);
    } else {
        echo "item not found.";
    }
    Ceci fonctionne très bien et constitue ma solution. Merci.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

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

Discussions similaires

  1. Requête update à partir d'une autre table
    Par amiral thrawn dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/02/2024, 11h40
  2. [MySQL] PDO update avec bindParam dans des boucles
    Par rvm31 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/09/2017, 11h12
  3. [dBase]il y a mieux que la commande sql UPDATE ?
    Par sana72 dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/12/2002, 11h59
  4. Réponses: 3
    Dernier message: 10/11/2002, 11h03
  5. update et virgule
    Par Delph dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/08/2002, 14h40

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