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

Eléphanteau du PHP | 45 Messages

13 janv. 2015, 11:51

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

ViPHP
ViPHP | 2577 Messages

13 janv. 2015, 14:28

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.

ynx
Mammouth du PHP | 586 Messages

13 janv. 2015, 15:18

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

Eléphanteau du PHP | 45 Messages

15 janv. 2015, 11:36

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

ViPHP
xTG
ViPHP | 7331 Messages

15 janv. 2015, 11:40

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. ;)

Eléphanteau du PHP | 45 Messages

15 janv. 2015, 12:46

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?