Comment insérer dans une table Mysql les valeurs affichées de deux listes déroulantes liées

Petit nouveau ! | 5 Messages

01 nov. 2022, 02:49

Bonjour,
Je veux insérer dans une table les deux valeurs liées qui s'affichent suite à la sélection de l'une.
A l'aide du code ci-dessous, lorsque je soumets mon formulaire, seule l'id s'insère dans la colonne id, les colonnes region et department affichent NULL , alors que je veux qu'il soit insérer la région et le département correspondant. Après plusieurs tentatives vaines, je vous remercie d'avance pour votre précieuse expertise!

Code : Tout sélectionner

<?php include(connex.php); if(isset($_POST['ok'])&&($_POST["region"])&&($_POST["department"])&&!empty($_POST["region"])&&!empty($_POST["department"])){ try{ // Connexion au serveur $dbco = new PDO("mysql:host=$serveur;dbname=$base",$user,$mdp); $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //Ajout de la valeur dans la table $sth = $dbco->prepare("INSERT INTO resume_region(region,department) VALUES(:region,:department)"); $sth->bindParam(':region',$region); $sth->bindParam(':department',$department); $sth->execute(); } catch(PDOException $e){ echo 'Impossible de traiter les données. Erreur : '.$e->getMessage(); } } ?> <?php // connexion à externalisé, utilisation de PDO pour l'exemple et la belle requête préparée plus bas (qui t'évite une injection SQL au passage) include(connex.php); $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE=> PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false]; $connexion = new PDO('mysql:host='.$serveur.';dbname='.$base,$user,$mdp,$options); if ($connexion === false) { $msgCnxSQL = 'Un incident s\'est produit lors de la connexion à la base de données, veuillez essayer à nouveau ultérieurement'; } ?> <!Doctype html> <html> <head> <meta charset="utf-8"> <title>Liens_utiles</title> </head> <body> <?php // si le message existe c'est qu'il y a un gros soucis. on l'affiche et on arrete le script (mais un doc html correct et propre). if(!empty($msgCnxSQL)){ echo <<<html <div class="erreur">{$msgCnxSQL}</div> </body> </html> html; die(666); } ?> <header> <?php ?> </header> <h3>Choix de la region</h3> <?php if (isset($_POST['ok']) && isset($_POST['department'])&& $_POST['department'] != "") { echo <<<html <p>Vous avez sélectionné le departement {$_POST['department']} dans la region {$_POST['region']} </p> html; } ?> <h3>Trouver un departement</h3> <form method="post" name="chgdepart"> <fieldset> <legend>Sélectionnez une region</legend> <select type="varchar" name="region" id="region" onchange="document.forms['chgdepart'].submit();" required> <option value="">- - - Choisissez une catégorie - - -</option> <?php $rech_region = $connexion->query('SELECT id_region, region FROM t_region ORDER BY id_region'); if ($rech_region !== false) { while ($data = $rech_region->fetch(PDO::FETCH_ASSOC)) { echo '<option value="',$data['id_region'],'"'; if(!empty($_POST['region']) && $_POST['region'] == $data['id_region']){ echo ' selected="selected"'; } echo '>',$data['region'],'</option>'; } $rech_region->closeCursor(); } echo '</select><br />'; if (!empty($_POST['region'])){ /* Cération de la requête pour avoir les départements de cette région */ $stmt = $connexion->prepare('SELECT id_departement,department FROM departement WHERE id_region = :id ORDER BY id_departement'); $stmt->bindParam(':id',$_POST['region']); $stmt->execute(); echo '<select type="varchar" name="department" id="department">'; while($data = $stmt->fetch(PDO::FETCH_ASSOC)){ echo '<option value="',$data['id_departement'],'"'; if(!empty($_POST['department']) && $_POST['department'] == $data['id_departement']){ echo ' selected="selected"'; } echo '>',$data['department'],'</option>'; } $stmt->closeCursor(); echo '</select>'; } ?> <br /> <input type="submit" name="ok" id="ok" value="Envoyer" /> </fieldset> </form> </body> </html>

Mammouth du PHP | 2703 Messages

01 nov. 2022, 08:44

$sth->bindParam(':region',$region);
que vaut $region à cet endroit du code ?

Petit nouveau ! | 5 Messages

01 nov. 2022, 17:57

merci pour votre réponse
y a t-il une faute de synthase à ce niveau? plus de précision svp

Petit nouveau ! | 5 Messages

01 nov. 2022, 18:56

merci, je viens de corriger cette erreur.
mais le véritable problème auquel je suis confronté est que au lieu et place des noms des régions et des départements, ce sont les identifiants(exemple: 1,6,22,...) qui s'insèrent dans la table. comment peut on résoudre ce problème ? merci pour votre aide.
code après correction

Code : Tout sélectionner

<?php $region=$_POST["region"]; $department=$_POST["department"]; include("connex.php"); if(isset($_POST['ok'])&&($_POST["region"])&&($_POST["department"])&&!empty($_POST["region"])&&!empty($_POST["department"])){ try{ // Connexion au serveur $dbco = new PDO("mysql:host=$serveur;dbname=$base",$user,$mdp); $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //Ajout de la valeur dans la table $sth = $dbco->prepare("INSERT INTO resume_region(region,department) VALUES(:region,:department)"); $sth->bindParam(':region',$region); $sth->bindParam(':department',$department); $sth->execute(); } catch(PDOException $e){ echo 'Impossible de traiter les données. Erreur : '.$e->getMessage(); } } ?> <?php // connexion à externalisé, utilisation de PDO pour l'exemple et la belle requête préparée plus bas (qui t'évite une injection SQL au passage) include("connex.php"); $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE=> PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false]; $connexion = new PDO('mysql:host='.$serveur.';dbname='.$base,$user,$mdp,$options); if ($connexion === false) { $msgCnxSQL = 'Un incident s\'est produit lors de la connexion à la base de données, veuillez essayer à nouveau ultérieurement'; } ?> <!Doctype html> <html> <head> <meta charset="utf-8"> <title>Liens_utiles</title> </head> <body> <?php // si le message existe c'est qu'il y a un gros soucis. on l'affiche et on arrete le script (mais un doc html correct et propre). if(!empty($msgCnxSQL)){ echo <<<html <div class="erreur">{$msgCnxSQL}</div> </body> </html> html; die(666); } ?> <header> <?php ?> </header> <h3>Choix de la region</h3> <?php if (isset($_POST['ok']) && isset($_POST['department'])&& $_POST['department'] != "") { echo <<<html <p>Vous avez sélectionné le departement {$_POST['department']} dans la region {$_POST['region']} </p> html; } ?> <h3>Trouver un departement</h3> <form method="post" name="chgdepart"> <fieldset> <legend>Sélectionnez une region</legend> <select type="varchar" name="region" id="region" onchange="document.forms['chgdepart'].submit();" required> <option value="">- - - Choisissez une catégorie - - -</option> <?php $rech_region = $connexion->query('SELECT id_region, region FROM t_region ORDER BY id_region'); if ($rech_region !== false) { while ($data = $rech_region->fetch(PDO::FETCH_ASSOC)) { echo '<option value="',$data['id_region'],'"'; if(!empty($_POST['region']) && $_POST['region'] == $data['id_region']){ echo ' selected="selected"'; } echo '>',$data['region'],'</option>'; } $rech_region->closeCursor(); } echo '</select><br />'; if (!empty($_POST['region'])){ /* Cération de la requête pour avoir les départements de cette région */ $stmt = $connexion->prepare('SELECT id_departement,department FROM departement WHERE id_region = :id ORDER BY id_departement'); $stmt->bindParam(':id',$_POST['region']); $stmt->execute(); echo '<select type="varchar" name="department" id="department">'; while($data = $stmt->fetch(PDO::FETCH_ASSOC)){ echo '<option value="',$data['id_departement'],'"'; if(!empty($_POST['department']) && $_POST['department'] == $data['id_departement']){ echo ' selected="selected"'; } echo '>',$data['department'],'</option>'; } $stmt->closeCursor(); echo '</select>'; } ?> <br /> <input type="submit" name="ok" id="ok" value="Envoyer" /> </fieldset> </form> </body> </html>

Mammouth du PHP | 2703 Messages

01 nov. 2022, 20:22

pour l'insertion dans cette table, ce sont les identifiants qu'il faut insérer.
pour le message à l'utilisateur, une requête pour avoir le nom à partir de l'id, et il sera alors possible d'avoir un message plus parlant.

Petit nouveau ! | 5 Messages

02 nov. 2022, 12:54

merci,
j'ai essayé en modifiant ma requête d'insertion comme suit mais ça ne passe pas. Comment dois Je faire cette requête?
code

Code : Tout sélectionner

<?php $region=$_POST["region"]; $department=$_POST["department"]; include("connex.php"); if(isset($_POST['ok'])&&($_POST["region"])&&($_POST["department"])&&!empty($_POST["region"])&&!empty($_POST["department"])){ try{ // Connexion au serveur $dbco = new PDO("mysql:host=$serveur;dbname=$base",$user,$mdp); $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //Ajout de la valeur dans la table $sth = $dbco->prepare("INSERT INTO resume_region(region,department) VALUES(:region,:department) ORDER BY id"); $sth->bindParam(':region',$region); $sth->bindParam(':department',$department); $sth->execute(); } catch(PDOException $e){ echo 'Impossible de traiter les données. Erreur : '.$e->getMessage(); } } ?> <?php // connexion à externalisé, utilisation de PDO pour l'exemple et la belle requête préparée plus bas (qui t'évite une injection SQL au passage) include("connex.php"); $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE=> PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false]; $connexion = new PDO('mysql:host='.$serveur.';dbname='.$base,$user,$mdp,$options); if ($connexion === false) { $msgCnxSQL = 'Un incident s\'est produit lors de la connexion à la base de données, veuillez essayer à nouveau ultérieurement'; } ?> <!Doctype html> <html> <head> <meta charset="utf-8"> <title>Liens_utiles</title> </head> <body> <?php // si le message existe c'est qu'il y a un gros soucis. on l'affiche et on arrete le script (mais un doc html correct et propre). if(!empty($msgCnxSQL)){ echo <<<html <div class="erreur">{$msgCnxSQL}</div> </body> </html> html; die(666); } ?> <header> <?php ?> </header> <h3>Choix de la region</h3> <?php if (isset($_POST['ok']) && isset($_POST['department'])&& $_POST['department'] != "") { echo <<<html <p>Vous avez sélectionné le departement {$_POST['department']} dans la region {$_POST['region']} </p> html; } ?> <h3>Trouver un departement</h3> <form method="post" name="chgdepart"> <fieldset> <legend>Sélectionnez une region</legend> <select type="varchar" name="region" id="region" onchange="document.forms['chgdepart'].submit();" required> <option value="">- - - Choisissez une catégorie - - -</option> <?php $rech_region = $connexion->query('SELECT id_region, region FROM t_region ORDER BY id_region'); if ($rech_region !== false) { while ($data = $rech_region->fetch(PDO::FETCH_ASSOC)) { echo '<option value="',$data['id_region'],'"'; if(!empty($_POST['region']) && $_POST['region'] == $data['id_region']){ echo ' selected="selected"'; } echo '>',$data['region'],'</option>'; } $rech_region->closeCursor(); } echo '</select><br />'; if (!empty($_POST['region'])){ /* Cération de la requête pour avoir les départements de cette région */ $stmt = $connexion->prepare('SELECT id_departement,department FROM departement WHERE id_region = :id ORDER BY id_departement'); $stmt->bindParam(':id',$_POST['region']); $stmt->execute(); echo '<select type="varchar" name="department" id="department">'; while($data = $stmt->fetch(PDO::FETCH_ASSOC)){ echo '<option value="',$data['id_departement'],'"'; if(!empty($_POST['department']) && $_POST['department'] == $data['id_departement']){ echo ' selected="selected"'; } echo '>',$data['department'],'</option>'; } $stmt->closeCursor(); echo '</select>'; } ?> <br /> <input type="submit" name="ok" id="ok" value="Envoyer" /> </fieldset> </form> </body> </html>

Petit nouveau ! | 5 Messages

02 nov. 2022, 21:25

Bonsoir,
j'arrive maintenant à insérer la région et le département dans la table mais c'est pas encore parfait. En effet, il a fallu concaténer dans le paramètre de value en associant l'$id_region et $region d'une part et $id_departement et $department d'autre part. Les régions et départements insérés sont donc précédés des id. merci de m'apporter votre aide soit pour insérer sans les id ou si possible avoir une requête qui ne permet d'afficher que les noms de région et département sans id qui précède. Merci d'avance
mon code

Code : Tout sélectionner

<?php $region=$_POST['region']; $department=$_POST['department']; include(connex.php); if(isset($_POST['ok'])&&($_POST['region'])&&($_POST['department'])&&!empty($_POST['region'])&&!empty($_POST['department'])){ try{ // Connexion au serveur $dbco = new PDO("mysql:host=$serveur;dbname=$base",$user,$mdp); $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //Ajout de la valeur dans la table $sth = $dbco->prepare("INSERT INTO resume_region(region,department) VALUES(:region,:department)"); $sth->bindParam(':region',$region); $sth->bindParam(':department',$department); $sth->execute(); } catch(PDOException $e){ echo 'Impossible de traiter les données. Erreur : '.$e->getMessage(); } } ?> <?php // connexion à externalisé, utilisation de PDO pour l'exemple et la belle requête préparée plus bas (qui t'évite une injection SQL au passage) include(connex.php); $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE=> PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false]; $connexion = new PDO('mysql:host='.$serveur.';dbname='.$base,$user,$mdp,$options); if ($connexion === false) { $msgCnxSQL = 'Un incident s\'est produit lors de la connexion à la base de données, veuillez essayer à nouveau ultérieurement'; } ?> <!Doctype html> <html> <head> <meta charset="utf-8"> <title>Liens_utiles</title> </head> <body> <?php // si le message existe c'est qu'il y a un gros soucis. on l'affiche et on arrete le script (mais un doc html correct et propre). if(!empty($msgCnxSQL)){ echo <<<html <div class="erreur">{$msgCnxSQL}</div> </body> </html> html; die(666); } ?> <header> <?php ?> </header> <h3>Choix de la region</h3> <?php if (isset($_POST['ok']) && isset($_POST['department'])&& $_POST['department'] != "") { echo <<<html <p>Vous avez sélectionné le departement {$_POST['department']} dans la region {$_POST['region']} </p> html; } ?> <h3>Trouver un departement</h3> <form method="post" name="chgdepart"> <fieldset> <legend>Sélectionnez une region</legend> <select type="text" name="region" id="region" onchange="document.forms['chgdepart'].submit();" required> <option value="">- - - Choisissez une catégorie - - -</option> <?php $rech_region = $connexion->query('SELECT id_region, region FROM t_region ORDER BY id_region'); if ($rech_region !== false) { while ($data = $rech_region->fetch(PDO::FETCH_ASSOC)) { echo '<option value="',$data['id_region'],$data['region'],'"'; if(!empty($_POST['region']) && $_POST['region'] == $data['id_region']){ echo ' selected="selected"'; } echo '>',$data['region'],'</option>'; } $rech_region->closeCursor(); } echo '</select><br />'; if (!empty($_POST['region'])){ /* Cération de la requête pour avoir les départements de cette région */ $stmt = $connexion->prepare('SELECT id_departement,department FROM departement WHERE id_region = :id_region ORDER BY id_departement'); $stmt->bindParam(':id_region',$_POST['region']); $stmt->execute(); echo '<select type="varchar" name="department" id="department">'; while($data = $stmt->fetch(PDO::FETCH_ASSOC)){ echo '<option value="',$data['id_departement'],$data['department'],'"'; if(!empty($_POST['department']) && $_POST['department'] == $data['id_departement']){ echo ' selected="selected"'; } echo '>',$data['department'],'</option>'; } $stmt->closeCursor(); echo '</select>'; } ?> <br /> <input type="submit" name="ok" id="ok" value="Envoyer" /> </fieldset> </form> </body> </html>

Mammouth du PHP | 2703 Messages

02 nov. 2022, 21:30

pour l'insertion dans cette table, ce sont les identifiants qu'il faut insérer.
pour le message à l'utilisateur, une requête pour avoir le nom à partir de l'id, et il sera alors possible d'avoir un message plus parlant.

quand on sait faire marcher :
$stmt = $connexion->prepare('SELECT id_departement,department FROM departement WHERE id_region = :id ORDER BY id_departement');
il n'y a pas beaucoup de changement à faire pour obtenir le nom d'un département à partir de son id.