Update une colonne suivant valeur = true ou false

Fishing61

Fishing61 Le 18 juin 2019 à 22:39

Bonsoir, 
J'ai un soucis avec mon code qui est censé suivre le programme suivant : 
Si valide = 0 alors on le comptabilise dans un SUM qui regroupe tout les "valide = 0". On affiche ca dans la colonne tokens_invalide de ma table "membres". 
Si valide = 1 alors on le comptabilise dans un SUM qui regroupe tout les "valides = 1". On affiche ça dans la colonne tokens_valide de ma table "membres".
Et donc, si on rend valide = 1 alors il doit forcement refaire un SUM qui regroupe tout les valide = 0 pour recalculer le tout. 
Je ne suis pas très doué en expliquation. Dites moi ce que vous ne comprenez pas. 

L'erreur :  Quand je mets valide à 1 pour chacune des offres, celle ci font un SUM, sont calculés, ajoutés dans tokens_valide etc... sauf que quand je les dévalides, celle ci s'ajoute dans tokens_invalide, ce qui est normal, mais ne sont pas soustrait de tokens_valide.

Mon code. 
if (isset($_GET['valide']) AND !empty($_GET['valide'])) {
   $valide = (int) $_GET['valide'];
   $updt = $bdd->prepare('UPDATE tokens SET valide = 1 WHERE id_camp = ?');
   $updt->execute(array($valide));
   $updt2 = $bdd->prepare('SELECT SUM(nb_tokens) AS total1 FROM tokens WHERE id_membre = ? AND valide = 1');
   $updt2->execute(array($identifiant));
   $leFetch2 = $updt2->fetch();
   $nbrTokens2 = $leFetch2['total1'];
   $ajout_tokens2 = $bdd->prepare('UPDATE membres SET tokens_valide = ? WHERE id = ?');
   $ajout_tokens2->execute(array($nbrTokens2, $identifiant));
   $compte1 = $bdd->prepare('SELECT COUNT(id_camp) AS nbrcamp FROM tokens WHERE id_membre = ? AND valide = 1');
   $compte1->execute(array($identifiant));
   $leFetch3 = $compte1->fetch();
   $nbrCamp1 = $leFetch3['nbrcamp'];
   if ($nbrCamp1 < 1) {
      $reset_tokens = $bdd->prepare('UPDATE membres SET tokens_valide = 0 WHERE id = ?');
      $reset_tokens->execute(array($identifiant));
   }
}
if (isset($_GET['devalide']) AND !empty($_GET['devalide'])) {
   $devalide = (int) $_GET['devalide'];
   $updt = $bdd->prepare('UPDATE tokens SET valide = 0 WHERE id_camp = ?');
   $updt->execute(array($devalide));
   $updt1 = $bdd->prepare('SELECT SUM(nb_tokens) AS total FROM tokens WHERE id_membre = ? AND valide = 0');
   $updt1->execute(array($identifiant));
   $leFetch = $updt1->fetch();
   $nbrTokens = $leFetch['total'];
   $ajout_tokens = $bdd->prepare('UPDATE membres SET tokens_invalide = ? WHERE id = ?');
   $ajout_tokens->execute(array($nbrTokens, $identifiant));
   $compte2 = $bdd->prepare('SELECT COUNT(id_camp) AS nbcamp1 FROM tokens WHERE id_membre = ? AND valide = 0');
   $compte2->execute(array($identifiant));
   $leFetch6 = $compte2->fetch();
   $nbrCamp2 = $leFetch6['nbcamp1'];
   if ($nbrCamp2 < 1) {
      $reset_tokens1 = $bdd->prepare('UPDATE membres SET tokens_invalide = 0 WHERE id = ?');
      $reset_tokens1->execute(array($identifiant));
   }
}
Merci d'avance pour votre aide.
Balatharas

Balatharas Le 19 juin 2019 à 00:34

Salut, alors honnêtement j'ai pas bien compris ton code d'autant plus que tu viens de m'apprendre l'existence de SUM()
Mais j'ai l'impression que c'est une sorte de regroupement de données de différentes lignes je me trompe ? J'ai cherché mais les tutos écrits c'a jamais été mon truc.
Donc si je comprend bien ton pb c'est que lorsque tu passes un token de valide à invalide (et vice versa) tu crées un SUM de tokens invalides et un autre de tokens valides
Sauf que quand tu fais basculer une offre d'un statut à l'autre, elle se retrouve dans les deux SUM.
Si c'est bien cela pourquoi ne pas, avant de changer le statut du token, sélectionner ce token dans ton SUM concerné (celui d'où il doit disparaître) et tout simplement le retirer ?
Ou alors même trouver un autre moyen de regrouper ce que tu veux
Comme je t'ai dis c'est très flou dans ma tête la donc si tu m'expliques ton contexte et à quoi servent tes SUM je serais plus apte à t'aider 😉
Fishing61

Fishing61 Le 19 juin 2019 à 18:16

Salut, 
Oui pour le SUM, j'ai également cherché, j'avais déjà entendu parlé de cette fonction donc j'ai tout simplement marqué "fonction pour regrouper des données" sur le fameux Google 😄
Donc oui tu as bien compris mon code, et le Count que tu peux voir, c'est pour pallier à un ptit bug.. 
Tu as également compris mon problème.
Hum, justement, j'y ai pensé, mais c'est plus lourd en requête non ? 
Et sinon, si jamais j'envisageais ça, je passe par un update avec une soustraction ? (je crois que c'est possible mais je ne trouve pas comment faire)
Ou un DELETE peut être ?
J'aimerais être éclairé sur ces deux requêtes car je ne les maîtrise pas 😋

Au passage, mon code pour récupérer en $_GET est le suivant : 
      <?php while ($fetch = $tokens_attente->fetch()) { ?>
         <li>Campagne : <?= $fetch['object_tokens']; ?> - Nombre tokens : <?= $fetch['nb_tokens']; ?> | 
            <?php if ($fetch['valide']== 0) { ?>
            <a href="index.php?valide=<?= $fetch['id_camp']; ?>">Valider !</a> 
            <?php } else if ($fetch['valide']== 1) { ?>
            | <a href="index.php?devalide=<?= $fetch['id_camp']; ?>">Dé-valider !</a>
            <?php } ?>
         </li>
      <?php } ?>
Merci d'avance @balatharas
Balatharas

Balatharas Le 19 juin 2019 à 18:35

En fait le UPDATE met à jour la colonne d'une ligne et tu cible la ligne la plupart du temps avec la colonne id mais ça peut être n'importe quelle colonne
DELETE supprime une ligne complètement et tu la cibles de la même manière
Comme je sais pas comment fonctionne le SUM je peux pas t'aider la dessus
Mais à ta place j'aurais créé deux tables: tokens_valides et tokens_invalides.
Dans ces tables tu mets ces colonnes: id (auto increment, index primaire), id_camp
Certes ça te fais deux tables en plus mais sans trop de colonne ça va et comme ça c'est mieux organisé (en tout cas pour moi)
Dans le cas là, si tu veux basculer un token de valide à invalide, alors tu n'aurais plus qu'à utiliser $_GET['devalide'] pour sélectionner le token dans la table tokens_valides pour le récupérer, l'insérer dans la table tokens_invalides puis le supprimer de tokens_valides
Encore une fois c'est pas exactement comme ça que ça serait car je ne connais ni le contexte (avec tes "campagnes") ni les autres paramètres de tes tokens.
Il faut avant tout tester et creuser creuser creuser...
En espérant t'aider au mieux
Fishing61

Fishing61 Le 19 juin 2019 à 18:45

Oui, le SUM regroupent simplement les informations d'une colonne en les additionnant. Par exemple la j'ai dit : additionne tous les nb_tokens entre eux pour le membre 1 et quand valide = 1 (ou 0).
Sinon pour le sum j'en sais pas + 😋 je l’inaugure. 
Hum, deux tables, pourquoi faire ? Ca ne changera rien , si ? Je n'ai pas bien compris pourquoi. 
Donc il faudrait que j'utilise UPDATE si je comprends bien. Et, sais-tu comment faire une soustraction donc ? Comme ca je peux faire la SUM comme j'ai expliqué au dessus, et quand, par exemple je recois $_GET['devalide'], alors, je fais un update en prenant nb_tokens pour l'id_camp selectionné, et je soustrais ce nb_tokens a l'id qui possède l'id_camp. C'est possible ça ? Encore une fois, je crois que j'ai du mal a expliqué oops :(
Balatharas

Balatharas Le 19 juin 2019 à 19:05

Oui c'est vrai j'ai rien compris ^^'
Mon problème c'est qu je visualise mal le SUM et son fonctionnement
Si tu fais un var_dump($nbrTokens2); ça donne quoi ?
Fishing61

Fishing61 Le 22 juin 2019 à 10:26

Donc j'ai fait le vardump et quand je clique sur "valider", voici ce que ca me donne -> C:\wamp64\www\test\index.php:27:string '50' (length=2)
Et quand je reclique ensuite sur "dévalider", j'ai une erreur a ma ligne 77 qui est donc "undefined variable " qui n'est autre que ma ligne : 
<?php echo $error; ?> 
Je pense que c'est naturel comme erreur mais je préfère la notifier.
Merci
Balatharas

Balatharas Le 22 juin 2019 à 20:24

Alors franchement j'ai du mal avec tes SUM je comprend vraiment pas comment ça marche...
Si tu fais une requete SQL je sais pas si tu peux sélectionner le SUM pour en faire un fetch et afficher le fetch avec un var_dump
Ce serait quelque chose comme $sel = $bdd->prepare('SELECT SUM..........'); $sel->execute([]); var_dump($sel->fetch());
Et pour ton erreur à la ligne 77 c'est parce que tu dois veiller a appeler ta variable que si elle existe:
<?php
if(isset($error) AND !empty($error)) {
   echo "Erreur: ".$error;
}
?>
yvesroland

yvesroland Le 24 juin 2019 à 10:04

Bonjour à tous, en fait le SUM @Balatharas permet de faire la somme des valeurs d'une colonne contenant des valeurs numériques. Par exemple si tu a une table produit avec pour champs : id, designation, quantite, pixUnitaire; tu peux faire une requete du genre: SELECT SUM(quantite) FROM produit. Cette requete va te retourner la somme de toute les valeurs contenues dans la colonne quantite.
Balatharas

Balatharas Le 24 juin 2019 à 19:32

Ah je vois ^^ merci @yvesroland .
Donc @Fishing61 je pense qu'il faudrait que tu fasses quelque chose comme:
- SELECT SUM(quantite) FROM produit
Ensuite fais un fetch puis un var_dump du fetch pour être sûr que tout va bien
Tu gardes bien le SUM sélectionné dans une variable $sumtotal par exemple
Ensuite tu supprime ce SUM, tu ajoutes 1 à $sumtotal et tu crées un nouveau SUM que tu remplis avec $sumtotal
Tu fais pareil pour enlever le token de l'autre SUM en soustrayant 1
Ou alors tu update
Je sais pas si c'est bien expliqué 😅
yvesroland

yvesroland Le 25 juin 2019 à 09:15

@Balatharas 🙌😊
Fishing61

Fishing61 Le 5 juillet 2019 à 19:16

Salut, je reviens après quelque jours d'attente, étant occupé. 
Merci pour ces réponses, disons que je suis a demi éclairé 😋
Je comprends le principe, d'ajouter et de soustraire, mais je ne vois pas comment implémenter cela dans mon code, je ne comprends pas vraiment comment faire cette addition ou cette soustraction suivant l'action faite.
Cordialement
Merci @Balatharas et @yvesroland
Balatharas

Balatharas Le 9 juillet 2019 à 12:06

Salut, c'est normal je fais souvent ça, je fais d'abord une explication vite fait et si vraiment c'est pas compris je rentre dans les détails
Pour commencer
Donc @Fishing61 je pense qu'il faudrait que tu fasses quelque chose comme:
- SELECT SUM(quantite) FROM produit
Ensuite fais un fetch puis un var_dump du fetch pour être sûr que tout va bien
Tu l'as fait ça ?
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte