Update une colonne suivant valeur = true ou false
- Accueil
- Forum
- Programmation
- PHP
- Update une colonne suivant valeur = true ou false
Fishing61 Le 18 juin 2019 à 22:39 (Édité le 1 janvier 1970 à 01:00)
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 Le 19 juin 2019 à 00:34 (Édité le 1 janvier 1970 à 01:00)
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 Le 19 juin 2019 à 18:16 (Édité le 1 janvier 1970 à 01:00)
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 Le 19 juin 2019 à 18:35 (Édité le 1 janvier 1970 à 01:00)
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 Le 19 juin 2019 à 18:45 (Édité le 1 janvier 1970 à 01:00)
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 Le 19 juin 2019 à 19:05 (Édité le 1 janvier 1970 à 01:00)
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 Le 22 juin 2019 à 10:26 (Édité le 1 janvier 1970 à 01:00)
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 Le 22 juin 2019 à 20:24 (Édité le 1 janvier 1970 à 01:00)
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 Le 24 juin 2019 à 10:04 (Édité le 1 janvier 1970 à 01:00)
Balatharas Le 24 juin 2019 à 19:32 (Édité le 1 janvier 1970 à 01:00)
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é 😅
Fishing61 Le 5 juillet 2019 à 19:16 (Édité le 1 janvier 1970 à 01:00)
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 Le 9 juillet 2019 à 12:06 (Édité le 1 janvier 1970 à 01:00)
Pour commencer
Donc @Fishing61 je pense qu'il faudrait que tu fasses quelque chose comme:Tu l'as fait ça ?
- SELECT SUM(quantite) FROM produit
Ensuite fais un fetch puis un var_dump du fetch pour être sûr que tout va bien