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

Zend_Db PHP Discussion :

Configuration fetch mode dans XML [ZF 1.10]


Sujet :

Zend_Db PHP

  1. #1
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut Configuration fetch mode dans XML
    Bonjour,

    je souhaite pas défaut avoir un retour des requetes PDO en objet. Il est possible de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $stmt = $db->query('SELECT * FROM table');
    $stmt->setFetchMode(Zend_Db::FETCH_OBJ);
    mais je suis obligé de le répéter pour chaque requête.
    Comme j'utilise un fichier de configuration XML je souhaite le placer dedans mais je ne sais pas où !!
    Il semblerait que se soit driver_options
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <host>127.0.0.1</host>
    <username>user</username>
    <password>motdepasse</password>
    <dbname>table</dbname>
    <options>?
        <driver>?
           <fetch>OBJ</fetch>?
        </driver>?
    </options>?
    Merci de votre aide

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Montre nous comment tu fais ta connexion à la db !

  3. #3
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut
    Mon fichier de configuration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0"?> 
    <configdata> 
        <production>
         <database> 
            <adapter>Mysqli</adapter> 
            <params> 
                <host>127.0.0.1</host> 
                <dbname>base</dbname> 
                <username>user</username> 
                <password>motdepasse</password> 
                <charset>UTF8</charset> 
            </params> 
        </database> 
        </production>
    </configdata>
    Et ma requete ressemble à cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $db = Zend_Registry::get("db");    
    $db->setFetchMode(Zend_Db::FETCH_OBJ);
    $statement = $db->query('SELECT * FROM table');
    $rows = $statement->fetchAll();
    Merci

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Donc tes requêtes font partie d'une classe model, si tu respecte le MVC

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    class Model_Requete (){
     
    private $_db
     
    public function __construct(){
     
    $this->_db = Zend_Registry::get("db");    
    $this->_db->setFetchMode(Zend_Db::FETCH_OBJ);
     
    }
     
    public function uneRequete(){
    $sql = 'SELECT * FROM table';
    return $this->_db->fetchAll($sql);
    }
     
     
    }

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    pas sûr mais essayes comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?xml version="1.0"?> 
    <configdata> 
        <production>
         <database> 
            <adapter>Mysqli</adapter> 
            <params> 
                <host>127.0.0.1</host> 
                <dbname>base</dbname> 
                <username>user</username> 
                <password>motdepasse</password> 
                <charset>UTF8</charset> 
                <options>
                     <fetchMode>5</fetchMode>
                </options>
            </params> 
        </database> 
        </production>
    </configdata>
    EDIT : du coup non ca marche pas
    dommage que ca soit pas implémenté dans les options

  6. #6
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut
    Tout a fait MaitrePylos, j'ai épuré volontairement ma class pour éviter de prendre trop de place.

    En effet stealth35, chez moi non plus ca ne fonctionne pas. Mais pourquoi tu avais pensé mettre le fetchmode à 5 ?

  7. #7
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Pourquoi ne pas le faire au moment de l'initialisation de la dbn par exemple au moement où tu le met dans la registry.

    Par exemple je fais ceci dans mon Boostrap :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        protected function _initDb() {
            $pluginDb = $this->getPluginResource('db');
            $db = $pluginDb->getDbAdapter();
            $db->setFetchMode(Zend_Db::FETCH_OBJ);
            Zend_Registry::set('db', $db);
        }
    En même temps en explorant la classe , il y a une boucle sur driver_options

    donc ceci devrais fonctionner

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <?xml version="1.0"?> 
    <configdata> 
        <production>
         <database> 
            <adapter>Mysqli</adapter> 
            <params> 
                <host>127.0.0.1</host> 
                <dbname>base</dbname> 
                <username>user</username> 
                <password>motdepasse</password> 
                <charset>UTF8</charset> 
                <driver_options>
                     <fetchMode>Zend_Db::FETCH_OBJ</fetchMode>
                </driver_options>
            </params> 
        </database> 
        </production>
    </configdata>

  8. #8
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut
    J'ai essayé de modifier mon fichier de configuration XML mais rien n'y fait quand je veux accéder au résultat de ma requete en utilisant la notion objet j'ai cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Notice: Trying to get property of non-object
    Ta proposition dans le bootstrap fonctionne parfaitement par contre j'aimerais centraliser toutes mes données de config dans ce fichier XML.

    Merci pour ton aide

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    la valeur a 5 parce que c'est a quoi correspond le mode obj, mais y'a pas d'option fetchMode

    au pire tu peux changé l'option en dur dans le ZF, mais bon..., la solution du bootstrap étant la plus correct pour le moment

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    limite sous tu passais sous PDO y'aurai peu être moyen avec : ATTR_DEFAULT_FETCH_MODE

    mais je l'ai pas vu dans l'api de zend_db...

  11. #11
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    En faisant un Debug sur l'objet $DB on obtient ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
      ["_config":protected] => array(8) {
        ["host"] => string(9) "127.0.0.1"
        ["username"] => string(4) "root"
        ["password"] => string(7) "Web2008"
        ["dbname"] => string(5) "gesta"
        ["charset"] => string(4) "UTF8"
        ["persistent"] => bool(false)
        ["options"] => array(2) {
          ["caseFolding"] => int(0)
          ["autoQuoteIdentifiers"] => bool(true)
        }
        ["driver_options"] => array(0) {
        }
      }
      ["_fetchMode":protected] => int(2)
    On voit qu'on a une entrée _fetchMode

    Si on parcours le code, cela est définis dans Zend_Db_Adapter qui est une classe abstraite, dans cette classe la méthode setFetchMode est également abstraite, elle est donc redéfinie dans Zend_Db_Adapter_Mysqli.

    Cette redéfinition n'est pas pris en compte dans le constructeur.

    Donc deux solution :

    1 dans le Bootstrap comme je te l'ai montré.
    2 étende une classe de Zend_Db_Adapter_Mysqli

    Je préfère de loin la première solution

  12. #12
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut
    Citation Envoyé par stealth35
    limite sous tu passais sous PDO y'aurai peu être moyen avec : ATTR_DEFAULT_FETCH_MODE
    En effet j'ai vu cette article http://phpprotip.com/2008/10/underst...nd_config_ini/ où il en parle mais je n'arrive pas faire la conversion entre son fichier ini et mon fichier xml !!!

    Citation Envoyé par MaitrePylos
    On voit qu'on a une entrée _fetchMode

    Si on parcours le code, cela est définis dans Zend_Db_Adapter qui est une classe abstraite, dans cette classe la méthode setFetchMode est également abstraite, elle est donc redéfinie dans Zend_Db_Adapter_Mysqli.

    Cette redéfinition n'est pas pris en compte dans le constructeur.
    En faite je ne comprend pas ton explication, si tu peux m'en dire un peu plus merci.

  13. #13
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par Général03 Voir le message
    En effet j'ai vu cette article http://phpprotip.com/2008/10/underst...nd_config_ini/ où il en parle mais je n'arrive pas faire la conversion entre son fichier ini et mon fichier xml !!!
    toi t'es sous mysqli et non sous PDO

    ca ne marche pas non plus
    c'est pas une option de driver, c'est un attribut de PDO

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    je t'ai fais un patch si tu veux, ca marche bien, ta une nouvelle option fetchMode (Zend_Db::FETCH_MODE) qui prend les différentes valeurs des fetch http://framework.zend.com/apidoc/cor...tml#sec-consts
    (fetch_obj c'est 5)

    mais bon, ca t'obliges a modifier le code source...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    --- Zend/Db.php
    +++ Zend/Db.php
    @@ -42,6 +42,11 @@
          */
         const CASE_FOLDING = 'caseFolding';
     
    +    /**
    +     * Use the FETCH_MODE constant in the config of a Zend_Db_Adapter.
    +     */
    +    const FETCH_MODE = 'fetchMode';
    +
         /**
          * Use the AUTO_QUOTE_IDENTIFIERS constant in the config of a Zend_Db_Adapter.
          */
    --- Zend/Db/Adapter/Abstract.php
    +++ Zend/Db/Adapter/Abstract.php
    @@ -183,8 +183,9 @@
             $this->_checkRequiredOptions($config);
     
             $options = array(
    -            Zend_Db::CASE_FOLDING           => $this->_caseFolding,
    -            Zend_Db::AUTO_QUOTE_IDENTIFIERS => $this->_autoQuoteIdentifiers
    +            Zend_Db::CASE_FOLDING            => $this->_caseFolding,
    +            Zend_Db::AUTO_QUOTE_IDENTIFIERS  => $this->_autoQuoteIdentifiers,
    +            Zend_Db::FETCH_MODE              => $this->_fetchMode
             );
             $driverOptions = array();
     
    @@ -236,6 +237,11 @@
                 }
             }
     
    +        // obtain the fetch mode setting if there is one
    +        if (array_key_exists(Zend_Db::FETCH_MODE, $options)) {
    +            $this->_fetchMode = (int) $options[Zend_Db::FETCH_MODE];
    +        }
    +
             // obtain quoting property if there is one
             if (array_key_exists(Zend_Db::AUTO_QUOTE_IDENTIFIERS, $options)) {
                 $this->_autoQuoteIdentifiers = (bool) $options[Zend_Db::AUTO_QUOTE_IDENTIFIERS];

    EDIT : et si tu veux pas t'embêter avec les types met toi en mode lazy (Zend_Db:: FETCH_LAZY (1) )

    t'accèdes au donnée en NUM, ASSOC et OBJ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $row[0];
    $row['id'];
    $row->id;
    EDIT 2 : bon ca va vite, un mec du dev a modifier mon patch (on met 'obj' au lieu de 5), avec un peu change t'auras ca dans la prochaine version (pas celle de demain mais peu etre celle d'après)
    http://framework.zend.com/issues/sec.../ZF-6620.patch

  15. #15
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Et donc on ne modifie pas le core d'un Framework, la seule solution valable est dans le Bootstrap.

    Si le patch est introduit dans le framework alors tu pourras l'utiliser mais plus tard.

    Si tu modifie le core et qu'il n'est jamais patché, alors tu auras chaque fois un souci lors des mise à jours .

  16. #16
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut
    Je suis d'accord avec MaitrePylos mieux vaut éviter de modifier le coeur du framework sous peine de disfonctionnement lors d'une prochaine migration.
    Citation Envoyé par stealth35
    toi t'es sous mysqli et non sous PDO
    Par contre j'ai essayé de changer mon adaptateur en pdo_mysql mais toujours le même comportement. Avec cette adaptateur cela pourrait fonctionner ?

    Merci de votre aide

  17. #17
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut
    J'ai modifié mon adapter à pdo_mysql.
    Pour utiliser fetch mode j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $db = Zend_Registry::get("db");
    $db->setFetchMode(Zend_Db::FETCH_OBJ);
    var_dump($db);
    et le résultat et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    ...
      ["_config":protected]=>
      array(8) {
        ["host"]=>
        string(9) "127.0.0.1"
        ["dbname"]=>
        string(8) "base"
        ["username"]=>
        string(4) "root"
        ["password"]=>
        string(9) "mdp"
        ["charset"]=>
        string(4) "UTF8"
        ["persistent"]=>
        bool(false)
        ["options"]=>
        array(2) {
          ["caseFolding"]=>
          int(0)
          ["autoQuoteIdentifiers"]=>
          bool(true)
        }
        ["driver_options"]=>
        array(0) {
        }
      }
      ["_fetchMode":protected]=>
      int(5)
    ...
    Donc comme le disait stealth35 il enregistre 5 pour le fetch mode...
    Mais il ne passe pas ce paramètre dans "driver_options" !

    Dans mon xml j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <params>              
    <host>127.0.0.1</host>
    ...
    <fetchMode>Zend_Db::FETCH_OBJ</fetchMode>
     </params>
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <params>              
    <host>127.0.0.1</host>
    ...              
    <driver_options>                 <fetchMode>Zend_Db::FETCH_OBJ</fetchMode>
    </driver_options>         
    </params>
    J'ai même essayé de remplacer Zend_Db::FETCH_OBJ par PDO::FETCH_OBJ ou 5 : aucun ne fonctionne. Comment voir si j'ai des erreurs dans mon controlleur frontal lorsqu'il essaie de configurer le tout dans le bootsrap ?

    Merci de votre aide

  18. #18
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    en mysqli ca va pas etre possible, avec PDO_MySql par contre y'a possibilité de le faire

  19. #19
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Cela fait plaisir de voir, que quand on met une réponse en on tient pas compte !!!!

    Ce que tu as fait, je te le dit plus haut, moi aussi j'avais un DUMP, et c'est là que je me suis rendu compte que la méthode setFetchMode, n'étais pas dans le constructeur, donc ce que tu veux faire est impossible à moins de modifier le coeur du Framework...........

  20. #20
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    pour le moment rien ne t'empêche de mixer la config et la la methode de MaitrePylos

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    protected function _initDb()
    {
        $pluginDb = $this->getPluginResource('db');
        $db = $pluginDb->getDbAdapter();
        $db->setFetchMode($config->database->params->options->fetchMode);
        Zend_Registry::set('db', $db);
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/04/2011, 07h58
  2. [DTD] Tags Html dans XML ---> Etendre la dtd du Xhtml
    Par tipaquo dans le forum Valider
    Réponses: 14
    Dernier message: 19/07/2010, 09h09
  3. Configurer des paramétres dans le fichier server.xml
    Par root76 dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 13/02/2007, 17h16
  4. [Configuration] Confusion de balises XML / PHP
    Par teto dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 10/09/2005, 13h40
  5. PHP dans XML ou XSL
    Par mathieu dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 31/08/2003, 21h07

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