JeuWeb - Crée ton jeu par navigateur
[Résolu] Checkbox dans une boîte de réception - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu] Checkbox dans une boîte de réception (/showthread.php?tid=2584)

Pages : 1 2


[Résolu] Checkbox dans une boîte de réception - jldbaro - 21-05-2008

J'ai crée une boite de réception de messages dans mon jeu.

Afin de permettre au joueur de supprimer plusieurs messages consécutivement, j'ai insérer un checkbox à coté de chaque message.

Si le messsage porte l'id: 1398 mon checkbox sera: check1398

J'autorise un max de 100 messages.

Mon problème est le suivant:

Comment transmettre à la page suppr.php les checkbox activé?

J'avais pensé à faire une requete pour connaitre tous les messages du joueur et vérifier un par un dans une boucle si il est activé.

Mais cela va user beaucoup du CPU.

Quelqu'un aurait une autre idée?

Merci,


RE: boite de réception - checkbox - Kassak - 21-05-2008

Tu affiches la totalité des messages dans une boucle non?

Moi dans mon cas, j'incrémente a chaque fois une variable $i par exemple, et je génère à chaque fois une checkbox qui a comme id $i.

Je récupère ensuite tous les id séléctionné, et je supprime, toujours dans une boucle Wink


RE: boite de réception - checkbox - Sephi-Chan - 21-05-2008

Tu récupères ton formulaire POST, tu boucles sur le résultat des checkbox et tu construis une chaîne qui ressemblera à 25, 27, 41, 42, 43 et que tu n'auras plus qu'à utiliser dans la clause WHERE … IN de ta requête SQL.

Par exemple :

Code PHP :
<?php 
$query
= sprintf(
"DELETE messages
WHERE id IN (%s)
AND destinataire = %d;"
,
$chaine,
$utilisateur
);

Et voilà ! Smile


Sephi-Chan


RE: boite de réception - checkbox - phenix - 21-05-2008

Question au niveau des performances:

Est il plus rapide de faire une sérier de delete dans un boucle

style

Code PHP :
<?php 
while ([...])
{
$sql = mysql_query('DELETE [...]')
}

Ou bien crée une grande série de OR id=[...] suivit d'une seul requete

style

Code PHP :
<?php 
$where
= '';
while ([...])
{
$where .= id=[...] OR';
}
$sql = mysql_query('
DELETE FROM [...] WHERE '.$where);

Je sais c'est con comme idée :p

PS: je sais que le code PHP est faux, c'est juste pour représenté les idée Wink

[edit suite au message de sephi]: la méthode de sephi est elle plus rapide que les deux autre :p


RE: boite de réception - checkbox - Cartman34 - 21-05-2008

Le plus simple est de faire un tableau que tu envoies par méthode POST.
J'en ai déjà parlé 2fois sur ce forum et je vois que personne ne suit mes idées :'( (que je partage en fait...)
Coté HTML:
<input type="{Camarcheavectouslestypes}" name="del[{id}]"
A la place de {id} tu cases l'id du message.

Coté PHP:
Foreach pour lire la liste des messages contenu dans $_POST['del'].
On vérifie que le message est coché.
On vérifie que le message appartient bien à l'utilisateur(on sait jamais y'a toujours des petits malins...)

Je connais pas plus simple et efficace...


RE: boite de réception - checkbox - phenix - 21-05-2008

Ouarf c'est aussi simple ???

Y pas de revers de faille ou de bug dans ce truc ??


RE: boite de réception - checkbox - Sephi-Chan - 21-05-2008

Il semble que j'ai fais trop court sur les résultats des checkbox.

Code :
<form action="index.php?p=deleteMessages" method="post">
<table><caption>Boîte de réception</caption>
    <tr>
        <th>#</th>
        <th>Titre</th>
        <th>Envoyeur</th>
    </tr>
    <tr>
        <td><input type="checkbox" name="messagesToDelete[2]" id="message_2" value="2" /></td>
        <td><label for="message_2">Titre du message d'id 2 !</label></td>
        <td>Bob</td>
    </tr>
    <tr>
        <td><input type="checkbox" name="messagesToDelete[4]" id="message_4" value="4" /></td>
        <td><label for="message_4">Titre du message d'id 4 !</label></td>
        <td>Bob</td>
    </tr>
    <tr>
        <td><input type="checkbox" name="messagesToDelete[15]" id="message_15" value="15" /></td>
        <td><label for="message_15">Titre du message d'id 15 !</label></td>
        <td>bogoss_du_91</td>
    </tr>

</table>
<p><input type="submit" value="Valider" /></p>
</form>

Sur la page de réception, voilà ce qu'on reçoit en affichant $_POST en admettant que j'ai coché les 2 dernières cases :
Code PHP :
<?php 
echo '<pre>'; print_r($_POST); echo '</pre>';
/* Renvoie :
Array
(
[messagesToDelete] => Array
(
[4] => 4
[15] => 15
)

)
*/

Toutefois, cela ne me dispense pas de créer ma chaîne qui ira dans le IN de ma requête, ce que je fais grâce au script qui suit.
Code PHP :
<?php 
/*
* Je crée mon itérateur, mon compteur
* ainsi que ma chaîne vide.
*/
$i = 0;
$n = count($_POST['messagesToDelete']);
$messagesToDelete = '';

/*
* Je peux boucler au choix sur la clé ou la valeur puisque
* j'ai donné à l'attribut value du formulaire l'identifiant
* du message. Je choisis cependant de boucler sur les clés
* données dans name, ça allège l'écriture du foreach.
*/
foreach($_POST['messagesToDelete'] as $id){

$messagesToDelete .= $id;
$i++;

/*
* Je teste si on n'a pas atteint le dernier élément
* du tableau. Si c'est vrai, alors je mets une virgule
* car un autre élément va suivre.
*/
if($i != $n){
$messagesToDelete .= ',';
}
}
echo
$messagesToDelete;
// Renvoie : 4,15


Sephi-Chan


RE: boite de réception - checkbox - Cartman34 - 21-05-2008

A ta place, j'aurai laissé les valeurs des checkbox sans leur en attribuer d'autre...

Genre...
Code PHP :
<?php 
foreach($_POST['messagesToDelete'] as $id => $check){
if(
$check == 'on') {
/*
* Je testes pour savoir si ce n'est pas le premier id.
* Sinon, j'ajoute une virgule.
*/
if($i){
$messagesToDelete .= ',';
}
$messagesToDelete .= $id;
$i++;
}
}

Y'a plus simple, mais j'ai fais pour que tout le monde comprenne et pas trop changer de ce que Sephi a fait.
Perso, j'ai une fonction gérant la concaténation des virgules et autres...


RE: boite de réception - checkbox - Sephi-Chan - 21-05-2008

IGstaff a écrit :A ta place, j'aurai laissé les valeurs des checkbox sans leur en attribuer d'autre...

Genre...
Code PHP :
<?php 
foreach($_POST['messagesToDelete'] as $id => $check){
if(
$check == 'on') {
/*
* Je testes pour savoir si ce n'est pas le premier id.
* Sinon, j'ajoute une virgule.
*/
if($i){
$messagesToDelete .= ',';
}
$messagesToDelete .= $id;
$i++;
}
}

Y'a plus simple, mais j'ai fais pour que tout le monde comprenne et pas trop changer de ce que Sephi a fait.
Perso, j'ai une fonction gérant la concaténation des virgules et autres...

Seules les cases cochées sont transmises dans POST, donc la valeur de la checkbox importe peu : c'est son nom qui compte. C'est ce que j'ai essayé de montrer dans ma boucle (en n'utilisant pas la forme $key => $value). La condition que tu as ajoutée est donc toujours vraie.

Par contre je reconnais que ta condition sur le $i est plus simple que la mienne.


Sephi-Chan


RE: boite de réception - checkbox - Psykose - 21-05-2008

ou tu recupères tout par javascript ce qui consomme le CPU du client et non pas celui du serveur ...