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

Langage PHP Discussion :

update entrée d'une table


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Par défaut update entrée d'une table
    Je suis plantée dans la création d'une page qui permet de modifier une actualité diffusée sur mon site, je voudrai pouvoir ,en cliquant sur modifier, être dirigée vers la page modification, qui m'affiche une zone de texte dans laquelle il y a le contenu de l'actualité à modifier, ainsi j'effectue le changement et avec la requête 'UPDATE' la modification aura lieu dans la base de donnée.
    Voilà mon objectif, cependant je ne suis pas arrivée à concevoir comment le code doit etre, j'ai fais plusieurs essais mais en vain, pouvez vous donc me donner un petit coup de pouce? et Merci
    La page est: essai.php
    Table: news
    champs:
    -id: (int) clé primaire incrémentation automatique
    -titre: (VARCHAR)
    -contenu: TEXT
    voilà un de mes essais:
    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
    39
    40
    41
    42
    43
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>modifier actualité</title>
    </head>
    <body>
    <?php
    try
    {
    	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    	$bdd = new PDO('mysql:host=localhost;dbname=projet', 'root', '', $pdo_options);
    }
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
     
    if (isset($_POST['contenu']))
    {
         $req = $bdd->prepare('UPDATE news SET contenu = :nv_contenu WHERE titre =\'' . $_POST['titre'] . '\'');
         $req->execute(array(
    	'nv_contenu' => $_POST['contenu']
    	 ));
        $req->closeCursor();
    }
    ?>
    <b> Modification actualité </b>
     
       <form action="essai.php" method="post">
            <p>
            <label for="titre">Titre</label> : <br><input type="text" name="titre" id="titre" value="<?php if(isset($_POST['titre'])) echo $_POST['titre']?>" /><br />
            <label for="contenu">Contenu</label> : <br><textarea name="contenu" rows="8" cols="45" id="contenu">
             <?php
    		  if (isset($_POST['contenu']))
    		  echo $_POST['contenu'];
    		  ?>
    		</textarea><br />
            <input type="submit" value="Valider" />
    	</p>
        </form>
    </body>
    </html>

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    A priori ce serait au niveau de la requête préparée où ça n'irait pas.
    Essaies comme ceci pour voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if (isset($_POST['contenu'], $_POST['titre']))
    {
        $contenu = $_POST['contenu'];
        $titre = $_POST['titre'];
     
        $req = $bdd->prepare('UPDATE news SET contenu = :contenu WHERE titre = :titre');
        $req->bindParam(':contenu', $contenu, PDO::PARAM_STR);
        $req->bindParam(':titre', $titre, PDO::PARAM_STR);
        $req->execute();
        $req->closeCursor();
    }
    J'ai rajouté $_POST['titre'] dans le isset(), histoire de ne pas se faire avoir.
    Il y a des exemple dans la doc de Php : PDOStatement::execute


    Au passage, pourquoi utilises tu comme critère "titre" pour mettre à jour (pour désigner) la news ?
    Pourquoi ne pas plutôt utiliser un identifiant ?
    Il doit avoir un identifiant unique pour chaque news, non ? (c'est théoriquement plus fiable).
    D'ailleurs, 2 (voir plus) news pourraient très bien avoir le même titre, si c'est le cas ça va buguer.

  3. #3
    Membre éclairé Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Par défaut
    Salut
    Merci RunCodePhp pour l'aide, j'ai changé le code comme vous m'avez indiqué mais ça ne marche toujours pas :\ , je vais changer l'identificateur peut etre que ça marchera.

    Bon moi j'ai choisis comme identificateur le 'titre' parce que j'ai pensé que c'est mieux puisque l'éditeur connait le titre et non pas l'id du titre dans la table.
    Et merci pour le plus que vous m'avez ajouté par bindParam (j'ai consulté le cours mais j'ai pas bien compris la difference entre avec bindParam et sans)

  4. #4
    Membre éclairé Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Par défaut
    J'ai pensé que le mieux est de récupérer l'actualité à modifier tout d'abord, de l'afficher et puis la modifier, voici le code:
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>modifier actualité</title>
    </head>
    <body>
    <?php
    try
    {
    	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    	$bdd = new PDO('mysql:host=localhost;dbname=projet', 'root', '', $pdo_options);
    }
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
    ?>
    <b> Modification actualité </b>
    <?php
    if (isset($_GET['id']))
    {
      $reponse = $bdd->query('SELECT titre, contenu FROM news WHERE id = :id');
      while ($donnees = $reponse->fetch())
    {
    ?>
    	<form action="affichage_news.php" method="post">
            <p>
            <label for="titre">Titre</label> : <br><input type="text" name="titre" id="titre" value="<?php if(isset($_POST['titre'])) echo $_POST[          'titre']?>" /><br />
            <label for="contenu">Contenu</label> : <br><textarea name="contenu" rows="8" cols="45" id="contenu">
              <?php
    		  if (isset($_POST['contenu']))
    		  echo $_POST['contenu'];
              ?>
    		</textarea><br />
            <input type="submit" value="Valider" />
    	  </p>
        </form>
    <?php
    }
    $reponse->closeCursor();
    }
    if (isset($_POST['contenu'], $_POST['titre'], $_POST['id']))
    {
        $contenu = $_POST['contenu'];
        $titre = $_POST['titre'];
     
        $req = $bdd->prepare('UPDATE news SET contenu = :contenu WHERE id = :id');
        $req->bindParam(':contenu', $contenu, PDO::PARAM_STR);
        $req->bindParam(':titre', $titre, PDO::PARAM_STR);
        $req->execute();
        $req->closeCursor();
    }
    ?>
    </body>
    </html>
    Mais avec ça le code ne fonctionne pas et j'ai cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe pr�s de ':id' � la ligne 1' in C:\Program Files (x86)\EasyPHP-5.3.8.0\www\projet\essai.php:23 Stack trace: #0 C:\Program Files (x86)\EasyPHP-5.3.8.0\www\projet\essai.php(23): PDO->query('SELECT titre, c...') #1 {main} thrown in C:\Program Files (x86)\EasyPHP-5.3.8.0\www\projet\essai.php on line 23

    J'ai essayé de tester l'affichage mais ça marche pas aussi!
    code affichage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    if (isset($_GET['id']) AND isset($_GET['titre']) AND isset($_GET['contenu']))
    {
      $reponse = $bdd->query('SELECT titre, contenu FROM news WHERE id = :id');
      while ($donnees = $reponse->fetch())
    {
    	echo $donnees['titre'];
    	echo $donnees['contenu'];
    }
    $reponse->closeCursor();
    }

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Bon moi j'ai choisis comme identificateur le 'titre' parce que j'ai pensé que c'est mieux puisque l'éditeur connait le titre et non pas l'id du titre dans la table.
    Ceci est un faut problème.
    Pour modifier une news, normalement tu dois avoir un formulaire qui édite cette news, entre autre le champ "contenu" pour permettre à l'utilisateur de rectifier le contenu en question.
    Donc un requête doit être fait pour récupérer cette new pour éditer le contenu.
    Et bien rien empêche de rajouter le champ "id" dans la requête de récupération de la news pour le mettre dans le formulaire dans un champ caché.
    Ce champ caché (non visible pour l'utilisateur) sera retourné lors de la validation du formulaire, tout comme le "contenu".
    Exemple (simple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <form ...etc...>
    <input type="hidden" name="id" value="<?php echo $donnees['id']; ?>" />
    <textarea name="contenu" rows="8" cols="45" id="contenu"><?php echo $donnees['contenu']; ?></textarea>
    <input type="submit" value="Valider" />
    </form>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $req = $bdd->prepare('UPDATE news SET contenu = :contenu WHERE id = :id');
    $req->bindParam(':contenu', $contenu, PDO::PARAM_STR);
    $req->bindParam(':titre', $titre, PDO::PARAM_STR);
    Attention aux erreurs d’inattentions.
    Faut bien comprendre qu'il doit à tout avoir une correspondance pour les noms utilisés (les :nom_parametre) entre le bindParam() et la requête.
    -> Même nom et même nombre de paramètres.
    Le paramètre :contenu correspond au :contenu dans la requête (le UPDATE), ici c'est bon.
    Mais le paramètre :titre dans le bondParam() ne se trouve pas dans la requête, c'est :id.
    Donc soit on utilise comme :id, soit :titre, cela des 2 cotés (bindParam/dans la requête.
    Vois tu le principe ?


    J'ai pensé que le mieux est de récupérer l'actualité à modifier tout d'abord, de l'afficher et puis la modifier
    Il serait mieux coté déroulement de :
    1/ de modifier la news (si c'est le cas)
    2/ de récupérer la new pour l'afficher

    Si on fait l'inverse (de récupérer en 1er) et s'il y a une modification à faire, lorsqu'on va récupérer la news son contenu ne contiendra pas la valeur du nouveau contenu car il sera effectif après son affichage, au moment du update.
    Vois tu le problème ?

    Les modifications (mise à jours, insertion suppressions) doivent être fait avant, sinon ça cause problème.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (isset($_GET['id']))
    {
      $reponse = $bdd->query('SELECT titre, contenu FROM news WHERE id = :id');
      while ($donnees = $reponse->fetch())
    {
    Une requête est faite, mais celle-ci attend un paramètre :id, mais on lui indique nulle part sa valeur, il n'y a pas de bindParam().
    C'est à peu près le même problème vu plus haut.

    Mais aussi, on effectue une boucle (while), et c'est $donnees qui contient les données de la news, mais à aucun moment $donnees est exploité.
    On fait : SI POST[titre] existe ALORS on affiche POST[titre]
    Mais il faudrait corriger par :
    SI POST[titre] existe ALORS on affiche POST[titre] SINON on affiche $donnees[titre].
    Ceci dit, faire une boucle est théoriquement inutile car vu qu'on récupère la news par son ID, un identifiant est unique, donc on obtiendra 1 news, une seule (au pire 0 news).



    A coté de ça, un autre aspect qui complique un peu les choses c'est que normalement il est bon de faire une redirection (un header) après toutes modifications (insert, update, delete).
    Mais une fois tout cela seraréglé on verra cela après, histoire d'éviter une embrouille.

  6. #6
    Membre éclairé Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Par défaut
    Merci pour l'attention que vous m'accordez, j'ai essayé de bien comprendre ce que vous m'avez dis, mais seulement je n'ai pas bien saisis le problème que ça causera le fait d'afficher puis modifier.
    En fait, j'ai voulu faire le même système qu'aux forums par exemple; lorsque je veux éditer mon commentaire je clique sur éditer, le contenu s'affiche, puis je modifie et j'enregistre.

    Concernant la redirection vers la page d'actualité, j'ai laissé pour mettre après la vérification que le code de mise à jour fonctionne bien sinon j'aurai toujours une redirection vers la page d'accueil)

    J'ai modifié le code en tenant compte de vos remarques, est il mieux formé maintenant?
    NB: le code m'affiche une page blanche (y'a pas ou écrire, c'est pourquoi j'ai pensé à afficher le contenu avant)

    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
    39
    40
    41
    42
    43
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>modifier actualité</title>
    </head>
    <body>
    <?php
    try
    {
    	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    	$bdd = new PDO('mysql:host=localhost;dbname=projet', 'root', '', $pdo_options);
    }
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
    ?>
    <b> Modification actualité </b>
    <?php
    // Modification du contenu
    if (isset($_GET['contenu'], $_GET['titre'], $_GET['id']))
    {
        $contenu = $_GET['contenu'];
        $id = $_GET['id'];
     
        $req = $bdd->prepare('UPDATE news SET contenu = :contenu WHERE id = :id');
        $req->bindParam(':contenu', $contenu, PDO::PARAM_STR);
        $req->bindParam(':id', $id, PDO::PARAM_STR);
        $req->execute();
        $req->closeCursor();
    // Affichage du contenu mise à jour	
      $reponse = $bdd->query('SELECT titre, contenu FROM news WHERE id = :id');
      while ($donnees = $reponse->fetch())
    {
    	echo $donnees['titre'];
    	echo $donnees['contenu'];
    }
    $reponse->closeCursor;
    }
    ?>
    </body>
    </html>

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

Discussions similaires

  1. journalisation des updates, inserts sur une table
    Par philou28 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/04/2007, 16h07
  2. VBA : modification d'une entrée dans une table
    Par Thibaut_Dupont dans le forum Access
    Réponses: 6
    Dernier message: 13/07/2006, 15h24
  3. Update sql, avec une table à deux colonnes ...
    Par dcz dans le forum Langage SQL
    Réponses: 8
    Dernier message: 04/04/2006, 18h06
  4. [MySQL] Supprimer la 1ère entrée d'une table
    Par micatmidog dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/09/2005, 00h58
  5. [Debutant] faire un update sur tout une table
    Par Karibou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2005, 14h44

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