2013-02-13 2 views
0

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();} 

Répondre

0

Je suppose rOW1 $ [ 'notifications'] est stockée sous forme d'une chaîne concaténée de valeurs sélectionnées. Si oui, essayez ceci:

if(strpos($row1['notifications'], 'New_Items') >= 0) 

Notez que vous devez tenir compte de délimiteurs (ne sais pas pourquoi vous décaper la virgule, est-il un espace laissé?).

+0

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) –

Questions connexes