Page 1 sur 1

[PHP-MYSQL] même auto-increment sur 2 tables différentes

Posté : 13 janv. 2015, 11:51
par jeanmaki
Bonjour,

Je fait actuellement un questionnaire en ligne, avec une inscription avant de répondre aux questions.

Pour cela j'ai créer 3 tables dans mysql, une table user, une table liste_questions et une table reponses_user

J'aimerai que le auto_increment de l'user, se retrouve dans la table reponse_user lorsque le participant à répondu à la question.

Le problème c'est que si il y a deux user qui on le même nom et bien l'auto-increment ajouté est celui du premier user (et j'aimerai bien que ce soit celui du deuxieme)

voici mon code :

connexioncontroller.php

public function executeIndex(\Library\HTTPRequest $request)
  {
     
     
     
    unset($_SESSION['auth']);
    unset($_SESSION['player_name']);
     
         
      
     
      
      $player = new \Library\Entities\Player(array(
       
        'player_name' => $request->postData('player_name'),
        'player_mail' => $request->postData('player_mail')
         
      ))
      ;
       
     
     
     $formBuilder = new \Library\FormBuilder\PlayersFormBuilder($player);
     $formBuilder->build();
     
     $form = $formBuilder->form();
      
      
  
     
    if($request->method() == 'POST' && $form->isValid())
     
    {
         
      $this->managers->getManagerOf('Players')->save($player);
      $this->app->user()->setFlash('Votre compte a bien été crée ;-)');
    }
     
 
         
    $this->page->addVar('form', $form->createView());
    $this->page->addVar('title', '1ere question');
    $this->page->addVar('title', 'Connexion');
     
    if ($request->postExists('player_name'))
    {
      $player_name = $request->postData('player_name');
      $player_mail = $request->postData('player_mail');
       
       
      if (!empty($player_name) && !empty($player_mail))
      {
       
        $_SESSION['player_name'] = $player_name;
        $this->app->user()->setAuthenticated(true);
        $this->app->httpResponse()->redirect('/questions-1.html');
         
      }
      else
      {
        $this->app->user()->setFlash('Le pseudo ou le mot de passe est incorrect.');
         
      }
    }
  }
}



QuestionController.php

public function executeShow(\Library\HTTPRequest $request)
      
  {
   
      
      $infos_questions = $this->managers->getManagerOf('Questions')->getQuestion($request->getData('id'));
       
      $infos_player = $this->managers->getManagerOf('Players')->getPlayers($_SESSION['player_name']);
      
       
       
       
      $reponse = new \Library\Entities\Reponse(array(
         
         
        'numero_question' => $request->getData('id'),
        'id_player' => $infos_player['id_player'],
        'question' => $infos_questions['question'],
        'choix1' => $infos_questions['choix1'],
        'choix2' => $infos_questions['choix2'],
        'choix3' => $infos_questions['choix3'],
        'reponse' => $request->postData('reponse')
      ))
      ;
       
       
   
     
     $formBuilder = new \Library\FormBuilder\QuestionsFormBuilder($reponse);
     $formBuilder->build();
     
     $form = $formBuilder->form();
      
      
  
     
    if($request->method() == 'POST' && $form->isValid())
     
    {
     
     
          
            $reponse_question = $infos_questions['reponse'];
 
                      if ($reponse_question == $request->postData('reponse'))
                       
                          {
                           
                               
                              $this->managers->getManagerOf('Reponses')->save($reponse);
                              $this->app->user()->setFlash('Votre réponse a bien été ajoutée ;-)');
                              $this->app->httpResponse()->redirect('questions-'.$request->getData_next('id').'.html');
                               
                               
                          }
                       
                      else
               
                          {
                               
                              $this->managers->getManagerOf('Reponses')->save($reponse);
                              $this->app->user()->setFlash('Votre réponse est fausse et votre session a expiré');
                              $this->app->httpResponse()->redirect('/');
                               
                               
                          }
                           
    }  
     
 
         
    $this->page->addVar('infos_questions', $infos_questions);
    $this->page->addVar('form', $form->createView());
    $this->page->addVar('title', '1ere question');
     
  }

PlayersManager_PDO.php
protected function add(Player $player)
  {
     
    $q = $this->dao->prepare('INSERT INTO user SET  player_mail = :player_mail, player_name = :player_name,  date = NOW()');
     
    $q->bindValue(':player_name', $player->player_name());
    $q->bindValue(':player_mail', $player->player_mail());
     
    $q->execute();
     
     
    $player->setId($this->dao->lastInsertId());
  }
   
  public function getPlayers($id)
       
      {
         
        $q = $this->dao->prepare('SELECT * FROM user WHERE player_name = :id_player');
        $q->bindValue(':id_player', $id);
        $q->execute();
     
        $q->setFetchMode(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, '\Library\Entities\Player');
     
        return $q->fetch();
         
      }

ReponseManager_PDO.php
protected function add(Reponse $reponse)
  {
     
    $q = $this->dao->prepare('INSERT INTO reponses_utilisateurs SET  id_session = :id_player, reponse = :reponse, question = :question, numero_question = :numero_question,  date = NOW()');
     
    $q->bindValue(':id_player', $reponse->id_player());
    $q->bindValue(':numero_question', $reponse->numero_question());
    $q->bindValue(':question', $reponse->question());
    $q->bindValue(':reponse', $reponse->reponse());
     
    $q->execute();
     
    $reponse->setId($this->dao->lastInsertId());
     
     
  }
Merci de m'éclairer

Re: [PHP-MYSQL] même auto-increment sur 2 tables différentes

Posté : 13 janv. 2015, 14:28
par Mazarini
Par définition, l'auto-incrément se calcule tout seul pour chaque table. On ne peut rien y faire.
Par contre, il est possible de faire une seule table ou de "supprimer" l'auto-incrément de la seconde table et de gérer sa valeur manuellement en prenant celui de la première table.

Re: [PHP-MYSQL] même auto-increment sur 2 tables différentes

Posté : 13 janv. 2015, 15:18
par ynx
Salut,

Ton problème vient de la méthode getPlayers() qui utilise le nom du joueur pour récupérer les infos.
Comme tu l'as deviné, si 2 joueurs ont le même nom, ta méthode getPlayers() retourne le premier trouvé dans la bdd.

Ta méthode getPlayers (que j'aurai plutôt renommé getPlayer puisqu'elle ne retourne les infos que d'un utilisateur) doit donc se baser sur l'identifiant unique du joueur (l'id auto increment) et pas sur le nom.

Bonne journée

Re: [PHP-MYSQL] même auto-increment sur 2 tables différentes

Posté : 15 janv. 2015, 11:36
par jeanmaki
Merci pour vos réponses,

J'ai essayé de modifier le getplayers comme ceci :

public function getPlayers($id)

{

$q = $this->dao->prepare('SELECT * FROM user WHERE id_player = :id_player');
$q->bindValue(':id_player', $id);
$q->execute();

$q->setFetchMode(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, '\Library\Entities\Player');

return $q->fetch();

}

et j'ai ce message d'erreur, lorsque j'envoie la réponse :

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id_session' cannot be null' in C:\wamp\www\rapid\Library\Models\ReponsesManager_PDO.class.php on line 18
( ! ) PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id_session' cannot be null in C:\wamp\www\rapid\Library\Models\ReponsesManager_PDO.class.php on line18

Re: [PHP-MYSQL] même auto-increment sur 2 tables différentes

Posté : 15 janv. 2015, 11:40
par xTG
Il n'y a pas de colonne id_session invoquée dans ce select, ce n'est donc pas cette partie de code qui pose problème.
Tu as du dans la foulée modifier autre chose. ;)

Re: [PHP-MYSQL] même auto-increment sur 2 tables différentes

Posté : 15 janv. 2015, 12:46
par jeanmaki
dans connexioncontroller j'envoie par post le player_name donc la pas de soucis, mais comment envoyer id_player, ou le récupérer après inscription?