données qui ne s'écrivent pas dans la bdd

Ce topic a été résolu
babawana

babawana Le 8 janvier 2019 à 22:43 (Édité le 25 janvier 2019 à 17:54)

Bonsoir, Je viens vers vous après mainte et mainte essais. Je ne comprends toujours pas pourquoi ? J'ai plusieurs table dont la table "membres" avec pseudo, email...et j'ai la table tokens, avec id_membre, tokens, tokens_attente Je ne comprends pas pourquoi quand je clique sur le submit, aucune information n'est retenu dans la bdd.Je souhaite entrer un nombre. Voici mon code


<?php
session_start();

 
include 'req.php';
 if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) {
   if(isset($_POST['formtokens'])) {
      if(isset($_POST['id_membre'],$_POST['tokens_attente']) AND !empty($_POST['id_membre']) AND !empty($_POST['tokens_attente'])) {
         $id_membre = htmlspecialchars($_POST['id_membre']);
         $attentetokens = htmlspecialchars($_POST['tokens_attente']);
         $id_destinatairetokens = $bdd->prepare('SELECT id FROM membres WHERE pseudo = ?');
         $id_destinatairetokens->execute(array($id_membre));
         $dest_exist = $id_destinatairetokens->rowCount();
         if($dest_exist == 1) {
            $id_destinatairetokens = $id_destinatairetokens->fetch();
            $id_destinatairetokens = $id_destinatairetokens['id'];
            $ins = $bdd->prepare('INSERT INTO tokens(id_membre,tokens_attente) VALUES (?,?)');
            $ins->execute(array($_SESSION['id'],$id_destinatairetokens,$attentetokens));
            $error = "Votre ajout a bien été effectué !";
         } else {
            $error = "Cet utilisateur n'existe pas...";
         }
      } else {
         $error = "Veuillez compléter tous les champs";
      }
   }
   $destinataires = $bdd->query('SELECT pseudo FROM membres ORDER BY pseudo');
 
 ?>

et le formulaire

<form method="POST" action="">
      <label>Destinataire:</label>
         <select name="id_membre">
            <?php while($d = $destinataires->fetch()) { ?>
            <option><?= $d['pseudo'] ?></option>
            <?php } ?>
         </select>
         <br /><br />
      <input type="text" placeholder="argent en attente" id="attentetokens" name="attentetokens" />
      <br /><br />
      <input type="submit" name="formtokens" value="Ajouter !" />
      <?php if(isset($error)) { 
         echo '<font color="red"'.$error.'</font>'; 
      } ?>
</form>
KingEwin

KingEwin Le 9 janvier 2019 à 21:57 (Édité le 9 janvier 2019 à 22:00)

Bonsoir @babawana[url=https://www.primfx.com/profil/babawana/]
[/url]
J'ai repris ton code est je les fait fonctionné. Il ya fait de nombreuses erreurs que je vais essayer de te lister pour que tu ne les refasses plus après.

Premièrement : Tu confond les champs name dans ton formulaire, ils sont vital pour la bonne réception des données en PHP. Le champ name doit exactement correspondre au champ POST ou GET que tu traite par la suite. Tu avait mis if(isset($_POST['pseudo'])), tu devais mettre ->  if(isset($_POST['id_membre']))  exemple :
 

Deuxièmement : La valeur du champs value dans un select->option est très importante, c'est cette valeur que contiendra ta variable php par la suite, toi tu ne l'avais pas spécifier, ta variable était donc vide a l'envoi du formulaire.

Troisièmement : Comme a dit @VemoTech, tu t'étais tromper a cette ligne -> $id_exist = $id->rowCount();
c'est plutôt -> $id_exist=$idtokens->rowCount(), puisque tu récupère la valeur de la variable $idtokens que tu as fait juste avant (c'est elle qui contient ta requête select). Ensuite, ta requête $idtokens = $id->fetch();  $idtokens = $id['id']; est inutile. puisque je te fais récupérer la valeur de l'id correspondant au pseudo choisie dans le select (grace a l'attribut value dont je te parlé plus haut). Et en plus, tu fais un rowCount() pour vérifier si l'id existe bien donc pas de soucis au niveau des erreurs.

Quatrièmement : Ce n'est pas un INSERT INTO que tu dois faire, mais un UPDATE. Les champs dont déjà renseigner dans ta BDD, alors il faut juste que tu modifie le champs que tu souhaite modifier selon l'utilisateur grace a son ID. En effet, une requête insert t'oblige a insérer un nouvelle ligne de tous les champs qui compose ta table.Un update lui modifie ce qu'on veut a une ligne déjà crée auparavant.

ps : Je te conseille d'utiliser la fonction var_dump($taVariable); ça te permet de faire du debbogage et connaitre la ou les valeurs de tes variables, ça fait gagner beaucoup de temps quand on est coincer 

CODE : 

HTML : 


PHP :
Meilleure réponse
Profil introuvable

Profil introuvable Le 9 janvier 2019 à 02:22 (Édité le 9 janvier 2019 à 02:24)

Hello @babawana,

C'est normal qu'à la ligne :
<form method="POST" action="">
"action" soit vide ? Puisque c'est là que l'action se fait, si c'est vide, les données sont envoyées où ?
Et tu n'as pas reçu de message d'erreur par rapport à la syntaxe du code ? Si oui ça pourrait aider à avancer 😉
KingEwin

KingEwin Le 9 janvier 2019 à 13:09 (Édité le 9 janvier 2019 à 13:25)

Salut @babawana

Quand tu essai d’insérer tes valeurs, dans ta requête prepare tu attend 2 paramètres (VALUES (?,?) ).


Cependant quand tu l’exécutes en bas, tu passes dans ton array 3 paramètre, la $session['id'], $id_destinatairetokens et $attentetokens c'est pour ça que ta requête ne s’insère pas.



Tu dois uniquement insérer les paramètres que tu demandes dans ta requête comme ceci :


Et si donc si tu souhaite faire une requête en y ajoutant le session id tu fais comme ceci :


De plus, tu as une erreur sur la récupération des données de ton formulaire avec ton POST. Tu enregistres dans la variable attentetokens ceci ->  $attentetokens = htmlspecialchars($_POST['tokens_attente']);
Mais 'tokens_attente' n'existe pas dans ton formulaire, tu dois avoir la même donnée que celle que tu as remplie dans le champs name du formulaire. C'est a dire 'attentetokens'. Donc tu auras maintenant :



Et pour répondre à la question de @Jerem971,on n'est pas obligé de spécifier une action sur un formulaire. Si l'action est vide il fera le traitement du formulaire sur la page courante (c'est a dire la même page).
babawana

babawana Le 9 janvier 2019 à 14:16

Merci pour vous reponses ! 
Comme ceci ?
   <form method="POST" action="">
      <label>Destinataire:</label>
         <select name="id_membre">
            <?php while($d = $destinataires->fetch()) { ?>
            <option><?= $d['pseudo'] ?></option>
            <?php } ?>
         </select>
         <br /><br />
      <input type="text" placeholder="argent en attente" id="tokens_attente" name="tokens_attente" />
      <br /><br />
      <input type="submit" name="formtokens" value="Ajouter !" />
      <?php if(isset($error)) { 
         echo '<font color="red"'.$error.'</font>'; 
      } ?>
   </form>



 
<?php 
session_start();

include 'req.php';

if(isset($_SESSION['id'])) {
      if(isset($_POST['formtokens'])) {
            if(isset($_POST['id_membre'],$_POST['tokens_attente'])) {
               $id_membre = htmlspecialchars($_POST['id_membre']);
               $tokens_attente = htmlspecialchars($_POST['tokens_attente']);
               $id_destinatairetokens = $bdd->prepare('SELECT id FROM membres WHERE pseudo = ?');
               $id_destinatairetokens->execute(array($id_membre));
               $dest_exist = $id_destinatairetokens->fetchColumn();
            if($dest_exist == 1) {
                  $id_destinatairetokens = $id_destinatairetokens->fetch();
                  $id_destinatairetokens = $id_destinatairetokens['id'];
                  $ins = $bdd->prepare(statement: 'INSERT INTO tokens([membres],id_membre,tokens_attente) VALUES (?,?,?)')
                  $ins->execute(array($_SESSION['id'],$id_destinatairetokens,$tokens_attente));
            $error = "Votre ajout a bien été effectué !";
         } else {
            $error = "Cet utilisateur n'existe pas...";
         }
      } else {
         $error = "Veuillez compléter tous les champs";
      }
   }
   $destinataires = $bdd->query('SELECT pseudo FROM membres ORDER BY pseudo');
 ?>


J'ai une erreur je pense à cause du 'statement'.
"Parse error: syntax error, unexpected ':', expecting ',' or ')' in /htdocs/ajout-tokens.php on line 17"
KingEwin

KingEwin Le 9 janvier 2019 à 15:52

Fais attention, à la ligne 19 tu as mis $ins = $bdd->prepare('INSERT INTO tokens([membre], id_me................). il ne faut pas mettre les "[ ]" moi je te l'es est mis en exemple ^^

Du coup ta requête sera comme ça : $ins = $bdd->prepare('INSERT INTO tokens(membre, id_membre, tokens_attente) VALUES(?,?,?)');

Et pour ton erreur je pense aussi avoir trouver, tu as oublié le ; a la fin de ta requête.

Que représente ton champs membre dans ta requête INSERT ? parce que tu lui passe après un SESSION['id'] donc ça doit être obligatoirement un champ de type int. Tu devrais plutôt l'appeler id_membre au lieu de membre (c'est une convention en générale). ça peut porter a confusion 😁
babawana

babawana Le 9 janvier 2019 à 17:47

Pour faire + simple, j'ai finalement créé une nouvelle colonne dans ma table 'membres' nommée 'tokens_attente'.
Rien ne fonctionne toujours :(
Pour ce qui est de mon 'id' il est en 'AI' int 11.

Voilà, maintenant, mon code refait.

<?php session_start();

include 'req.php';

if(isset($_SESSION['id'])) {
   if(isset($_POST['formtokens'])) {
      if(isset($_POST['pseudo'],$_POST['tokens_attente'])) {
         $pseudo = ($_POST['pseudo']);
         $tokens_attente = ($_POST['tokens_attente']);
         $idtokens = $bdd->prepare('SELECT id FROM membres WHERE pseudo = ?');
         $idtokens->execute(array($pseudo));
         $id_exist = $id->rowCount();
         if($id_exist == 1) {
            $idtokens = $id->fetch();
            $idtokens = $id['id'];
            $ins = $bdd->prepare('INSERT INTO membres(id,pseudo,tokens_attente) VALUES (?,?,?)');
            $ins->execute(array($_SESSION['id'],$pseudo,$tokens_attente));
            $error = "Votre ajout a bien été effectué !";
         } else {
            $error = "Cet utilisateur n'existe pas...";
         }
      } else {
         $error = "Veuillez compléter tous les champs";
      }
   }
   $destinataires = $bdd->query('SELECT pseudo FROM membres ORDER BY pseudo');

 ?>

HTML

<form method="POST" action="">
      <label>Destinataire:</label>
         <select name="id_membre">
            <?php while($d = $destinataires->fetch()) { ?>
            <option><?= $d['pseudo'] ?></option>
            <?php } ?>
         </select>
         <br /><br />
      <input type="text" placeholder="argent en attente" id="tokens_attente" name="tokens_attente" />
      <br /><br />
      <input type="submit" name="formtokens" value="Ajouter !" />
      <?php if(isset($error)) { 
         echo '<font color="red"'.$error.'</font>'; 
      } ?>
   </form>
 Merci encore à toi 😋
Doppler

Doppler Le 9 janvier 2019 à 19:34 (Édité le 9 janvier 2019 à 19:38)

Bonjour @babawana !
Ton problème d'insertion des données du formulaire dans ta bdd est dû à une variable non déclarée : $id !
<?php $id_exist = $id->rowCount(); ?>

C'est au niveau de ta vérification de l'id 😉
Le code ressemblerais plutôt à cela :
<?php 
   //Variables
   $pseudo = htmlspecialchars($_POST['pseudo']);
   $tokens_attente = htmlspecialchars($_POST['tokens_attente']);

   $idtokens = $bdd->prepare('SELECT id FROM membres WHERE pseudo = ?');
   $idtokens->execute(array($pseudo));
   $id_exist = $idtokens->rowCount();
   if($id_exist == 1) {
      //mon code d'insertion de bdd
   }
?>

Et n'oublie pas d'avoir toujours le réflexe d'ajouter le htmlspecialchars dans tes $_POST 😉
En espérant t'avoir aidé,

~A
babawana

babawana Le 9 janvier 2019 à 20:40

Merci beaucoup encore pour votre aide 😉 Mais toujours aucun résultat, je ne comprends pas, j'ai visionné plusieurs tutos, mais toujours rien.
Je vous explique ce que je souhaites faire avec ce code. 
Je veux modifier le champ tokens_attente qui a pour valeur 0, en toute autre valeur. (1,2,3..100...200..)
Je souhaite modifier ce champs pour une seul personne que je choisi dans mon <select>. 
C'est pourtant ce que j'ai entreprit de faire, mais toujours aucun resultat. 

<?php 
session_start();
include 'req.php';
if(isset($_SESSION['id'])) {
   if(isset($_POST['formtokens'])) {
      if(isset($_POST['pseudo'],$_POST['tokens_attente'])) {
        $pseudo = htmlspecialchars($_POST['pseudo']);
         $tokens_attente = htmlspecialchars($_POST['tokens_attente']);
         $idtokens = $bdd->prepare('SELECT id FROM membres WHERE pseudo = ?');
          $idtokens->execute(array($pseudo));
         $id_exist = $idtokens->rowCount();
         if($id_exist == 1) {
            $idtokens = $id->fetch();
            $idtokens = $id['id'];
            $ins = $bdd->prepare('INSERT INTO membres(id,pseudo,tokens_attente) VALUES (?,?,?)');
            $ins->execute(array($_SESSION['id'],$pseudo,$tokens_attente));
            $error = "Votre ajout a bien été effectué !";
         } else {
            $error = "Cet utilisateur n'existe pas...";
         }
      } else {
         $error = "Veuillez compléter tous les champs";
      }
   }
   $destinataires = $bdd->query('SELECT pseudo FROM membres ORDER BY pseudo');
 ?>


Merci
KingEwin

KingEwin Le 9 janvier 2019 à 21:57 (Édité le 9 janvier 2019 à 22:00)

Bonsoir @babawana[url=https://www.primfx.com/profil/babawana/]
[/url]
J'ai repris ton code est je les fait fonctionné. Il ya fait de nombreuses erreurs que je vais essayer de te lister pour que tu ne les refasses plus après.

Premièrement : Tu confond les champs name dans ton formulaire, ils sont vital pour la bonne réception des données en PHP. Le champ name doit exactement correspondre au champ POST ou GET que tu traite par la suite. Tu avait mis if(isset($_POST['pseudo'])), tu devais mettre ->  if(isset($_POST['id_membre']))  exemple :
 

Deuxièmement : La valeur du champs value dans un select->option est très importante, c'est cette valeur que contiendra ta variable php par la suite, toi tu ne l'avais pas spécifier, ta variable était donc vide a l'envoi du formulaire.

Troisièmement : Comme a dit @VemoTech, tu t'étais tromper a cette ligne -> $id_exist = $id->rowCount();
c'est plutôt -> $id_exist=$idtokens->rowCount(), puisque tu récupère la valeur de la variable $idtokens que tu as fait juste avant (c'est elle qui contient ta requête select). Ensuite, ta requête $idtokens = $id->fetch();  $idtokens = $id['id']; est inutile. puisque je te fais récupérer la valeur de l'id correspondant au pseudo choisie dans le select (grace a l'attribut value dont je te parlé plus haut). Et en plus, tu fais un rowCount() pour vérifier si l'id existe bien donc pas de soucis au niveau des erreurs.

Quatrièmement : Ce n'est pas un INSERT INTO que tu dois faire, mais un UPDATE. Les champs dont déjà renseigner dans ta BDD, alors il faut juste que tu modifie le champs que tu souhaite modifier selon l'utilisateur grace a son ID. En effet, une requête insert t'oblige a insérer un nouvelle ligne de tous les champs qui compose ta table.Un update lui modifie ce qu'on veut a une ligne déjà crée auparavant.

ps : Je te conseille d'utiliser la fonction var_dump($taVariable); ça te permet de faire du debbogage et connaitre la ou les valeurs de tes variables, ça fait gagner beaucoup de temps quand on est coincer 

CODE : 

HTML : 


PHP :
Meilleure réponse
babawana

babawana Le 11 janvier 2019 à 18:23 (Édité le 11 janvier 2019 à 18:24)

Salut, @kingewin 
Vraiment un grand merci, je suppose que tu y as passé beaucoup de temps.. 
J'avais pas trop de temps cette semaine, examen.. 
Seulement, les ' Statement: ' ne passe absolument pas. 

        $idtokens = $bdd->prepare( statement: 'SELECT id FROM membres WHERE id = ?');

Autant dire que je ne sais pas a quoi cela sert, j'ai chercher sur PHP, W3schools, je comprends rien :(
Peut être est-ce un plugin à ajouter dans  sublim text ?
A chaque fois que je le mets, ça me met cette erreur :
'Parse error: syntax error, unexpected ':', expecting ',' or ')' in /htdocs/ajout-tokens.php on line 10'
Merci
KingEwin

KingEwin Le 12 janvier 2019 à 00:51

Salut,

Ne fais pas attention au statement, ils sont là en élément « decoratif « , c’est Mon IDE qui le rajoute automatiquement, statement veut dire requête, donc en gros il attend une requête sql. Toi ne le rajoute pas 
babawana

babawana Le 12 janvier 2019 à 13:20

Salut, 
C'est bon !
Le problème est maintenant réglé, merci à tous de m'avoir aidé ! :P
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte