Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
bonjour a tous voila j'ai un problème et je ne sais pas comment le résoudre , je suis entrain de créer un système inmail et le problème c'est je voudrais quand un champ id s'ajoute dans une table directement il se s'ajoute dans une autre , mais le seul truc c que cette Id est auto incrémente et du coup je voudrais savoir comment faire pour que des que se champ est créer je récupère son id et je l'ajoute dans une autre table , quelqu'un aurait une idée , j'ai pensé faire un select sur la bd avec max(id) mais le seul problème c'est que si deux utilisateur envois un message au même moment sa peux causer des problèmes
merci de votre aide
Hors ligne
Si tu utilise Zend_Db, la fonction insert() retourne l'id inséré. Après je suis pas sur d'avoir bien saisie la quesiton
Hors ligne
merci pour ta réponse mais moi je cherche a insérer un id qui est auto incrémente dans deux tables en même temps et j'ai pas d'idée comment faire
Hors ligne
nathalie90 a écrit:
merci pour ta réponse mais moi je cherche a insérer un id qui est auto incrémente dans deux tables en même temps et j'ai pas d'idée comment faire
Bonjour,
Que ta clé primaire soit auto-incrémentée ou non la méthode insert() de Zend_DB retourne toujours le dernier id qui est inséré.
Hors ligne
mais le problème avec sa c'est que si deux lignes sont insérer en même temps par deux utilisateurs , il peut y avoir un conflit quand je récupère la dernière ligne , pour etre precis je cherche a faire un système "In Mails" comme celui de facebook mais je sais pas comment procéder
Dernière modification par nathalie90 (13-08-2012 14:17:13)
Hors ligne
Non c'est le principe de l'auto incremente, Zend_DB doit récupérer le dernier ID dans la même transaction donc tu auras toujours le dernier id que tu as inséré.
Hors ligne
merci c 'est ce que j'ai fais mais j'avais des doutes , merci pour votre réponse , le seul probléme que j'ai avec sa c'est que sa me déclenche l'erreur SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails , je ne sais d'ou peut venir cette erreur
mon code est comme suit:
[lang=php] $id = $this->_getParam('memberId'); $user = $userConnecte->id; $subject = $form->getValue('subject'); $body = $form->getValue('body'); $inmail = new Inmail(); $inmail->insertInmail($subject, $body, $user); $idMail = $form->getValue('idMail'); $select = $inmail->select()->setIntegrityCheck(false) ->from('in_mail', 'max(in_mail_id)'); $idRecuperer = $inmail->fetchAll($select); $idMail = $idRecuperer['max(in_mail_id)']; $inmailRecipient = new InMailRecipient(); $inmailRecipient->insertInmailRecipient($idMail, $id);
Dernière modification par nathalie90 (13-08-2012 15:38:37)
Hors ligne
si j'ai bien saisi votre problème vous n'avez nullement besoin d'effectué une requête pour récupérer l'id inséré. Et le pire vous tentez d’insérer une clé étrangère qui n'existe pas.
Hors ligne
je me suis dis quand j’insère l'id dans la ligne
[lang=php]$inmail->insertInmail($subject, $body, $user);
, je récupère après cette id et ensuite je l'ajoute dans la ligne
[lang=php] $inmailRecipient->insertInmailRecipient($idMail, $id);
Hors ligne
Pour faire simple, vous auriez dû procéder comme ça:
[lang=php] $id = $this->_getParam('memberId'); //???pensez au transtypage car on attend un Int $user = $userConnecte->id; $subject = $form->getValue('subject'); $body = $form->getValue('body'); $inmail = new Inmail(); //j'assigne la dernière valeur qui vient d'être ajoutée à la variable $idInsere $idInsere= $inmail->insertInmail($subject, $body, $user); $idMail = $form->getValue('idMail'); $inmailRecipient = new InMailRecipient(); //l'id retourné !=0 alors la 1ère insertion s'est bien deroulée if($idInsere!=0) $inmailRecipient->insertInmailRecipient($idInsere, $id);
La méthode insertInmail() de Inmail doit retourner insert() de Zend_Db.En voici une illustration
[lang=php] //dans la class Inmail public function insertInmail($subject, $body, $user) { $data=array(.......); try{ return $this->insert($data); } catch (Zend_Db_Exception $e){ return 0; } }
Dernière modification par amiss (13-08-2012 16:43:49)
Hors ligne
merci pour votre aide sa marche parfaitement , je vous en suis reconnaissante
Hors ligne
de rien.bon courage
Hors ligne
une question si vous le permettez , je voudrais savoir comment faire la différence entre deux champs qui ont le meme nom lors d'un appel dans mon fichier phtml , j'ai la table member avec time_create et une table event avec time_create aussi , et je voudrais appeler le time_create de la table event , dans mon phtml je fais echo $this->event[time_create] ,comment pourrai-je différencier les deux sans changer le champ d'une table
Hors ligne
au moment de faire votre requête vous devez spécifiez un alias sur chacun des champs sélectionnés.
[lang=php] $select = $db->select() ->from(array('m' => 'membres'),array('time1'=>'time_create'))...//time1 est un alias de time_create //même chose dans join lors de la jointure
Hors ligne
Bonjour Amiss, j'ai suivi ton explication et jarrive a recuperer la cle primaire auto incremente une fois l'ajout effectuer. Mais le problem est que lorsque je veux l'enregistrer dans une autre table bein la j'ai une erreur. Voici les codes
<?php
class ApplicationController extends Zend_Controller_Action
{
public function ajouterapplicationAction()
{
$form = new Application_Form_Applicationform();
$form->envoyer->setLabel('Enregistrer');
$this->view->form = $form;
if ($this->getRequest()->isPost())
{
$formData = $this->getRequest()->getPost();
if ($form->isValid($formData))
{
$NomApplication = $form->getValue('NomApplication');
$Description = $form->getValue('Description');
$NumCategorie = $form->getValue('NumCategorie');
$application = new Application_Model_DbTable_Application();
$NumApplication = $application -> ajouterApplication($NomApplication, $Description);
$appartenir = new Application_Model_DbTable_Appartenir();
$appartenir ->ajouterAppartenir($NumApplication,$NumCategorie);
$this->_helper->redirector('ajouterapplication','application');
}
else
{
$form->populate($formData);
}
}
}
}
<?php
class Application_Model_DbTable_Appartenir extends Zend_Db_Table_Abstract
{
protected $_name = 'appartenir';
protected $_primary = array('NumApplication','NumCategorie');;
protected $_referenceMap = array('Application' => array('columns'=>'NumApplication',
'refTableClass' => 'Application_Model_DbTable_Application',
'refColumns' => 'NumApplication'), 'Categorie' => array('columns'=>'NumCategorie',
'refTableClass'=> 'Application_Model_DbTable_Categorie', 'refColumns' => 'NumCategorie'));
public function ajouterAppartenir($NumApplication, $NumCategorie)
{
$data = array('NumApplication' => $NumApplication,'NumCategorie' => $NumCategorie,);
$this->insert($data);
}
}
J'arrive tres bien a recuperer les NumApplication et NumCategorie, mais je ne sais pas pourquoi l'ajout dans Appartenir ne marche pas. Svp aidez-moi, merci d'avance
Hors ligne
J'ai trouve la solution, merci a tout le monde
Hors ligne