Veuillez vous connecter ou créer un compte pour suivre ce topic
Ce topic est suivi par: Balatharas, Codeur61
Ce topic a été résolu
Auteur Sujet: ajout de tokens à l'id parrain

Codeur61

Messages: 100

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 !
Publicité

Balatharas

Messages: 646

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

Messages: 100

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

Messages: 646

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

Messages: 100

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

Messages: 646

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

Messages: 100


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

Messages: 646

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

Messages: 100

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

Codeur61

Messages: 100

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

Codeur61

Messages: 100

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

Messages: 100

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

Messages: 100

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

Messages: 646

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

Codeur61

Messages: 100

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

Messages: 646

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

Messages: 100

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

Messages: 646

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

Messages: 100

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

Messages: 646

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

Messages: 100

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

Messages: 646

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

Messages: 100

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

Codeur61

Messages: 100

plus personne ?

Balatharas

Messages: 646

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.

Codeur61

Messages: 100

Salut ! Et bien, j'avais envoyé une demande sur le forum openclassroom pas plus tard que il y a 2-3 heures, et finalement, j'ai réussi !
Je viens te remercier pour ton implication dans mon projet, j'ai plutôt bien compris le code, et appris des choses, donc merci.
Le problème venait de ma dernière requête..
Il fallair remplacer :
$updtParr->execute(array(ceil($parrain['tokens']+$tokensreduits), $parrain['id_parrain']));
Par 
$updtParr->execute(array(ceil($parrain['tokens']+$tokensreduits), $parrain['id']));
C'est pour ça que les tokens s'ajouter au parrain du parrain, car le $parrain était déjà défini comme id_parrain il me semble ..
Cordialement
Poster une réponse