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 :

Récupérer le résultat d'une requête pour la mettre dans une variable php [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Octobre 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Octobre 2019
    Messages : 10
    Par défaut Récupérer le résultat d'une requête pour la mettre dans une variable php
    Bonjour, débutant en php, je m'entraîne à faire une mini base de données avec une seule table (pour l'instant) qui recense une liste d'ingrédients.
    Je suppose que le problème que je vais vous exposer va vous paraître simple comme bonjour mais pour moi je galère depuis 2 semaines.
    La table a été créée via phpmyadmin et ne contient que 2 champs: id pour la clé primaire en auto increment et lib_ing pour le libellé de l'ingrédient.
    J'arrive à visualiser l'intégralité de mes ingrédients et y compris faire une recherche sur une partie d'un mot recherché via un formulaire ce qui est déjà un exploit pour moi. J'ai également réussi à faire que si l'ingrédient n'a pas été trouvé il propose de le rajouter.
    Maintenant ce que je n'arrive pas à faire c'est modifier le libellé d'un ingrédient.
    Je prends un exemple concret: j'ai fait une faute de frappe exprès pour pouvoir modifier le libellé d'un ingrédient. (en l'occurrence nous prendrons l'ingrédient chocolat que j'ai volontairement saisi en chocolya pour pouvoir permettre à l'utilisateur de le corriger).
    J'arrive dans mon phpmyadmin à récupérer la valeur id de ma clé primaire de l'ingrédient demandé (chocolya): il me trouve la valeur 5. C'est cette valeur que je voudrais récupérer en $_POST après le résultat de ma requête pour la passer dans mon update (situé sur une autre page php).
    Le problème est que sur mon code php, il me génère un message d'erreur dès la requête pour afficher cette valeur et j'ai beau chercher je ne trouve pas.
    Merci de votre aide.
    Voici les codes utilisés:
    Formulaire de recherche d'ingrédient à modifier.
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <form name="formodifing" action= "ingaafficher.php" method="post">
    Tapez le nom de l'ingrédient à modifier : 
    <input type = "text" name ="mding" />
    <input type = "submit" name="Id_ing" value = "Chercher"/>
    </form>

    Ingrédient à afficher
    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
    <?php
    session_start();
    $id = $_POST['mding'];
    try
    {
    $bdr= new PDO('mysql:host=localhost;dbname=recettes;charset=utf8', 'root', '');
    }
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
    $sql="SELECT id from ingredients where lib_ing=$id";
    $reponse=$bdr->exec($sql);
    while ($donnees = $reponse->fetch())
    {
    	echo "$donnees[id]";
    }
    echo "<br>";
     
    ?>
    et l'erreur qu'il m'affiche lorsque j'appelle le fichier ingafficher.php
    Fatal error: Call to a member function fetch() on boolean in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\test\ingaafficher.php on line 14
    Pour information, j'ai même testé ma variable mding qui me trouve bien la valeur que j'ai saisi précédemment donc le problème ne vient pas de mding.
    Merci de me dire où j'ai effectué l'erreur car je ne vois pas où elle est et après comment je pourrais sauvegarder cette donnée dans une variable $_POST.
    Cordialement,
    Christophe.

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 502
    Par défaut
    Bonjour,
    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
     
            session_start();
            $id = $_POST['mding'];
            try {
                $bdr = new PDO('mysql:host=localhost;dbname=recettes;charset=utf8', 'root', '');
            } catch (Exception $e) {
                die('Erreur : ' . $e->getMessage());
            }
            $sql = 'SELECT id from ingredients where lib_ing = ?';
     
            $r = $bdr->prepare($sql);
            $r->execute([$id]);
            $t = $r->fetch(\PDO::FETCH_OBJ);
    //        $reponse = $bdr->exec($sql);
    //        while ($donnees = $reponse->fetch()) {
    //            echo "$donnees[id]";
    //        }
            echo $t->id;
            echo "<br>";
    Au revoir

  3. #3
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 496
    Par défaut
    Salut,

    tu veux modifier une ligne identifiée par une chaîne de caractère ? et si jamais il y a plusieurs "chocolya" dans la table ?

  4. #4
    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
    Autre possibilité : et si il y a déjà un "chocolat" ? est-ce que ton chocolya corrigé ne va pas devenir un doublon ?
    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]

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour, et bienvenu sur DVP ,

    En réalité, c'est ta méthode qui n'est pas la meilleure.

    ...J'arrive à visualiser l'intégralité de mes ingrédients...
    Dans une <table> ?


    1- Donc, dans cette <table>, tu peux ajouter une colonne "Modifier", avec dedans un formulaire, qui va permettre de récupérer l'id de la ligne (dans un champ caché) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <td>
       <form action="ingaafficher.php" method="post">
    	<input type="hidden" name="id_ing" value="<?php echo $row->id; ?>" />
    	<button type="submit" name="btn_modifier_form" title="Modifier">Mod.</button>
       </form>
    </td>
    N.B. Pourquoi ?
    Parce que l'id (auto-incrément) est forcément UNIQUE.

    2- En cliquant sur ce bouton, on affiche le formulaire de MODIFICATION de cette ligne :
    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
    <?php
    // -------------
    // AFFICHER le formulaire de Modification
    if( isset($_POST['btn_modifier_form']) )
    {
       // ICI, on fait la requête en BDD, pour récupérer les autres colonnes
            $sql_select = "SELECT * FROM ingredients WHERE id = ?";
            $res_select = $bdr->prepare($sql_select);
            $res_select->execute([$_POST['id_ing']]);
            $row = $res_select->fetch(PDO::FETCH_OBJ);
    ?>
       <form action="ingaafficher.php" method="post">
    	<input type="hidden" name="id_ing" value="<?php echo $row->id; ?>" />
    	<input type="text" name="lib_ing" value="<?php echo $row->lib_ing; ?>" />
    	<button type="submit" name="btn_modifier_valider" title="Modifier">Modifier</button>
       </form>
    N.B. Quand tu auras plusieurs colonnes dans ta table, ce sera exactement le même principe.

    3- On peut alors traiter le formulaire de modification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    // -------------
    // TRAITER le formulaire de Modification
    if( isset($_POST['btn_modifier_valider']) )
    {
       // ICI, on fait la requête UPDATE
            $sql_update = "UPDATE ingredients SET 
                    lib_ing = ?
                    WHERE id = ?";
            $res_update = $bdr->prepare($sql_update);
            $res_update->execute([$_POST['id_ing'], $_POST['lib_ing']]);
    ?>

  6. #6
    Membre averti
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Octobre 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Octobre 2019
    Messages : 10
    Par défaut Modification non prise en compte

    3- On peut alors traiter le formulaire de modification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    // -------------
    // TRAITER le formulaire de Modification
    if( isset($_POST['btn_modifier_valider']) )
    {
       // ICI, on fait la requête UPDATE
            $sql_update = "UPDATE ingredients SET 
                    lib_ing = ?
                    WHERE id = ?";
            $res_update = $bdr->prepare($sql_update);
            $res_update->execute([$_POST['id_ing'], $_POST['lib_ing']]);
    ?>
    Bonjour, tout d'abord un grand merci pour tes explications. J'ai parfaitement compris ce que tu m'as dit et je pense avoir fait les choses correctement mais malgré ce l'enregistrement ne se modifie pas malgré aucun message d'erreur. Il y a donc forcément une erreur de ma part car je n'oserais mettre en doute tes compétences.
    tout d'abord une petite remarque: cela fait deux fois que l'on me propose une notation qui ne fonctionne pas : exemple: echo $row->id;Mon php ne le comprend pas. Serait ce parce que j'utilise une version 5.6 de php?
    Pour information, j'ai transformé cette ligne en echo $row['id']; et ça fonctionne.
    En revanche, pour le libellé j'ai mis echo $row['lib_ing']; et rien ne s'affiche dans le champ à modifier mais je me dis que c'est juste un petit problème d'affichage.
    Lorsque je clique sur le bouton modifier (btn_modifier_valider), il me met un echo comme quoi l'ingrédient a bien été modifié en ce que je veux (chocolat pour reprendre l'exemple) mais quand je visualise à nouveau ma base, l'ingrédient n'a pas été modifié.

    Voici le nouveau code.
    Et encore merci pour toutes ces explications.

    rechercheing.php
    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
    57
    <?php
    $id=$_POST['Id_ing'];
    try
    {
    $bdr= new PDO('mysql:host=localhost;dbname=recettes;charset=utf8', 'root', '');
    }
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
    $requete = $bdr->prepare('SELECT * from ingredients where lib_ing LIKE ?');
    $requete->execute(array("$id%"));
     
    $nbresult = $requete->rowcount();
    echo '<br>';
    if ($nbresult == 0) {
    	echo "ingrédient non trouvé. Voulez-vous rajouter cet ingrédient à la liste?";
    	?>
    <form name = "ajout_ing" method= "post" action= "ajout_ing.php">
    <input type = "submit"  value = "Oui" name ="valid"/>
    </form>
    <form name = "retour" method= "post" action= "index.php">
    <input type = "submit" value = "Non" />
     
    <?php	
    }
    else 
    {	
    while($donnees = $requete->fetch())
    {
    ?>
    <table border = 1>
    <th>
    identifiant
    </th>
    <th>
    nom de l'ingrédient
    </th>
    <tr>
    <td>
    <?php echo $donnees['id']; ?>
    </td>
    <td>
    <?php echo $donnees['lib_ing']; ?>
    </td>
    <td>
       <form action="ingaafficher.php" method="post">
    	<input type="hidden" name="id_ing" value="<?php echo $row->id; ?>" />
    	<button type="submit" name="btn_modifier_form" title="Modifier">Modifier</button>
       </form>
    </td>
    </tr>
    </table>
    <?php
    }
    }
    ?>
    ingafficher.php
    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
    // -------------
    // AFFICHER le formulaire de Modification
     
    try
    {
    $bdr= new PDO('mysql:host=localhost;dbname=recettes;charset=utf8', 'root', '');
    }
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
     
    if( isset($_POST['btn_modifier_form']) )
    {
       // ICI, on fait la requête en BDD, pour récupérer les autres colonnes
            $sql_select = "SELECT * FROM ingredients WHERE id = ?";
            $res_select = $bdr->prepare($sql_select);
            $res_select->execute([$_POST['id_ing']]);
            $row = $res_select->fetch(PDO::FETCH_OBJ);
     
    ?>
       <form action="formodifing.php" method="post">
    	<input type="hidden" name="id_ing" value="<?php echo $row['id'];      ?>" />
    	<label> nouveau nom de l'ingrédient </label>
    	<input type="text" name="lib_ing"  value="<?php echo $row['lib_ing']; ?>" />
    	<button type="submit" name="btn_modifier_valider" title="Modifier">Modifier</button>
       </form>
     
       <?php
    }
    ?>
    formmodifing.php
    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
    $ingmod=$_POST['lib_ing'];
    try
    {
    $bdr= new PDO('mysql:host=localhost;dbname=recettes;charset=utf8', 'root', '');
    }
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
     
    // -------------
    // TRAITER le formulaire de Modification
    if( isset($_POST['btn_modifier_valider']) )
    {
       // ICI, on fait la requête UPDATE
            $sql_update = "UPDATE ingredients SET 
                    lib_ing = ?
                    WHERE id = ?";
            $res_update = $bdr->prepare($sql_update);
            $res_update->execute([$_POST['id_ing'], $_POST['lib_ing']]);
    echo "l'ingrédient a été modifié avec succès en $ingmod";
    }
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $donnees['id']; ?>
    // pour l'instant cette donnée reste affichée pour bien être sûr que ce soit la bonne entrée à modifier mais elle disparaîtra une fois que je serai sûr de mon coup.
    J'espère que j'ai été clair dans mes explications.

    Cordialement.

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

    1-
    Citation Envoyé par Scrat1974 Voir le message
    ...Il y a donc forcément une erreur de ma part...
    PERDU !
    Mea culpa !
    ARGHH ! j'ai mis les données dans le MAUVAIS ordre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            $res_update->execute([$_POST['id_ing'], $_POST['lib_ing']]);
    Il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            $res_update->execute([$_POST['lib_ing'], $_POST['id_ing']]);
    C'est le problème avec les placeholders anonymes ("?") : il faut mettre les données (dans l'array) dans le MEME ordre que dans la requête SQL.

    C'est pourquoi JE PRÉFÈRE les placeholder nommés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       // ICI, on fait la requête UPDATE
            $sql_update = "UPDATE ingredients SET 
                    lib_ing = :lib_ing
                    WHERE id = :id_ing";
            $res_update = $bdr->prepare($sql_update);
            $res_update->execute([
                    ':lib_ing' => $_POST['lib_ing'], 
                    ':id_ing' => $_POST['id_ing']
            ]);
    Avec les placeholders nommés, l'ordre des données (dans l'array) n'a plus d'importance.

    2-
    ... cela fait deux fois que l'on me propose une notation qui ne fonctionne pas : exemple: echo $row->id;...
    echo $row->id; : cette notation suppose que les données ont été récupérée de la BDD avec :

    PDO::FETCH_OBJ : retourne un objet anonyme avec les noms de propriétés qui correspondent aux noms des colonnes retournés dans le jeu de résultats
    Le mode par défaut est PDO::FETCH_BOTH :

    On obtient alors la donnée avec echo $row['id'];.
    Dernière modification par rawsrc ; 15/11/2019 à 17h46.

  8. #8
    Membre averti
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Octobre 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Octobre 2019
    Messages : 10
    Par défaut Merci!!!!
    Merci à tous pour tous vos conseils précieux!! j'ai enfin compris beaucoup de choses. Je suis en effet autodidacte pour le php et j'avoue que j'apprends en dilettante pendant mes heures de travail d'où le fait que je ne réponds pas rapidement (deux fois que je demande la formation php au boulot et pour l'instant il n'y a pas de place mais je ne désespère pas lol).
    J'ai modifié mon code pour intégrer la notation $variable->valeur çà marche nickel.
    Je galère un peu pour faire le formulaire de suppression mais je pense savoir pourquoi. En tout cas merci encore pour tous ces précieux renseignements.
    Je n'hésiterai pas à revenir vers vous si jamais je coince mais je vais arrêter de vous embêter avec mes questions pour l'instant.
    Je clos ce sujet.
    Encore merci à tous.
    Cordialement,
    Christophe.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/09/2016, 08h58
  2. Récupérer le résultat d'une variable dans un tableau (VBA)
    Par fredplusvar dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/03/2014, 18h25
  3. Réponses: 2
    Dernier message: 31/07/2013, 14h53
  4. [Spip] Récupérer la valeur d'une variable PHP dans une boucle Spip
    Par papisdoums dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 10/04/2009, 19h03
  5. [PHP 5.0] Récupérer la valeur d'une variable php dans du code javascript
    Par HF974 dans le forum Langage
    Réponses: 4
    Dernier message: 08/03/2009, 11h46

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