IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Erreur de redirection après création de ligne


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 23
    Points : 16
    Points
    16
    Par défaut Erreur de redirection après création de ligne
    Bonjour,

    Alors j'avais déjà plus ou moins expliqué le souci que je rencontre à la fin de ce post, et je l'avais contourné comme j'avais pu. seulement voilà, cette solution ne me convient plus :s

    Petit récapitulatif : A la fin de la création d'un nouvel objet et de son insertion dans la base, Symfony est censé me renvoyer sur le formulaire d'édition du-dit objet, via ce petit bout de code (généré automatiquement par symfony)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    protected function processForm(sfWebRequest $request, sfForm $form)
      {
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid())
        {
          $projet_sigip = $form->save();
     
          $this->redirect('projet_sigip/edit?idprojet='.$projet_sigip->getIdprojet());
        }
      }
    Le problème, c'est que ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $projet_sigip->getIdprojet()
    n'est pas correct, et me renvoie une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object projet does not exist ().
    L'objet est bien crée, aucun problème, et si ma redirection se fait sur une page plus générale, disons par exemple index, alors je n'aurais pas d'erreur. Le problème vient vraiment du fait qu'il n'arrive pas, pour une raison que j'ignore, à récupérer l'idprojet après la sauvegarde...

    Comment faire pour palier à ce souci?

    Merci d'avance,
    Dash777

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Il manque beaucoup d'informations pour pouvoir analyser, mais dans un tout premier temps tu ne devrais pas plutôt avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->redirect('projet_sigip/edit?idprojet='.$projet_sigip->getIdProjet());
    Si non, peux-tu mettre le shema.yml de la base, au moins celui qui a permit de générer l'objet "Project" ou du moins celui sur lequel ton CRUD tourne.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Bonjour, désolé, je reviens d'un graaand weekend

    Alors pour ce qui est de
    mais dans un tout premier temps tu ne devrais pas plutôt avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->redirect('projet_sigip/edit?idprojet='.$projet_sigip->getIdProjet());
    Non ce que j'avais était correct

    J'ai trouvé l'erreur : Pour pouvoir faire une redirection après insertion, il faudrait que le champ soit auto-increment. à première vue pas de souci, après tout, c'est une clé primaire, elle devrait y être, ou au pire je pourrais ajouter ça sur le schéma, et m'assurer qu'elle y est dans la base. Sauf qu'en fait, je suis sur une base Oracle, par conséquent, c'est pas Auto-increment, mais une séquence. Et là y'a un facteur qui entre en jeu, c'est l'efficacité très relative de la personne qui s'est occupé de faire la base, il y a quelques années. Plutôt que de faire une séquence, il a préféré faire un trigger. Et comme je ne dois pas toucher à la base, je dois me débrouiller autrement, parce qu'avec un trigger ça marche pas... :s

    J'ai pensé à faire comme ceci, mais ça fait quand même "bricolage" : Je fais une requête pour récupérer le MAX(idprojet), après avoir éventuellement vérifié que personne d'autre n'a ajouté de nouveau projet (mais bon, le risque que 2 personnes créent un projet à moins d'une demi seconde d'intervalle est quand même très faible (mais certes présent)).

    Merci en tout cas de répondre aussi souvent à mes problèmes
    Dash777.

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Après vérification.

    Je suis descendu (très bas) dans le code de la méthode save de l'objet Doctrine_record. C'est un code très intéressant, mais parfois un peu opaque, surtout à cause du traitement par événement (à certain moment des événements propre à doctrine sont généré et il n'est pas toujours évident de savoir quel est la/les fonction(s) qui va(vont) récupérer l'évènement pour le traiter.

    C'est l'objet connexion (en gros) qui se charge de la partie écriture d'un enregistrement. Il fait la vérification si c'est une création d'un nouvel enregistrement et, si c'est le cas, va tenter de récupérer la clef générée (méthode privée _assignIdentifier de l'objet Doctrine_Connection_UnitOfWork).

    A partir de là, si doctrine sait que ce champ est clef primaire (même s'il n'est pas auto-incrémenter), il va tenter de récupérer automatiquement la valeur après insertion.

    Deux pistes :
    • Dans le shéma que tu utilises pour générer ton modèle, le champ est-il indiqué comme clef primaire ?
    • S'il n'arrive pas a récupérer la clef primaire, il va générer une exception Doctrine_Connection_Exception "Couldn't get last insert identifier." qui doit être visible dans le log de symfony, même s'il est traité en interne ensuite et n'est pas bloquant.


    Le fait que la clef primaire soit générée par une procédure stockée ne devrait pas être un problème, vu que le triger doit ce terminer avant la fin de la transaction d'insertion de l'enregistrement, et donc la clef généré doit être disponible pour être récupérée par Doctrine.

    Donc après avoir utilisé la méthode save() de l'enregistrement, l'Id de ton enregistrement doit être disponible par un getId() ou toutes autre méthode getXxxx() en fonction du nom de la clef.

    Si non, regarde dans les logs si tu y trouves l'exception sus mentionnée. Et dans ce cas, je propose le paquet de mouchoir...

Discussions similaires

  1. [PHP 5.0] redirection après une erreur fatale
    Par netmaster dans le forum Langage
    Réponses: 2
    Dernier message: 08/07/2010, 14h52
  2. erreur après mise en ligne
    Par etienne.clopeau dans le forum Django
    Réponses: 1
    Dernier message: 30/03/2010, 00h37
  3. Erreur après création de l'installeur.
    Par megamario dans le forum Visual Studio
    Réponses: 4
    Dernier message: 18/02/2010, 19h06
  4. Réponses: 7
    Dernier message: 24/11/2009, 15h03
  5. Redirection après validation erreurs
    Par xtope dans le forum Struts 1
    Réponses: 4
    Dernier message: 20/04/2009, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo