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

PHP & Base de données Discussion :

[Doctrine] 1.2.2/Zend Framework - Problème avec les requêtes Doctrine en utilisant la méthode execute()


Sujet :

PHP & Base de données

  1. #1
    Invité
    Invité(e)
    Par défaut [Doctrine] 1.2.2/Zend Framework - Problème avec les requêtes Doctrine en utilisant la méthode execute()
    Bonjour à tous,

    Voilà, j'utilise Doctrine 1.2.2 que j'ai intégré à Zend Framework 1.10.2. Jusqu'à présent, tout fonctionnait correctement

    Mais depuis que j'ai modifié la structure de ma base de données MySQL (moteur InnoDB), mes requêtes ne passent plus et au moment où la méthode execute() est lancée. Je m'explique :
    • J'ai modifié certains noms de champ de mes tables,
    • J'ai ajouté des contraintes UNIQUE sur certains champs de mes tables,
    • J'ai regénéré les modèles Doctrine PHP et le schéma YAML,
    • J'ai modifié mes classes qui faisaient appel aux modèles Doctrine pour mettre à jour les noms de champ,
    • En relançant ma page PHP, le script semble bloquer au niveau de la méthode execute() de mes requêtes Doctrine,
    • Le script paraît s'affoler (le processeur monte en fréquence), du coup je n'ai plus rien qui s'affiche (page blanche).


    J'ai essayé de remplacer execute() par fetchArray() et là ça ne bloque plus. Je ne comprends pas ce qui se passe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $this->_lang = Doctrine_Query::create()
    			->from('App_Models_Langue l')
    			->orderBy('l.lng_nom ASC')
    			->execute(); // Bloque : mais si remplacé par fetchArray() fonctionne normalement.
    $this->view->languages = $this->_lang;
    J'ai besoin de passer par execute() pour avoir des objets et non un tableau.

    N.B. : Les modèles prennent en compte les clés étrangères alors qu'avant ils ne les prenaient pas en compte : dans App_Models_Base_Langue (ma classe de définition de table pour Langue), j'ai dans la méthode setUp() plusieurs $this->hasMany(... );.

    En fait je n'ai pas besoin de ses relations ici, car quand je fait une requête sur Langue, je ne veux pas tous les éléments liés.

    Je ne sais plus comment faire ! A l'aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Re-bonjour,

    En ajoutant, aux paramètres de la méthode execute(), array(), Doctrine::HYDRATE_ARRAY cela fonctionne normalement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $this->_lang = Doctrine_Query::create()
    			->from('App_Models_Langue l')
    			->orderBy('l.lng_nom ASC')
    			// tout comme fetchArray() fonctionne normalement.
    			->execute(array(),Doctrine::HYDRATE_ARRAY);
     
    $this->view->languages = $this->_lang;
    Du coup, je m'interroge sur les raisons qui font que execute() fasse mouliner mon script et que fetchArray() ou execute(array(),Doctrine::HYDRATE_ARRAY) fonctionnent sans problème.

    EDIT : J'ai pu voir que fetchArray() et execute(array(), Doctrine::HYDRATE_ARRY) sont exactement pareils (Doctrine: execute vs fetchArray -
    symfony users | Google Groupes
    ).

    Y-aurait il quelque chose qui m'échappe ?
    Dernière modification par Invité ; 31/05/2010 à 16h43.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je me retrouve couramment avec des Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 61792107 bytes) in chemin\vers\projet\library\Zend\Debug.php on line 86

    Je pense très fortement que c'est Doctrine qui créé trop d'objet en mémoire mais je ne vois pas quelles en sont les raisons.

    InnoDB et les relations étrangères y sont-ils pour quelque chose ? Mes problèmes avec Doctrine sont apparus depuis cela.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Après quelques recherches, il semblerait que Doctrine créé tout un lot d'objets inter-dépendants, en recréant les relations (one-to-one, one-to-many et many-to-many) et que cela a pour effet de créer des références circulaires (depuis PHP 5.2.5). Du coup, cela créé une montée en charge de la mémoire.

    En attendant la version 2 de Doctrine qui repense son architecture et améliore grandement ses performances, je me rabats sur le fetchArray() et la méthode free().

    Si quelqu'un a une meilleure proposition, je suis preneur .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD15] Problème avec les requêtes
    Par wafiwafi dans le forum WinDev
    Réponses: 5
    Dernier message: 08/09/2011, 09h00
  2. Réponses: 1
    Dernier message: 16/08/2009, 01h57
  3. Réponses: 1
    Dernier message: 28/06/2006, 13h31
  4. Problème avec les requêtes hibernate
    Par joseph_p dans le forum Hibernate
    Réponses: 5
    Dernier message: 04/04/2006, 22h54

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