2009-12-26 6 views
1

Ok, tout d'abord, j'applige si cette question a déjà été posée, j'ai passé les 12 dernières heures à passer au crible des centaines de sujets de discussion et je n'en ai pas trouvé de réponse à cette question exactement encore si ici.PHP explode supprime la première valeur de tableau

J'ai une page que j'ai construite avec une liste d'utilisateurs qui est autopopulée lorsque les utilisateurs se connectent, et chaque utilisateur a une case à cocher qui permet à l'hôte de sélectionner les utilisateurs et de les supprimer si nécessaire. J'utilise jQuery pour envoyer une chaîne de tableau à une page php où j'essaye d'exploser la chaîne, de parcourir les userids et de supprimer les id passés de notre base de données. Tout fonctionne très bien, sauf si je choisis plus d'un utilisateur. Quand je sélectionne plus d'un utilisateur et que je passe le tableau au gestionnaire php, il explose le tableau mais ne conserve que la dernière valeur dans le tableau, le reste est perdu quelque part dans le trou noir du script.

Voici mon code de ma page javascript:

function rem_user() { 
var ids = $('input:checkbox[id=del]:checked').map(function(){ 
    return this.value 
}).get(); 
alert(ids); 
jQuery("#rem_msg").load(controlpage, {AdmFnc: "rem_user", del_ids: ids}, getUsers); 
} 

ce tableau est ensuite transmis au php contrôle page où il est géré par:

if (strcmp($AdmFnc, rem_user) == 0){ 
echo ""; 
$ids = trim($_POST['del_ids']); 
$ids = explode(',',$ids); 
if(is_array($ids)){ 
    foreach($ids as $userid){ 
     mysqli_query($dbc, "UPDATE webcastlogin SET logoutTime = '$current_time' WHERE userid = '$userid'") or die('Error setting logout time '.mysqli_error($dbc)); 
     mysqli_query($dbc, "DELETE FROM weekly_users WHERE userid = '$userid'") or die('Error removing users '.mysqli_error($dbc)); 
    } 
    echo 'Selected IDs removed'; 
} else if (empty($ids)) { 
    echo 'Code is wrong, no array sent'; 
} else { 
    mysqli_query($dbc, "UPDATE webcastlogin SET logoutTime = '$current_time' WHERE userid = '$ids'"); 
    mysqli_query($dbc, "DELETE FROM weekly_users WHERE userid = '$ids'"); 
    echo 'Selected ID removed'; 
} 
} 

Comme vous pouvez le voir sur mon javascript , j'ai une alerte configurée afin que je puisse vérifier que les informations envoyées sont correctes, autant que je peux dire de cette alerte, c'est un tableau délimité "," donc c'est ce que j'utilise du côté php pour l'exploser.

Je suis à bout de nerfs en essayant de comprendre pourquoi quand je lance cette boucle foreach, je n'ai que la valeur de l'élément final dans le tableau.

Toute aide serait grandement appréciée et pourrait sauver mes cheveux pour de futurs challanges de codage.

Merci

Répondre

6

changer juste votre nom clé pour del_ids dans la appel jQuery load pour inclure un ensemble vide de crochets:

jQuery("#rem_msg").load(controlpage, {AdmFnc: "rem_user", "del_ids[ ]": ids}, getUsers); 

maintenant, dans le PHP, au lieu d'utiliser trim et explode, les valeurs seront déjà en un tableau, de sorte que vous pouvez y accéder directement:

$ids = $_POST['del_ids']; 
+0

Merci pour la réponse, j'ai testé votre réponse, mais quand je vais au script PHP, je n'arrive pas à accéder au tableau complet qui est envoyé, quand je lance la variable à travers la déclaration "if", c'est seulement reconnu comme une valeur unique. –

+0

Ok, je prends ça en arrière, je ne l'ai pas configuré correctement, il doit y avoir un espace entre les parenthèses pour que php le reconnaisse comme un tableau, une fois que je l'ai fait ça a fonctionné comme un charme. Merci beaucoup! –

+0

Salut, je vous en prie. Je veux mettre à jour ma réponse correctement, donc vous dites qu'il doit être '' del_ids [] "'? –

4

Vous devez convertir votre tableau à la chaîne avant de faire la demande Ajax, vous pouvez le faire avec la méthode join:

function rem_user() { 
    var ids = $('input:checkbox[id=del]:checked').map(function(){ 
    return this.value 
    }).get().join(); // ids now is a comma separated string, made from the array 

    alert(ids); 
    jQuery("#rem_msg").load(controlpage, {AdmFnc: "rem_user", 
    del_ids: ids}, 
    getUsers); 
} 

Ce qu'il se passe est que lorsque vous envoyez l'objet Array, la valeur de del_ids se répète sur les paramètres POST demande Ajax:

img1

C'est pourquoi vous obtenez seulement le dernier élément, puisque c'est vraiment le même paramètre.

Mais si vous faites une chaîne à partir de votre tableau, il affichera la valeur du paramètre que vous attendez sur le côté serveur:

img2

+0

Bonne réponse. Je ne savais pas non plus que la méthode par défaut de la méthode 'join' était de séparer les virgules. Bon de savoir! –

+1

Merci Doug, vous pouvez l'utiliser sans soucis, car il est garanti par la spécification! http://bclary.com/2004/11/07/#a-15.4.4.5 – CMS

+0

Merci pour la réponse, j'ai testé votre réponse, et tandis que le tableau est envoyé à PHP dans une chaîne, et j'ai testé le réponse, la boucle foreach affecte toujours uniquement la valeur finale de la chaîne. Je me demande s'il y a un problème avec la boucle foreach. –

Questions connexes