PDO Liste déroulante : mise à jour valeur sélectionnée affichée

PARMGG
Messages postés
6
Date d'inscription
lundi 19 mai 2014
Statut
Membre
Dernière intervention
8 août 2015
- 6 août 2015 à 15:41
PARMGG
Messages postés
6
Date d'inscription
lundi 19 mai 2014
Statut
Membre
Derniè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
<form method="post" action=""> Entrez RBP ici puis 'Envoyer' (on modifierea après) : <br>
RBP : <input type="text" name="rbp" value="<?php print $rbp; ?>">
<?php echo '<span style="color: red">'.$message.'</span>' ?><br>
<input type="submit" name="submit" value="Envoyer ><br><br>


Merci pour votre aide très précieuse §

6 réponses

jordane45
Messages postés
35751
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 juin 2022
358
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).





Cordialement,
Jordane
1