ajout de tokens à l'id parrain

Ce topic a été résolu
Codeur61

Codeur61 Le 28 février 2019 à 00:50 (Édité le 24 mars 2019 à 13:52)

Bonsoir, 
J'ai une "demande" assez particulière, je souhaiterais que vous m'indiquiez le chemin à suivre pour que je puisse développer le code.
J'ai une table membres avec plusieurs champs dont 'id,  'tokens', 'id_parrain'. 
J'ai un submit qui permet d'ajouter à un 'id', un nombre de tokens que l'on souhaite.
Maintenant, pour un système de parrainage, je souhaite faire un style de requete comme celle ci : 

si tokens entree pour id ?, alors ajout dans table membre le nombre de tokens, et si 'id' à un id_parrain, alors, 30% des tokens sont reversés en plus pour lui (donc PAS 70% pour l'id et 30% pour id_parrain, mais bien 100% pour id et 30% des 100% pour id_parrain).


Si quelqu'un pouvait m'éclairer sur ça, sa serait cool. 
Merci d'avance !
Balatharas

Balatharas Le 5 mars 2019 à 20:30

Si je comprend bien, ma reformulation devrait convenir:
On va dire que ya deux membres: l'id 1 et le parrain l'idp 2 (pour id parrain)
Après avoir donné à 1 par exemple 100 tokens, on vérifie si 1 à un parrain. S'il en a un, alors on donne 30 tokens à idp 2 (car 30% de 100 = 30)
Maintenant pour écrire le code il faut que tu me montres le code d'ajout de tokens
Codeur61

Codeur61 Le 6 mars 2019 à 17:28

Oui, c'est cela ! Je ne sais pas, j'ai surement loupé une fonction SQL dans mon apprentissage ? C'est peut être tout simple 😋
if (isset($_POST['formtokens'])) {
        if (isset($_POST['nbr_tokens'], $_POST['userid']) AND !empty($_POST['nbr_tokens']) AND !empty($_POST['userid'])) {
            $userid = $_POST['userid'];
            $nbr_tokens = $_POST['nbr_tokens'];
            $requete = $bdd->prepare('SELECT id FROM membres WHERE id= ?');
            $requete->execute(array($userid));
            $dest_verified = $requete->rowCount();
            if ($dest_verified == 1) {
                $requete = $requete->fetch();
                $requete = $requete['id'];
                $updt = $bdd->prepare('UPDATE membres SET tokens=tokens+ ? WHERE id= ?');
                $updt->execute(array($nbr_tokens, $requete));
                $erreur = "Tokens ajoutés !";
                header('location: administration.php');
            } else {
            $erreur1 = "Ca ne marche pas !";
        }
    }
}
Le voila, merci d'avance pour ton aide. 
Balatharas

Balatharas Le 6 mars 2019 à 17:54 (Édité le 6 mars 2019 à 17:58)

Alors !
$requete = $bdd->prepare('SELECT * FROM membres WHERE id= ?');
$requete->execute(array($userid));
$dest_verified = $requete->rowCount();
if ($dest_verified == 1) {
    $usrTokens = $requete->fetch();
    $updt = $bdd->prepare('UPDATE membres SET tokens = ? WHERE id = ?');
    $updt->execute(array(ceil($usrTokens['tokens']+$nbr_tokens), $usrTokens['id']));
    $erreur = "Tokens ajoutés ".$isparr." !";
    header('location: administration.php');
} else {
    $erreur1 = "Utilisateur introuvable";
} // Ici tu avais oublié une accolade /!\ très importante !!!
Voilà déjà cette partie de corrigée. Jtavoue que je trouve que tu t'embête à vérifier un peu trop l'id ^^ mais bon j'ai laissé quand même c'est toi qui vois.
Ensuite, la fonction ceil permet de ne pas se retrouver avec un nombre de tokens avec une virgule. Si tu t'en fous tu l'enlèves (en n'oubliant pas d'enlever les parenthèses avant $requete et après $nbr_tokens 😉 )
Maintenant on va s'occuper du parrain 😀
Je considère que, si ton id n'a pas de parrain, alors la colonne id_parrain est égale à 0 pour lui.
$usrTokens = $requete->fetch();
$updt = $bdd->prepare('UPDATE membres SET tokens = ? WHERE id = ?');
$updt->execute(array(ceil($usrTokens['tokens']+$nbr_tokens), $usrTokens['id']));

$isparr = ""; // Je définis la variable, comme ça, même si la condition ci-dessous n'aboutit pas, pas d'erreur avec $isparr
if($usrTokens['id_parrain'] != 0) {
   $req = $bdd->prepare('SELECT * FROM membres WHERE id = ?'); // Je cherche le parrain
   $req->execute([$requete['id_parrain']]);
   if(rowCount($req) == 1) { // Je vérifie l'existence du parrain
      $parrain = $req->fetch(); // Je récupère les infos du parrain
      $tokensreduits = ceil($nbr_tokens*0.30); // La je configure le nombre de tokens pour le parrain pour qu'il soit égal à 30% des tokens du membre
      $updtParr = $bdd->prepare('UPDATE membres SET tokens = ? WHERE id = ?');
      $updtParr->execute(array(ceil($parrain['tokens']+$tokensreduits), $parrain['id_parrain']));
      $isparr = "(au parrain aussi)"; // Pour le message 😀
   }
}

$erreur = "Tokens ajoutés ".$isparr." !";
header('location: administration.php');
Et voilà !
Si tu ne comprends pas une partie de mon code n'hésite surtout pas je me ferais une joie de t'expliquer 😀
Pareil s'il y a une erreur 😉
Codeur61

Codeur61 Le 6 mars 2019 à 23:44

Salut, 
Je t'avoue que j'ai pas encore testé le code. Quand je suis les lignes, en essayant de comprendre, je m'arrête sur "ceil" ligne 3. J'ai cherché sur internet, mais e n''ai pas compris pourquoi "retourné un nombre entier".
Pour la requête tout est bon pour moi sauf pour le ceil encore une fois. 
Et dernier petit truc, les crochets pour le execute, ils servent à quoi ? A englober l'id et l'id parrain pour les "réunir" ?
Merci de ton aide 😋
Balatharas

Balatharas Le 7 mars 2019 à 12:43

Bah ceil() permet d’arrondir le nombre si jamais tu te retrouves avec un nombre décimal donc si tu ne veux pas ca, tu l’enlèves 
Et les crochets c’est pour selectionner l’information dans le tableau $parrain, si tu fais var_dump($parrain) tu verras qu’il y a plusieurs valeurs
Codeur61

Codeur61 Le 7 mars 2019 à 22:29


Ah oui ? je n'ai pas vu ça dans les fonctions SQL, du coup j'avais pas trop compris, mais merci pour l’éclaircissement. Dak pour le var_dump, je test tout cela demain. 
Merci.
Balatharas

Balatharas Le 7 mars 2019 à 22:44

C’est normal c’en est pas une 🙄...
Les fonctions sql s’utilisent dans une requête: SELECT * FROM users WHERE date_inscrit = NOW() est une fonction sql par exemple
Codeur61

Codeur61 Le 9 mars 2019 à 11:28

A oui d'accord je test cela de suite. 😋 
Codeur61

Codeur61 Le 9 mars 2019 à 11:30

A oui je n'avais pas lu le commentaire pour l'accolade. En fait, l'accolade est fermée à la fin du code 😋.
Codeur61

Codeur61 Le 9 mars 2019 à 12:47

Alors j'ai tout testé (deuxième fois que je fais le message, bug du site) mais j'ai une erreur PDO qui me dit en gros 
" impossible d'utiliser l'objet de type PDOStatement comme array dans administration.php" l 27
Comme il n'y a pas de array a cet endroit, j'ai donc pensé a en faire un au cas ou, mais rien n'y fait toujours la même erreur. 
J'ai pensé qu'il faudrait faire un fetch de $requete pour id_parrain ? non ? 
Voici mon code :  
Codeur61

Codeur61 Le 9 mars 2019 à 12:50

PHP 
<?php
session_start();
        $bdd = new PDO('mysql:host=localhost;dbname=membres' , 'root', '');
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if (!isset($_SESSION['admin']) OR $_SESSION['admin'] != 112) {
    exit();
}
if (isset($_POST['formtokens'])) {
        if (isset($_POST['nbr_tokens'], $_POST['userid']) AND !empty($_POST['nbr_tokens']) AND !empty($_POST['userid'])) {
            $userid = $_POST['userid'];
            $nbr_tokens = $_POST['nbr_tokens'];
            $requete = $bdd->prepare('SELECT * FROM membres WHERE id= ?');
            $requete->execute(array($userid));
            $dest_verified = $requete->rowCount();
                if ($dest_verified == 1) {
                $usrTokens = $requete->fetch();
                $updt = $bdd->prepare('UPDATE membres SET tokens = ? WHERE id = ?');
                $updt->execute(array(ceil($usrTokens['tokens']+$nbr_tokens), $usrTokens['id']));
                $isparr = ""; // Je définis la variable, comme ça, même si la condition ci-dessous n'aboutit pas, pas d'erreur avec $isparr
                    if($usrTokens['id_parrain'] != 0) 
                    {
                        $req = $bdd->prepare('SELECT * FROM membres WHERE id = ?'); // Je cherche le parrain
                        $req->execute([$requete['id_parrain']]);
                            if(rowCount($req) == 1) { // Je vérifie l'existence du parrain
                            $parrain = $req->fetch(); // Je récupère les infos du parrain
                            $tokensreduits = ceil($nbr_tokens*0.30); // La je configure le nombre de tokens pour le parrain pour qu'il soit égal à 30% des tokens du membre
                            $updtParr = $bdd->prepare('UPDATE membres SET tokens = ? WHERE id = ?');
                            $updtParr->execute(array(ceil($parrain['tokens']+$tokensreduits), $parrain['id_parrain']));
                            $isparr = "(au parrain aussi)"; // Pour le message 😀
                            }
                    $erreur = "Tokens ajoutés ".$isparr." !";
                    header('location: administration.php');
                    }
            }
        }
    }
$reqtok1 = $bdd->query('SELECT * FROM membres');
$reqaffich = $bdd->query('SELECT * FROM membres');
?>
Codeur61

Codeur61 Le 9 mars 2019 à 12:51

HTML (meme page) 
<form method="POST">
            <label>Choisir l'id :</label><br>
            <select class="entree" name="userid">
            <?php while ($t = $reqtok1->fetch()) { ?>
                <option><?php echo $t['id']; ?></option>
            <?php } ?>
            </select>
            <br><br>
            <label>Choisir nombre tokens :</label><br>
            <input type="text" class="entree" name="nbr_tokens"><br>
            <br><br>
            <input type="submit" class="myButton" name="formtokens"><br>
</form>
Balatharas

Balatharas Le 9 mars 2019 à 12:57

Evite de poster 5 fois de suite 😉
Quelle est ta ligne 27 precisément ?
Codeur61

Codeur61 Le 9 mars 2019 à 13:02

Y'avait un problème avec le site, ca a supprimer tout le message 😋 j'ai préféré mettre a la suite.
A oui  la ligne 27, c'est :
$req->execute([$requete['id_parrain']]);
Balatharas

Balatharas Le 9 mars 2019 à 17:09

Mais il y a un array à cette ligne... C'est le [$requete['id_parrain']]
Il faut que tu revois les bases PHP et SQL on dirait
Sinon, essaie de remplacer $requete['id_parrain'] par $usrTokens['id_parrain'] je pense que je me suis trompé là dessus
Par contre que tu n'ai pas vu cette erreur montre que tu n'a pas compris le code.... Je me trompe ?
Car ça veut dire que tu ne vois pas pourquoi j'ai écris ['id_parrain'] en paramètre
Comme je te l'ai dis si tu ne comprend pas il faut pas hésiter
Codeur61

Codeur61 Le 9 mars 2019 à 17:21

J'ai assez bien compris le code pour ma part, je ne savais pas qu'un array pouvait se faire par [ ], mais pour ce qui est de $requete['id_parrain'], ca c'est compris, on demande juste l'id parrain de la $requete. 
J'ai justement relu le code quelques fois pour comprendre le code, qui, en soit, ne me parait pas très compliquer. 
J'avais essayé avec $usrTokens il me semble.. j'ai donc ressayé et la ! bonne et mauvaise nouvelle, alors très compliqué, j'ai suivi le chemin des tokens. En bdd, ca ajoute les 30% à l'id parrain de l'id parrain :( 
En gros, j'ajoute 100 tokens a  id 116, sont id_parrain est 114 mais comme l'id 114 à un id_parrain 1, les 30% sont ajouté à 1 au lieu de 114.
Balatharas

Balatharas Le 9 mars 2019 à 18:25 (Édité le 9 mars 2019 à 18:26)

Hum déjà remplace
if(rowCount($req) == 1) {
par
if($req->rowCount() == 1) {
Je sais pas si ça va changer quelque chose mais je m'étais trompé ici aussi (ça fait longtemps que j'avais pas codé haha), reteste tout, je vais continuer à regarder
Codeur61

Codeur61 Le 9 mars 2019 à 18:44

Je voudrais savoir ça changer quoi de faire la deuxième ligne plutôt que la première ?
Et, j'ai testé, mais comme ça n'est qu'une vérification facultative (il me semble), ca na rien changé, toujours le même problème..
Balatharas

Balatharas Le 9 mars 2019 à 19:01

La première ligne c'est une fonction qui n'existe pas
Et c'est pas du tout facultatif pourquoi tu dis ça ??
Je vois vraiment pas l'erreur, c'est pas normal pour moi le code est correct
Codeur61

Codeur61 Le 9 mars 2019 à 23:30

Ah oui d'accord autant pour moi, je pensais que cette vérification n'était pas nécessaire. 
Oui, également pour moi, je ne comprends donc pas pourquoi l'ajout est fait a un autre id_parrain
Balatharas

Balatharas Le 9 mars 2019 à 23:55

Bah oui elle n’est pas nécessaire mais en soi tout ton code n’est pas nécessaire, c’est toi qui vois si ca l’est ou non. La c’est une vérification pour être sûr que l’utilisateur existe mais l’enlever n’empêchera pas le fonctionnement, sauf s’il existe pas 😀
Je re regarderai le code plus tard je suis sur telephone
Codeur61

Codeur61 Le 14 mars 2019 à 21:32

Salut, 
je up le sujet, n’ayant pas de réponse et pas trouvé de réponse.. merci bien
Codeur61

Codeur61 Le 20 mars 2019 à 17:42

plus personne ?
Balatharas

Balatharas Le 20 mars 2019 à 20:18

Salut ! A vrai dire j’avais oublié.. Mais je ne comprends toujours pas le problème car mon code me semble correct. Si erreur il y a je la vois vraiment pas.
C’est peut-être du a ta table qui a une organisation différente de celle utilisée dans le code, ou des id mal foutus, ou alors j’ai pas compris ta requête et du coup forcement mon code ne marche pas comme tu veux.