Easy-Micro

ESPACEMEMBRE PHP-MySQL
Menu déroulant

Afficher la table "clients" dans un menu déroulant

Afficher le résultat d'une requête dans un menu déroulant (select) est d'autant plus important que le nombre de résultat d'une requête SQL est souvent inconnu et parfois très très long

Afficher une table MySQL dans un menu déroulant avec la librairie PDO

// connexion à la base
$user = "root";
$pass = "";
$dnspdo = 'mysql:dbname=mabase;host=localhost;charset=utf8';

$bdd = new PDO($dnspdo, $user, $pass);

// Récupère les données de la table clients
$requete1 = 'SELECT * FROM clients';

// le prepare (avec le execute) est comme un query mais beaucoup plus sécurisé
$resultat = $bdd->prepare($requete1);
$resultat->execute();

if (!$resultat) {
echo "Problème de requete";
} else {
?>

// Affichage des clients dans un menu déroulant
Liste des clients :<br>
<select>
<?php
while($ligne = $resultat->fetch()) {
echo "<option value='".$ligne['id_client']."'>".$ligne['nom_client']."</option>";
}
?>

</select>

<?php
} // fin du else
$resultat->closeCursor(); // libère le résultat
?>


Lier les deux listes déroulantes

Pour lier deux listes déroulante entre elle, on utilise idéalement la librairie jquery.chained.js. Exemple sur deux listes déroulante avec les prénoms et les noms d'une unique table Mysql Clients.

// Appel des librairies Jquery :
<script src="js/jquery-3.3.1.min.js"></script>
<script src="js/jquery.chained.js"></script>

// Script Jquery de chainage de liste
<script>
$(function(){
$("#liste_nom").chained("#liste_prenom");
});
</script>

Rajoutez enfin une classe dans le while d'affichage des noms : class='".$ligne2["id_client"]."'

Exemple complet du while avec la class id_client (syntaxe PHP objet) :
while($ligne = $resultat->fetch()) {
echo "<option value='".$ligne["id_client"]."' class='".$ligne["id_client"]."'>".$ligne["nom_client"]."</option>";
}





Afficher une table MySQL dans un menu déroulant avec la librairie MySQLi

Exercice réalisé en janvier 2019 avec Christian Valade du SIAE/AIA de Bordeaux

Fichier PHP index-clients.php (dans le dossier clients)
<?php
// connexions
require_once("clients/connexion.php");
$resultat = $mysqli->query("SELECT * FROM ".$table.";");
$mysqli->set_charset("utf8"); // évite les problèmes d'encodage
if (!$resultat) {
printf("Problème de requête - Erreur : %s", $mysqli->error); }
else {
?>

<!-- affiche les prénoms de la table clients dans un menu déroulant -->
<form action="index.php?page=clients/index-clients.php" method="post">
<select id="liste_prenom" onchange="syva_prenom()">

<?php
while($ligne = $resultat->fetch_array(MYSQLI_BOTH)) {
echo "<option value='".$ligne["id_client"]."'>".utf8_encode($ligne["prenom_client"])."</option>";
}
$resultat->data_seek(0); // remise à zéro du pointeur
?>

</select>

<!-- Deuxième select pour les noms des clients -->
<select id="liste_nom" onchange="syva_nom()">

<?php
while($ligne2 = $resultat->fetch_array(MYSQLI_BOTH)) {
echo "<option value='".$ligne2["id_client"]."'>".$ligne2["nom_client"]."</option>";
}

$resultat->close(); // libère les résultats
?>

</select>
<input type="text" name="id" id="id" readonly="true" style="width:25px;">
<input type="text" name="zonemodif" id="zonemodif" style="width:120px;">
<input type="hidden" name="choix_update" id="choix_update">
<input type="submit" value="Actualiser">
</form>

<?php
// On récupère les POST
if(isset($_POST['zonemodif']) && isset($_POST['id'])) {
$zonemodif = $_POST['zonemodif'];
$id_client = $_POST['id'];
$choix_update = $_POST['choix_update'];

// requête de type UPDATE
$resultat = $mysqli->query("UPDATE ".$table." SET ".$choix_update." ='".$zonemodif."' WHERE id_client='".$id_client."';");

if (!$resultat) { echo "Houston?"; }
else {
header("Location: index.php?page=clients/index-clients.php");
}
}

$mysqli->close(); // ferme la connexion

}
?>

Code du fichier connexion.php appelé dans le require_once du fichier index-clients.php
<?php
// connexion clients

$base = "mabase";
$serveur = "127.0.0.1";
$user = "root";
$pass = "";
$table ="clients";

// on instancie la classe mysqli (en syntaxe orientée objet)
$mysqli = new mysqli($serveur, $user, $pass, $base);

// appel de méthode avec l'opérateur ->
if ($mysqli->connect_errno) {
printf("Échec de la connexion : %s", $mysqli->connect_error); // %s pour string
exit();
}

?>

Code Javascript à rajouter dans le fichier index-clients.php
Ce code est exécuté suite au onchange du select :
<script>
function syva_prenom() {
// Fait passer les prénoms des clients dans le champ de modification
document.getElementById('zonemodif').value = document.getElementById('liste_prenom').options[document.getElementById('liste_prenom').selectedIndex].text;

// Fait passer l'id correspondant aux prénoms dans le champ id
document.getElementById('id').value = document.getElementById('liste_prenom').value;

// Initialise le choix du prénom de la colonne de la table client dans un champ caché (hidden) pour initialiser le SET de la requête sur le prénom ou le nom car nous n'avons q'un seul champ de modification
document.getElementById('choix_update').value = "prenom_client";
}

// Deuxième fonction identique à l'autre mais pour les noms
function syva_nom() {
// Fait passer les noms des clients dans le champ de modification
document.getElementById('zonemodif').value = document.getElementById('liste_nom').options[document.getElementById('liste_nom').selectedIndex].text;

// Fait passer l'id correspondant aux noms dans le champ id
document.getElementById('id').value = document.getElementById('liste_nom').value;

// Initialise le choix du nom de la colonne de la table client dans un champ caché (hidden)
document.getElementById('choix_update').value = "nom_client";
}

</script>


< Page précédente PHP-MYSQL Page suivante >