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:
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:
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
Citation:
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.
Modification non prise en compte
Citation:
3- On peut alors traiter le formulaire de modification :
Code:
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:
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:
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:
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:
<?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.