Je crée une page de compte client qui affiche les informations dans la base de données et permet aux clients d'éditer leurs informations. Le code ci-dessous montre l'option pertinente sélectionnée quand il n'y a qu'une seule valeur dans la colonne db associée, mais elle arrête de pré-sélectionner des valeurs quand il y a plus d'une valeur dans la colonne et ne fonctionne donc pas pour les éléments multi-sélection sur la page.Présélectionner les options Multiselect correspondant aux valeurs db
Comment puis-je modifier if($row1['notifications']=='New_Items')
pour que cela fonctionne lorsque plus d'une valeur a été sélectionnée? L'ajout de crochets ['notifications[]']=='New_Items'
renvoie le message d'erreur "Notice: Undefined index notifications[]"
et empêche la présélection de toutes les valeurs.
Les éléments de formulaire à sélection multiple sont structurés sous le nom name = "nom_élément []" et sont insérés dans la base de données sous la forme de tableaux et les tableaux implode
lorsqu'ils sont insérés. Lorsque les valeurs sont extraites, j'utilise str_replace
pour dépouiller les virgules après chaque option afin qu'il puisse bien comparer la valeur à la valeur de l'option (il ne semble pas être nécessaire de faire exploser les valeurs)
<?php
try {
$stmt = $conn->prepare("SELECT * FROM customer_info WHERE user_id = :user_id");
$stmt->bindValue(':user_id', $user_id);
$stmt->execute();
}catch(PDOException $e) {echo $e->getMessage();}
$row = $stmt->fetch();
$row1 = str_replace(',', '', $row);
?>
<form action="account_information-exec.php" method="post">
<select name="notifications[]" multiple="multiple" >
<option value="New_Items" <?php if($row1['notifications']=='New_Items') echo "selected='selected'"; ?>>New items</option>
<option value="Sale_Items" <?php if($row1['notifications']=='Sale_Items') echo "selected='selected'"; ?>>Sale items</option>
</select>
<input type="submit" value="submit">
</form>
account_information-exec.php - fichier qui insère et/ou mises à jour DB
<?php
require_once "config/config.php"; // Connects to db
$user_id = $_SESSION['SESS_USER_ID'];
try {
$stmt = $conn->prepare('INSERT INTO customer_info (user_id, notifications)
VALUES(:user_id, :notifications)
ON DUPLICATE KEY UPDATE notifications = :notifications2');
function bindMultiple($stmt, $params, &$variable, $type) {
foreach ($params as $param) {
$stmt->bindParam($param, $variable, $type);
}
}
$stmt->bindParam(':user_id', $user_id);
bindMultiple($stmt, array(':notifications', ':notifications2'), implode(',', $_POST['notifications']), PDO::PARAM_STR);
$result = $stmt->execute();
} catch(PDOException $e) {echo $e->getMessage();}
Je ne crois pas qu'il soit stocké en tant que chaîne concaténée (sauf si la fonction implode le fait dans account_information-exec.php?). La raison pour laquelle je supprime les virgules est qu'elle permet de comparer correctement la valeur à la valeur de l'option (sinon, elle lisait la virgule comme un caractère) –