Récupérer l'ID d'une case décochée

Récupérer l'ID d'une case décochée - PHP - Programmation

Marsh Posté le 26-11-2020 à 17:35:24    

Salut à tous.
 
Je suis en train de gérer des mises à jour dans ma base de donnée en fonction des états des checkbox.
 
Etape 1 : je fais chercher l'entrée concernée par la mise à jour dans la base de donnée.
Etape 2 : je regarde si l'état est 1 ou 0.
Etape 3 : je regarde si la case est cochée.
Etape 4 : je fais mes opérations :  
 - si l'état est à 1 et la case est cochée : je ne fais rien.
 - si l'état est à 1 et la case est décochée: je passe l'état à 0.
 - si l'état est à 0 et la case est cochée : je passe l'état à 1.
 - si l'état est à 0 et la case est décochée : je ne fais rien.
 
 
Le tout est opéré via un formulaire, avec un bouton submit qui transmet les infos par un post.
 
Le truc, c'est que j'arrive bien à récupérer les informations lorsque les cases sont cochées avec un $_POST.
 
Mais je n'arrive pas a récupérer celles qui sont décochées. Or j'ai besoin de savoir quelle case est décochée pour pouvoir faire ma vérif.
 
Comment faire ?
 
Merci  
 
 
 


---------------
AYAYAAA Un coup de fil on est laaaaaaaa. Oué oué oué zaharwa. On a les clé de la kma. Si Si. Le bonheur dure 10 heures !! - Nobody rules these streets at night like me
Reply

Marsh Posté le 26-11-2020 à 17:35:24   

Reply

Marsh Posté le 26-11-2020 à 17:54:01    

Voit plutôt du coté des input radio si tu veux récupérer les autres états.
Ou sinon gardes au niveau de ton code la trace de l'existence de ton bouton radio et teste son existence avec

Code :
  1. isset ($_POST['monradio'])

ou

Code :
  1. array_key_exists('monradio', $_POST)

.


---------------
D3
Reply

Marsh Posté le 26-11-2020 à 18:04:20    

Ben soit tu retrouves la valeur dans $_POST et la case est cochée, soit tu ne la retrouves pas et la case est décochée, les deux cas sont gérés. :??:

 

EDIT : grillé, mechkurt a édité son message (ou j'ai mal lu) pour aller dans le même sens.


Message édité par MaybeEijOrNot le 26-11-2020 à 18:05:20

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 26-11-2020 à 20:25:13    

Voici un bout de mon code pour les checkbox concernées :  
 
Après avoir fait un mysqli_fetch_row pour sélectionner les données de la base sql, chaque checkbox se voit rattacher un ID d'un utilisateur qui est concerné par les 4 checkbox.
 
<input type="checkbox" name="bc[]" value="'.$row['id'].'"'</td>
<input type="checkbox" name="qsp[]" value="'.$row['id'].'"'</td>
<input type="checkbox" name="a2p[]" value="'.$row['id'].'"></td>
<input type="checkbox" name="tda[]" value="'.$row['id'].'"></td>
 
 
Quand je valide le formulaire, je traite les infos avec un script qui comporte foreach ($_POST['bc'] as $_POST['valeur']), puis un autre foreach pour le qsp, tda et a2p etc.
 
Ce qui me permet de chopper l'ID de l'utilisateur qui est concerné par les cases et j'arrive a récupérer les infos de ce qui est coché (par ex bc).  
 
Par contre, je n'arrive pas a modéliser au niveau du script comment avoir une variable si la case (qsp) n'est pas cochée pour ensuite faire la comparaison avec ce que l'utilisateur avait comme choix avant le submit.
 
Je sais pas si je suis clair.


---------------
AYAYAAA Un coup de fil on est laaaaaaaa. Oué oué oué zaharwa. On a les clé de la kma. Si Si. Le bonheur dure 10 heures !! - Nobody rules these streets at night like me
Reply

Marsh Posté le 26-11-2020 à 20:48:00    

Ce n'est absolument pas clair chez moi mais je propose quand même. :D

 
Code :
  1. //<input type="checkbox" name="myId" value="'.$row['id'].'" checked></td>
  2. <input type="checkbox" name="bc['.$row['id'].']" value="1"></td>
  3. <input type="checkbox" name="qsp['.$row['id'].']" value="1"></td>
  4. <input type="checkbox" name="a2p['.$row['id'].']" value="1"></td>
  5. <input type="checkbox" name="tda['.$row['id'].']" value="1"></td>


Message édité par MaybeEijOrNot le 27-11-2020 à 08:12:13

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 26-11-2020 à 20:49:47    

Merci maybe. Je vais tester demain.


---------------
AYAYAAA Un coup de fil on est laaaaaaaa. Oué oué oué zaharwa. On a les clé de la kma. Si Si. Le bonheur dure 10 heures !! - Nobody rules these streets at night like me
Reply

Marsh Posté le 26-11-2020 à 20:51:09    

Je viens d'ajouter une ligne optionnelle qui peut aussi aider (comme je ne comprends pas trop ce que tu veux faire), tu peux ensuite cacher ce checkbox via le CSS.

Message cité 1 fois
Message édité par MaybeEijOrNot le 26-11-2020 à 20:51:33

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 26-11-2020 à 21:51:11    

MaybeEijOrNot a écrit :

Je viens d'ajouter une ligne optionnelle qui peut aussi aider (comme je ne comprends pas trop ce que tu veux faire), tu peux ensuite cacher ce checkbox via le CSS.


Je voudrais avoir un retour d état de la checkbox.

 

Par exemple : si elle est cochée, je récupère un état à 1 ( facile avec un isset ou un post) et si elle ne l est pas, un état à 0 (et je sais pas comment faire)

 

Par ex : checkbox bc, avec un Id rattaché, si cochée, je récupère l id et son état à 1 et si elle est décochée, je récupère son id et état à 0.

 

Et j'ai l'impression qu'avec ta solution de mettre l id dans le bc [], je peux jouer avec "value" et donc récupérer les deux paramètres.

 

Ps : je suis un débutant en php.


Message édité par la classe @ dallas le 26-11-2020 à 21:53:19

---------------
AYAYAAA Un coup de fil on est laaaaaaaa. Oué oué oué zaharwa. On a les clé de la kma. Si Si. Le bonheur dure 10 heures !! - Nobody rules these streets at night like me
Reply

Marsh Posté le 26-11-2020 à 23:48:39    


Merci pour ta réponse. Je regarderai également demain.

 

Je suis OK avec ta 1ere phrase.
Pour la partie en gras, je fais comment exactement ?

 

Ce que j avais modélisé dans ma tête c'est : array de départ avant traitement. 4 cases par x lignes. Je fais les modifications dans les cases. Je soumets et ça me fait un array de fin. Je regarde case par case et je modifie ou non en fonction de l écart.

 

Mais j ai du mal à retranscrire ça en php.

 

Merci pour vos retours, je regarderai ça demain.


---------------
AYAYAAA Un coup de fil on est laaaaaaaa. Oué oué oué zaharwa. On a les clé de la kma. Si Si. Le bonheur dure 10 heures !! - Nobody rules these streets at night like me
Reply

Marsh Posté le 27-11-2020 à 09:23:23    

Merci d'avoir pris le temps de répondre.

 

Voila comment ca se présente :

 

Coté HTML, je charge mon formulaire :

 

https://i.ibb.co/Nxq5VwX/Capture.jpg

 

J'ai autant de séries de 4 cases que d'utilisateurs (utilisateurs qui vont croitre dans le temps).

 

Chaque utilisateur a un ID unique, que je rattache à chaque case. A ce stade, les cases de la 1ere ligne (par exemple) :

 

<input type="checkbox" name="bc[]" value="28"></td>
<input type="checkbox" name="qsp[]" value="28"></td>
<input type="checkbox" name="a2p[]" value="28"></td>
<input type="checkbox" name="tda[]" value="28"></td>

 

Ici "value" c'est l'ID de l'utilisateur

 

Du coup, quand je coche les cases, je dois récupérer pour chaque utilisateur les cases qui sont cochées et celles qui ne le sont pas.

 

Par exemple, si je coche la 1ere ligne je dois récupérer pour cette ligne  :

 

https://i.ibb.co/M1ZHKYW/Capture2.jpg

 

bc et a2p qui sont cochées et qsp et tda qui sont décochées. avec l'ID de l'utilisateur qui est "28".


Message édité par la classe @ dallas le 27-11-2020 à 09:24:14

---------------
AYAYAAA Un coup de fil on est laaaaaaaa. Oué oué oué zaharwa. On a les clé de la kma. Si Si. Le bonheur dure 10 heures !! - Nobody rules these streets at night like me
Reply

Marsh Posté le 27-11-2020 à 09:23:23   

Reply

Marsh Posté le 27-11-2020 à 09:37:51    

Pourquoi tu envoie bc sous forme de tableau name="bc[]", tu as plusieurs utilisateur simultané quand tu soumet ton formulaire ?
Si oui tu devrais mettre un champ hidden avec l'id et utiliser l'id de l'utilisateur comme clé pour accéder à ta checkbox (c'est un peu ce que propose MaybeEijOrNot).

Code :
  1. <input type="checkbox" name="users[]" value="'.$row['id'].'">
  2. <input type="checkbox" name="bc['.$row['id'].']" value="1">
  3. <input type="checkbox" name="qsp['.$row['id'].']" value="1">
  4. <input type="checkbox" name="a2p['.$row['id'].']" value="1">
  5. <input type="checkbox" name="tda['.$row['id'].']" value="1">


Et au traitement tu fait:

Code :
  1. foreach($_POST['users'] as $index => $id_user) {
  2.   if (array_key_exists('bc', $_POST) && array_key_exists($id_user, $_POST['bc']))
  3.     //la cse bc pour l'utilisateur courant est coché
  4.   } else {
  5.     //elle ne l'est pas
  6.   }
  7. }


---------------
D3
Reply

Marsh Posté le 27-11-2020 à 09:44:14    

mechkurt a écrit :

Pourquoi tu envoie bc sous forme de tableau name="bc[]", tu as plusieurs utilisateur simultané quand tu soumet ton formulaire ?
Si oui tu devrais mettre un champ hidden avec l'id et utiliser l'id de l'utilisateur comme clé pour accéder à ta checkbox (c'est un peu ce que propose MaybeEijOrNot).

Code :
  1. <input type="checkbox" name="users[]" value="'.$row['id'].'">
  2. <input type="checkbox" name="bc['.$row['id'].']" value="1">
  3. <input type="checkbox" name="qsp['.$row['id'].']" value="1">
  4. <input type="checkbox" name="a2p['.$row['id'].']" value="1">
  5. <input type="checkbox" name="tda['.$row['id'].']" value="1">


Et au traitement tu fait:

Code :
  1. foreach($_POST['users'] as $index => $id_user) {
  2.   if (array_key_exists('bc', $_POST) && array_key_exists($id_user, $_POST['bc']))
  3.     //la cse bc pour l'utilisateur courant est coché
  4.   } else {
  5.     //elle ne l'est pas
  6.   }
  7. }



 
Oui, il se peut qu'il y'ait plusieurs BC cochés pour plein d'utilisateurs en simultané.
 
Par ex :
 
https://i.ibb.co/N7cnsKD/Capture3.jpg
 
Je vais tester tout ca.
 
Merci


---------------
AYAYAAA Un coup de fil on est laaaaaaaa. Oué oué oué zaharwa. On a les clé de la kma. Si Si. Le bonheur dure 10 heures !! - Nobody rules these streets at night like me
Reply

Marsh Posté le 27-11-2020 à 12:06:26    

Bon j'ai essayé et je n'ai pas réussi de cette façon, ca m'a saoulé :D
 
J'ai viré le form, le submit. Les cases à cocher ont été remplacées par des images (en forme de case cochée ou non ) avec une url qui embarque les paramètres voulus (id, questionnaire et le statut).
A chaque clic sur l'image, j'execute le script qui fait un update de table avec les paramètres en $_GET.
 
C'est moins orthodoxe, mais c'est dans une interface admin, y'aura que ma femme qui aura accès. C'est pas elle qui me fera du hack.
 
Merci à tous ceux qui m'ont répondu. Je reviendrai peut être plus tard.


---------------
AYAYAAA Un coup de fil on est laaaaaaaa. Oué oué oué zaharwa. On a les clé de la kma. Si Si. Le bonheur dure 10 heures !! - Nobody rules these streets at night like me
Reply

Marsh Posté le 27-11-2020 à 12:21:35    

Je laisse ca de coté, j'ai encore une tonne de trucs à faire.
J'y reviendrai lors d'une V2 d'amélioration.

 

Encore merci a vous


Message édité par la classe @ dallas le 27-11-2020 à 12:21:46

---------------
AYAYAAA Un coup de fil on est laaaaaaaa. Oué oué oué zaharwa. On a les clé de la kma. Si Si. Le bonheur dure 10 heures !! - Nobody rules these streets at night like me
Reply

Marsh Posté le 27-11-2020 à 14:19:28    


Ouais ce doit être en partie ma faute, il a dû copié/collé ce que j'avais proposé, j'avais oublié qu'on n'avait pas besoin de passer par le CSS pour cacher le champ et qu'il en existait justement un type spécial en HTML pour faire ça.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 27-11-2020 à 14:22:07    

MaybeEijOrNot a écrit :


Ouais ce doit être en partie ma faute, il a dû copié/collé ce que j'avais proposé, j'avais oublié qu'on n'avait pas besoin de passer par le CSS pour cacher le champ et qu'il en existait justement un type spécial en HTML pour faire ça.


 [:zedlefou:3]


---------------
D3
Reply

Marsh Posté le 27-11-2020 à 14:54:42    

MaybeEijOrNot a écrit :


Ouais ce doit être en partie ma faute, il a dû copié/collé ce que j'avais proposé, j'avais oublié qu'on n'avait pas besoin de passer par le CSS pour cacher le champ et qu'il en existait justement un type spécial en HTML pour faire ça.


Non franchement c'est moi qui ne suis pas suffisamment calé en dev.

 

J'ai essayé pendant 1h, puis j'ai fait autrement.

 

J'aurai à traiter le même sujet sur la partie client, je garde vos idées au chaud.

 

Encore merci


Message édité par la classe @ dallas le 27-11-2020 à 14:54:53

---------------
AYAYAAA Un coup de fil on est laaaaaaaa. Oué oué oué zaharwa. On a les clé de la kma. Si Si. Le bonheur dure 10 heures !! - Nobody rules these streets at night like me
Reply

Marsh Posté le 27-11-2020 à 14:57:37    

Partie client t'aura intérêt a faire gaffe à la sécurité : vérifier la valeur de tes inputs, protéger tes requêtes SQL, etc...


---------------
D3
Reply

Marsh Posté le 27-11-2020 à 15:04:14    

mechkurt a écrit :

Partie client t'aura intérêt a faire gaffe à la sécurité : vérifier la valeur de tes inputs, protéger tes requêtes SQL, etc...


Yes.
Je le fais déjà dans le formulaire d'inscription :jap:


---------------
AYAYAAA Un coup de fil on est laaaaaaaa. Oué oué oué zaharwa. On a les clé de la kma. Si Si. Le bonheur dure 10 heures !! - Nobody rules these streets at night like me
Reply

Marsh Posté le 27-11-2020 à 15:39:17    

Salut,
 
dans une transaction, tu insères les potentiels nouveaux en ignorant les doublons (IGNORE avec la contrainte unique qui va bien) et tu supprimes les anciens par un DELETE NOT IN ?
 

Code :
  1. <?php
  2. $bdd = new PDO(/* ... */);
  3.  
  4. $bdd->beginTransaction();
  5. $insert = $bdd->prepare('INSERT IGNORE INTO ...(user_id, ...) VALUES(:user_id, ...)');
  6. $insert->bindParam('user_id', $user_id, PDO::PARAM::INT);
  7. foreach ($_POST['users'] as $user_id) {
  8.    $insert->execute();
  9. }
  10. $bdd->query('DELETE FROM ... WHERE user_id NOT IN(' . implode(', ', array_map('intval', $_POST['users'])) . ')');
  11. $bdd->commit();

Reply

Marsh Posté le 27-11-2020 à 19:14:36    

Suffisait de faire un diff.
Dans la mesure où tu sais générer toutes tes cases à cocher, tu connais donc les ID en base qui correspondent à ces cases.
Du coup, quand l'utilisateur poste le formulaire après avoir coché/décoché différents cases, tu va te retrouver dans $_POST à avoir uniquement les ID cochés.
Du coup, t'as plus qu'à comparer les 2 tableaux, celui de $_POST ayant forcément au mieux le même nb d'ID (donc tout est coché), sinon, moins d'ID. Tous les ID présents dans le tableau qui contenaient tous les ID qui ne sont pas dans $_POST sont donc des ID décochés.
Ex :
Le tableau qui affiche les cases à cocher contient les ID : [1, 2, 3, 4, 5]
Le tableau que tu reçois en $_POST contient, mettons, les ID [2, 3, 5]
T'en déduis que les ID 1 et 4 sont décochés.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed