PDO Liste déroulante : mise à jour valeur sélectionnée affichée
PARMGG
Messages postés6Date d'inscriptionlundi 19 mai 2014StatutMembreDernière intervention 8 août 2015
-
6 août 2015 à 15:41
PARMGG
Messages postés6Date d'inscriptionlundi 19 mai 2014StatutMembreDernière intervention 8 août 2015
-
8 août 2015 à 18:06
Bonjour et tout d'abord MERCI à tous les bénévoles du net et à jordane45 qui m'ont permis de progresser de façon autodidacte.
Depuis un mois, je recherche une solution dans tous les sens, en vain pendant des heures. C'est pourquoi, je sollicite votre aide précieuse pour trouver une solution et comprendre la raison de la non mise à jour des données.
Le problème : J'ai constitué une base SQL dbbase avec la table « trbp : id_rbp - rbp - id_programme »
Cherchant à constituer une liste déroulante permettant d'afficher une valeur « rbp : 'Try 1', 'Try 2', 'Try 3', 'Try 4'), j'ai réussi à afficher la liste déroulante avec les valeurs et les données à modifier, mais, je ne les mettre à jour.
Voici mon code :
1/ Base SQL -- --------------------------------------------------------
--
-- Structure de la table `trbp2`
--
CREATE TABLE `trbp2` (
`id_rbp` INT (2) auto_increment,
`rbp` varchar(255) default '',
`id_programme` varchar (2) default '',
PRIMARY KEY (`id_rbp`)
);
--
-- Contenu de la table `trbp2`
--
INSERT INTO `trbp2` VALUES ('1', 'Try 1', '4');
INSERT INTO `trbp2` VALUES ('2', 'Try 2', '2');
INSERT INTO `trbp2` VALUES ('3', 'Try 3', '7');
INSERT INTO `trbp2` VALUES ('4', 'Try 4', '3');
-- --------------------------------------------------------
2/ index.php
<!DOCTYPE html> <html> <meta charset="utf-8" /> <head> <title>RBP Affiche et Modifie sur liste déroulante</title> </head> <body>
<h2>Modification de la liste RBP</h2> <p>Sélectionner intitulé RBP</p> <p>=>Formulaire 1 :</p> <form name="affiche" action="" method="POST"> <?php // pour faire un menu déroulant présenter les différentes rubriques echo "<select name='rbp' onChange='FocusObjet()'>"; try { $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false; //important sur les configs récentes $pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8"; //pour l'utf-8 $pdo_options[PDO::MYSQL_ATTR_USE_BUFFERED_QUERY] = true; $bdd = new PDO('mysql:host=localhost;dbname=dbbase', 'root', '', $pdo_options); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } $reponse = $bdd->query('SELECT DISTINCT rbp FROM trbp'); echo "<OPTION SELECTED VALUE='RBP à sélectionner'>RBP</OPTION>"; while ($donnees = $reponse->fetch()) { $rbp = (string)$donnees['rbp']; echo "<OPTION VALUE='$rbp'> $rbp </OPTION>\n"; } echo "</select>"; ?> <table width="300" border="0"> <tr> <td><input type="reset" value="Effacer" style="position:relative;left:10"></td> <td><input type="submit" value="Afficher les données RBP" style="position:relative;left:10"></td> </tr> </table> </form> <?php /* Connexion à la base de données */ include("connexion.inc.php"); // On récupère tout le contenu de la table trbp (de dbbase où l'on s'est connecté) // Les valeurs utilisées dans la requête sont marqués avec le ? espace réservé $reponse = $dbh->prepare('SELECT * FROM trbp WHERE rbp = ?'); // Exécuter la requête. Passez à l'un tableau énumérant les valeurs à utiliser dans la requête $reponse->execute(array($_POST['rbp'])); // Obtenir les résultats $results = $reponse->fetchAll(); foreach ($results as $row) { print '<p><b>Voici l\'enregistrement à modifier :</b><br/>RBP : '.$row['rbp'].' <br />Id RBP :'.$row ['id_rbp'].'<br />Programme : '.$row['id_programme'].'</p>'; } ?>
<p>=>Formulaire 2 :</p> <form name="update" action="" method="POST"> <?php $message = ''; // fonctionne si supprimé $id_rbp = ''; // fonctionne si supprimé $rbp = ''; // fonctionne si supprimé $id_programme = ''; // fonctionne si supprimé
// La page d'insertion if ( isset( $_POST['rbp'])) {
/* Connexion à la base de données avec PDO */ include("connexion.inc.php"); // fonctionne si supprimé $rbp = $_POST['rbp'];
/* "SELECT" étoile => On sélectionne tous les champs "FROM" de la table rbp */ $sql = "SELECT * FROM trbp"; $resultat = $dbh->query($sql); /* echo : Liste des enregistrements*/ while ($row = $resultat->fetch(PDO::FETCH_ASSOC)) { If ($row['rbp'] == $rbp) /* Si vrai on exécute ce qui se trouve entre les crochets */ { $id_rbp = $row['id_rbp']; $rbp = $row['rbp']; $id_programme = $row['id_programme']; }} /* echo $id_programme and UPDATE */ if ( isset( $_POST['id_programme'] )) { if ( $_POST['id_programme'] != '') { $id_programme = $_POST['id_programme']; // Avec une requête préparée $req = $dbh->prepare('UPDATE trbp SET id_programme = :id_programme WHERE rbp = :rbp'); $req->execute(array('rbp' => $rbp,'id_programme' => $id_programme)); }} // Fermeture de la connexion $dbh = NULL; }else{ $message = '<span style="color: red"> => Sélectionner un RBP</span>'; } if ( $rbp != '' ) { $message = '<span style="color: red"> Intitulé RBP sélectionné :</span>'; } ?> <p>=>Repère 3 :</p> <p><?php echo '<span style="color: red">'.$message.'</span>' ?><br><?php print $rbp; ?></p> <p><b>Entrez les nouvelles données ci-dessous, puis cliquez sur 'Modifier' :</b></p> <p>Modifiez id_programme : <input type="text" name="id_programme" row="3" size="3" maxlength="3" value="<?php print $id_programme; ?>"> puis cliquez sur 'Modifier'</p> <table width="300" border="0"> <tr> <td><input type="reset" value="Annuler" style="position:relative;left:10"name="Lien_index" onclick="self.location.href='../after/index.php'"></td> <td><input type="submit" value="Modifier les données du RBP" style="position:relative;left:10"></td> </tr> </table> </form> </body> </html>
Si je remplace le début du repère 3 en supprimant tout le début, jusqu'au formulaire, cela fonctionne, mais je n'ai plus de liste déroulante. Comment faire fonctionner UDAPTE avec une liste déroulante
jordane45
Messages postés37718Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention22 septembre 2023342 Modifié par jordane45 le 6/08/2015 à 20:54
Et puis .. ce bout de code :
/* echo $id_programme and UPDATE */
if ( isset( $_POST['id_programme'] )) {
if ( $_POST['id_programme'] != '') {
$id_programme = $_POST['id_programme'];
// Avec une requête préparée
$req = $dbh->prepare('UPDATE trbp SET id_programme = :id_programme WHERE rbp = :rbp');
$req->execute(array('rbp' => $rbp,'id_programme' => $id_programme));
}}
peut être réécrit plus proprement comme ceci :
(tu noteras que je récupères AVANT de les utiliser... les variables provenant de $_POST )
// Récupération 'propre' de la variable AVANT de l'utiliser
$rbp = !empty($_POST['rbp']) ? $_POST['rbp'] : NULL;
$id_programme = !empty($_POST['id_programme']) ? $_POST['id_programme'] : NULL;
if( $rbp && $id_programme) {
// Avec une requête préparée
$sql = "UPDATE trbp
SET id_programme = :id_programme
WHERE rbp = :rbp";
$params = array( ':rbp' => $rbp
,':id_programme' => $id_programme
);
try{
$req = $dbh->prepare($sql);
$req->execute($params);
}catch (Exception $e){
echo "<br>Erreur : " . $e->getMessage());
echo "<br> Requete :".$sql;
echo "<br> Params :<br>";
print_r($params);
}
}
>>> Et tu peux le placer à la suite du code PHP que je t'ai donné précédemment.. avant ton html.
==>> Dis toi que dans la partie "html" de ton code... tu ne dois y mettre que de l'affichage ... tout ce qui est du "traitement" comme les INSERT/ UPDATE... doivent se faire (surtout pour des raisons de clarté du code....) tout en haut de ta page... (comme je l'ai fait dans le code que je t'ai donné tout à l'heure).
jordane45
Messages postés37718Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention22 septembre 2023342 6 août 2015 à 18:16
Bonjour,
Avant de t'aider .. il va falloir que tu fasses un peu de ménage dans ton code....
Déjà .. pourquoi as tu x fois la connexion à ta BDD ?
Une seule en début de page suffit !
Et pour se faire .. le code
include("connexion.inc.php");
est là pour ça .... pas besoin de remettre un bloc de connexion en plus !
..... ce code fait doublons avec le contenu de ton fichier connexion.inc.php je pense.
Ensuite... essayes de nous reposter un code avec de l'indentation... là ... ce n'est pas lisible.
jordane45
Messages postés37718Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention22 septembre 2023342 Modifié par jordane45 le 6/08/2015 à 18:19
Voici par exemple .. à quoi pourrait ressembler le début de ton code
<?php
//-----------------------------------------------------------------------------------//
//Connexion à la BDD :
//-----------------------------------------------------------------------------------//
/* Connexion à la base de données */
require_once("connexion.inc.php");
//-----------------------------------------------------------------------------------//
//Récupération des éléments de la liste :
try{
$sql = "SELECT DISTINCT rbp FROM trbp";
$prepare = $bdd->prepare($sql);
$prepare->execute();
//on stocke le résultat de la requête dans un array
$arrListe = $prepare->fetchall();
} catch (Exception $e){
die('Erreur : ' . $e->getMessage());
}
?>
<!DOCTYPE html>
<html>
<meta charset="utf-8" />
<head>
<title>RBP Affiche et Modifie sur liste déroulante</title>
</head>
<body>
<h2>Modification de la liste RBP</h2>
<p>Sélectionner intitulé RBP</p>
<p>=>Formulaire 1 :</p>
<form name="affiche" action="" method="POST">
<?php
// pour faire un menu déroulant présenter les différentes rubriques
echo "<select name='rbp' onChange='FocusObjet()'>";
echo "<OPTION SELECTED VALUE='RBP à sélectionner'>RBP</OPTION>";
foreach($arrListe as $L) {
$rbp = $L['rbp'];
echo "<OPTION VALUE='$rbp'> $rbp </OPTION>\n";
}
echo "</select>";
?>
<table width="300" border="0">
<tr>
<td><input type="reset" value="Effacer" style="position:relative;left:10"></td>
<td><input type="submit" value="Afficher les données RBP" style="position:relative;left:10"></td>
</tr>
</table>
</form>
PARMGG
Messages postés6Date d'inscriptionlundi 19 mai 2014StatutMembreDernière intervention 8 août 2015
>
jordane45
Messages postés37718Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention22 septembre 2023 6 août 2015 à 19:20
Merci Jordane pour ta réponse rapide.
Le code marche parfaitement comme tu le dis alors qu'auparavant la liste déroulante ne fonctionnait pas avec "connexion.inc.php" (que j'ai supprimé tant tout le reste du texte : cela me servait de repère, car il était indiqué ("connexion OK à l'endroit concerné). Félicitations !!!!
En revanche, je n'arrive pas à comprendre pourquoi UPDATE ne fonctionne pas :
$req = $dbh->prepare('UPDATE trbp SET id_programme = :id_programme WHERE rbp = :rbp'); $req->execute(array('rbp' => $rbp,'id_programme' => $id_programme)); }}$id_programme));
Cela me semble bien étrange.
Encore merci !
jordane45
Messages postés37718Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention22 septembre 2023342 6 août 2015 à 19:56
D'où vient cette variable $dbh ?
Ne serait ce pas plutôt $bdd ?
PARMGG
Messages postés6Date d'inscriptionlundi 19 mai 2014StatutMembreDernière intervention 8 août 2015 7 août 2015 à 12:09
Bonjour et merci Jordanne !
Cela fonctionne à merveille.
Mon seul problème maintenant est que la valeur à modifier ne s'affiche plus dans la case input value="<?php print $id_programme; ?>.
Voici le code modifié :
<?php //-----------------------------------------------------------------------------------// //Connexion à la BDD : //-----------------------------------------------------------------------------------// /* Connexion à la base de données */ require_once("connexion.inc.php"); //-----------------------------------------------------------------------------------// //Récupération des éléments de la liste : try{ //$sql = "SELECT DISTINCT rbp FROM trbp"; $sql = "SELECT * FROM trbp"; $prepare = $dbh->prepare($sql); $prepare->execute(); //on stocke le résultat de la requête dans un array $arrListe = $prepare->fetchall(); } catch (Exception $e){ die('Erreur : ' . $e->getMessage()); } ?> <!DOCTYPE html> <html> <meta charset="utf-8" /> <head> <title>RBP Affiche et Modifie sur liste déroulante</title> </head> <body>
<h2>Modification de la liste RBP</h2> <p>Sélectionner intitulé RBP</p> <p>=>Formulaire 1 :</p> <form name="affiche" action="" method="POST"> <?php // pour faire un menu déroulant présenter les différentes rubriques echo "<select name='rbp' onChange='FocusObjet()'>"; echo "<OPTION SELECTED VALUE='Selection RBP'>Sélectionner un RBP</OPTION>"; foreach($arrListe as $L) { $rbp = $L['rbp']; echo "<OPTION VALUE='$rbp'> $rbp </OPTION>\n"; } echo "</select>"; // La valeur utilisée dans la requête est marquée avec le ? espace réservé $reponse = $dbh->prepare('SELECT * FROM trbp WHERE rbp = ?'); // Exécuter la requête. Passez à l'un tableau énumérant les valeurs à utiliser dans la requête $reponse->execute(array($_POST['rbp'])); // Obtenir les résultats $results = $reponse->fetchAll(); foreach ($results as $row) { print '<p><b>Voici l\'enregistrement à modifier :</b><br/>RBP : '. $row['rbp'].' <br />Id RBP : '.$row['id_rbp']. ' <br />Programme : '.$row['id_programme'].'</p>'; } if ( isset( $_POST['rbp'])) { $rbp = $_POST['rbp'];
// Récupération de la variable AVANT de l'utiliser $rbp = !empty($_POST['rbp']) ? $_POST['rbp'] : NULL; $id_programme = !empty($_POST['id_programme']) ? $_POST['id_programme'] : NULL; if( $rbp && $id_programme) {
// Avec une requête préparée OK $sql = "UPDATE trbp SET id_programme = :id_programme WHERE rbp = :rbp"; $params = array( ':rbp' => $rbp ,':id_programme' => $id_programme ); $req = $dbh->prepare($sql); $req->execute($params); }
// Fermeture de la connexion $dbh = NULL; } ?> <p><b>Entrez les nouvelles données ci-dessous, puis cliquez sur 'Modifier' :</b></p> <p>Modifiez id_programme : <input type="text" name="id_programme" row="3" size="3" maxlength="3" value="<?php print $id_programme; ?>"> puis cliquez sur 'Modifier'</p> <table width="300" border="0"> <tr> <td><input type="reset" value="Annuler" style="position:relative;left:10"name="Lien_index" onclick="self.location.href='index.php'"></td> <td><input type="submit" value="Modifier les données du RBP" style="position:relative;left:10"></td> </tr> </table> </form> </body> </html>
jordane45
Messages postés37718Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention22 septembre 2023342 7 août 2015 à 16:34
Essayes ça :
<?php
// Affichage des erreurs PHP le temps des tests
error_reporting(E_ALL);
//-----------------------------------------------------------------------------------//
//Connexion à la BDD :
//-----------------------------------------------------------------------------------//
/* Connexion à la base de données */
require_once("connexion.inc.php");
//-----------------------------------------------------------------------------------------------------//
// Fonctions (que tu peux placer dans un fichier externe que tu n'auras qu'à inclure au besoin...)
//-----------------------------------------------------------------------------------------------------//
/**
*Pour les requêtes de type SELECT
* --> Retourne le résultat sous forme d'array.
*/
function querySelect($sql,$params=NULL){
global $dbh; // pour la cnx à la BDD
$result = array();
try{
$prepare = $dbh->prepare($sql);
$prepare->execute($params);
//on stocke le résultat de la requête dans un array
$result = $prepare->fetchall();
} catch (Exception $e){
die('Erreur : ' . $e->getMessage());
}
return $result;
}
/**
* Pour les requêtes de types DELETE / UPDATE / INSERT
*/
function queryExec($sql,$params=NULL){
global $dbh;
try{
$prepare = $dbh->prepare($sql);
$result = $prepare->execute($params);
} catch (Exception $e){
die('Erreur : ' . $e->getMessage());
}
return $result;
}
//------------------------------------------------------------------------------------//
// Récupération de la variable AVANT de l'utiliser
//------------------------------------------------------------------------------------//
$rbp = !empty($_POST['rbp']) ? $_POST['rbp'] : NULL;
$id_programme = !empty($_POST['id_programme']) ? $_POST['id_programme'] : NULL;
//------------------------------------------------------------------------------------//
//Récupération des éléments de la liste :
//------------------------------------------------------------------------------------//
$sql = "SELECT * FROM trbp";
$arrListe = querySelect($sql);
// Obtenir les résultats correspondant à $_POST('rbp']
if($rbp){
$sql = "SELECT * FROM trbp WHERE rbp = :rbp";
$params = array(":rbp"=>$rbp);
$ListeRbp = querySelect($sql,$params);
}
?>
<!DOCTYPE html>
<html>
<meta charset="utf-8" />
<head>
<title>RBP Affiche et Modifie sur liste déroulante</title>
</head>
<body>
<h2>Modification de la liste RBP</h2>
<p>Sélectionner intitulé RBP</p>
<p>=>Formulaire 1 :</p>
<form name="affiche" action="" method="POST">
<?php
// pour faire un menu déroulant présenter les différentes rubriques
echo "<select name='rbp' onChange='FocusObjet()'>";
echo "<OPTION SELECTED VALUE='Selection RBP'>Sélectionner un RBP</OPTION>";
foreach($arrListe as $L) {
$rbp = $L['rbp'];
echo "<OPTION VALUE='$rbp'> $rbp </OPTION>\n";
}
echo "</select>";
// Informations sur l'élément à modifier :
foreach ($ListeRbp as $row) {
print '<p><b>Voici l\'enregistrement à modifier :</b><br/>RBP : '. $row['rbp'].' <br />Id RBP : '.$row['id_rbp']. ' <br />Programme : '.$row['id_programme'].'</p>';
}
//MISE A JOUR DE TRBP
if( $rbp && $id_programme) {
// Avec une requête préparée OK
$sql = "UPDATE trbp SET id_programme = :id_programme WHERE rbp = :rbp";
$params = array( ':rbp' => $rbp ,':id_programme' => $id_programme );
$update = queryExec($sql,$params);
}
// Fermeture de la connexion
$dbh = NULL;
}
?>
<p><b>Entrez les nouvelles données ci-dessous, puis cliquez sur 'Modifier' :</b></p>
<p>Modifiez id_programme : <input type="text" name="id_programme" row="3" size="3" maxlength="3" value="<?php echo $id_programme; ?>"> puis cliquez sur 'Modifier'</p>
<table width="300" border="0">
<tr>
<td><input type="reset" value="Annuler" style="position:relative;left:10"name="Lien_index" onclick="self.location.href='index.php'"></td>
<td><input type="submit" value="Modifier les données du RBP" style="position:relative;left:10"></td>
</tr>
</table>
</form>
</body>
</html>
Vous n’avez pas trouvé la réponse que vous recherchez ?
PARMGG
Messages postés6Date d'inscriptionlundi 19 mai 2014StatutMembreDernière intervention 8 août 2015 7 août 2015 à 21:51
Bonsoir Jordanne,
Merci pour la proposition. Elle s'apparente à un code que j'avais essayé de faire avec des fonctions...
Cependant, je tombe toujours sur la même erreur :
« Undefined" variable: ListeRbp in / [...] index.php on line 81 » c'est à dire la ligne:
// Informations sur l'élément à modifier : foreach ($ListeRbp as $row) {
Les valeurs ne se modifient plus
et la valeur initiale à modifier ne s'affiche plus...
C'est pourquoi, j'étais revenu à une solution plus "basique" (bien que mal codée) à partir de ce qui fonctionnait sans liste déroulante(mais mon but est de faire le code avec une liste déroulante).
Durant mon mois de vacances, j'ai tout essayé et ne comprends toujours pas l'erreur.
Reprenant mon travail, je ne reviendrai sur le sujet qu'en fin de semaine prochaine.
Merci pour ton aide et bien cordialement.
PARMGG
Messages postés6Date d'inscriptionlundi 19 mai 2014StatutMembreDernière intervention 8 août 2015 8 août 2015 à 18:06
Bonjour Jordane,
Grâce à ton aide, j'ai avancé sur le sujet.
Le code ci-dessous fonctionne très bien.
Cependant, je suis obligé de cliquer à nouveau sur la liste déroulante pour modifier l'id-programme.
Comment éviter de sélectionner à nouveau la liste déroulante pour le modifier ?
<?php /* Connexion à la base de données */ require_once("connexion.inc.php"); //Récupération des éléments de la liste : try{ //$sql = "SELECT DISTINCT rbp FROM trbp"; $sql = "SELECT * FROM trbp"; $prepare = $dbh->prepare($sql); $prepare->execute(); //on stocke le résultat de la requête dans un array $arrListe = $prepare->fetchall(); } catch (Exception $e){ die('Erreur : ' . $e->getMessage()); } ?> <!DOCTYPE html> <html> <meta charset="utf-8" /> <head> <title>RBP Affiche et Modifie sur liste déroulante</title> </head> <body>
<h2>Modification de la liste RBP</h2> <p>Sélectionner intitulé RBP</p>
<form name="update" action="" method="POST"> <?php // pour faire un menu déroulant présenter les différentes rubriques echo "<select name='rbp' onChange='FocusObjet()'>"; echo "<OPTION SELECTED VALUE='Selection RBP'>Sélectionner un RBP</OPTION>"; foreach($arrListe as $L) { $rbp = $L['rbp']; echo "<OPTION VALUE='$rbp'> $rbp </OPTION>\n"; } echo "</select>"; // La valeur utilisée dans la requête est marquée avec le ? espace réservé $reponse = $dbh->prepare('SELECT * FROM trbp WHERE rbp = ?'); // Exécuter la requête. Passez à l'un tableau énumérant les valeurs à utiliser dans la requête $reponse->execute(array($_POST['rbp'])); // Obtenir les résultats $results = $reponse->fetchAll(); foreach ($results as $row) { print '<p><b>Voici l\'enregistrement à modifier :</b><br/> RBP : '. $row['rbp'].' <br />Id RBP : '.$row['id_rbp']. ' <br />Programme : <input type="text" name="id_programme" row="3" size="3" maxlength="3" value="'.$row['id_programme'].'"><br />Sélectionner à nouveau le RBP, puis entrer des nouvelles données dans la case ci-dessus, cliquez enfin sur OK pour valider la modification</p>'; } if ( isset( $_POST['rbp'])) { $rbp = $_POST['rbp']; // Récupération 'propre' de la variable AVANT de l'utiliser A VOIR $rbp = !empty($_POST['rbp']) ? $_POST['rbp'] : NULL; $id_programme = !empty($_POST['id_programme']) ? $_POST['id_programme'] : NULL; if( $rbp && $id_programme) {