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 :

Se connecter à deux bases en même temps [ZF 1.5]


Sujet :

Zend_Db PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut Se connecter à deux bases en même temps
    Bonjour à tous,

    j'aimerais savoir si ZF permet de se connecter facilement à deux bases en même temps. J'aimerais utiliser toutes les tables d'une base plus une table supplémentaire d'une autre base. Je sais que cela se fait "presque" simplement juste en php mais je n'arrive pas à savoir comment faire cela avec le ZF.

    [Base1]
    table 1
    table 2
    table 3

    [base2]
    table 21 (table à ajouter)
    table 22

    L'idéal serait de pouvoir se connecter aux deux bases et de gérer les tables "table 1","table 2", "table 3" et "table 21" comme si elle faisait partie de la même base. (je ferais en sorte que les noms de table soient différents dans les deux bases).

    Avez vous des astuces pour faire cela?

    Merci d'avance.

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Se connecter à deux base de données est simple, il suffit de créer deux objets Zend_Db avec les paramètres de chacune de tes bases.

    Par contre, à ma connaissance, faire en sorte que les deux bases ne soient vues comme une seule, et faire des jointures entre les tables de tes deux bases comme si tu n'en manipulais qu'une me semble impossible avec Zend, comme avec php d'ailleurs (dans ce cas, c'est à toi de gérer les jointures, et tu ne le fais pas en SQL...).

    La seule solution que je vois pour faire ce que tu veux, c'est créer une connexion à la base 2 dans la base 1 (ou l'inverse). Et dans ces cas là, dans Zend, tu ne te connectes qu'à la base 1, et tu peux faire des requêtes à la fois dans ses tables et dans les tables de la base 2. mais cette solution n'a rien à voir avec le framework Zend, et dépend du système de gestion de bases de données utilisé...

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    Oki. J'avais commencé à faire des tests comme dans ta première réponse mais je ne suis pas arrivé à de résultats très concluant.

    Par contre, ta deuxième réponse m'intéresse beaucoup. Peux tu me donner un lien où une piste (j'utilise MySQL) ?

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Malheureusement, n'étant pas un expert de MySQL, je ne peux pas te dire si ça existe, ni comment faire sous MySQL.

    Je connais juste l'équivalent chez oracle, qui s'appelle le dblink (et je crois que c'est pareil pour postgreSQL).

  5. #5
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Tu ne peux pas effectuer de requête en même temps sur 2 bases car aucun SGBD ne le permet, à ma connaissance du moins. Tu confonds sans doute avec la notion de "schéma" (Oracle, PostgreSQL).

    C'est malheureusement un concept que MySQL ne semble pas avoir dans sa version 5.1...

    [Edit] Tu devrais peut-être utiliser de la réplication ?

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    On peut le faire en procédant de cette manière

    Citation Envoyé par span_ar Voir le message
    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
    $cnx2 = mysql_connect($hote, base1, $pass)
                        or die(mysql_error());
                    $ret2 = mysql_select_db(base1)
                        or die(mysql_error());
     
                    $cnx1 = mysql_connect($hote, base2, $pass)
                        or die(mysql_error());
                    $ret1 = mysql_select_db(base2)
                        or die(mysql_error());
     
                    $req = "SELECT t1.det_nom, t2.img_id, t2.img_thumb_nom, t3.imgth_id
                    FROM base1.detail t1, base2.image t2, base1.imageth t3
                    WHERE t1.det_classe = '".$context."'
                    and t2.img_nom = t1.det_nom
                    and t3.imgth_nom = t2.img_thumb_nom";
    J'avais fait le même test que span_ar et il est effectivement possible de faire des jointures entre différents tables de différentes bases.

    Il me reste à savoir comment faire la même chose sous ZF. J'ai l'impression que l'on ne peut pas créer plusieurs instances de connexions aux bases.

  7. #7
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Ah oui, on s'était mal compris j'ai l'impression.

    Est-ce que tu veux faire une requête qui utilise deux bases du même serveur MySQL ou de deux serveurs MySQL différents ?

    Dans l'exemple que tu donnes et qui fonctionne, tu fais une requête sur deux bases du même serveur. Ca en effet c'est possible, et très simple même avec Zend. D'ailleurs, pour faire ça, tu n'as absolument pas besoin d'ouvrir deux connexions. Une seule connexion suffit (je dirai même plus : une seule est utilisée !) !

    Dans Zend, si tu veux faire ça, il faut préciser pour chaque table le 'schema' (équivalent des notions de bases sur Mysql) auquel elle appartient.
    Par exemple, pour une table 'table1' de la base 'base1', ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Table1 extends Zend_Db_Table
    {
        protected $_schema = 'base1';
        protected $_name = 'table1';
    }

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Points : 93
    Points
    93
    Par défaut
    Oui c'est bien ça. Deux bases sur un seul serveur.

    Donc pour la partie schéma, ton exemple me semble parfait. Le fonctionnement reste le même qu'avec PHP sans ZF.

    Il me reste à savoir comment tu gères la connexion aux bases dans le bootstrap.

    Comment gères tu cela?

  9. #9
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Dans ton cas, une "base" est en fait utilisée comme un "schéma", tu n'as donc pas besoin d'ouvrir 2 connexions. Il suffit de faire tes requêtes ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM base1.table AS t1
    INNER JOIN base2.table AS t2 ON...
    Ce qui se traduit dans ZF comme indiqué ci-dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Modèle1 extends Zend_Db_Table
    {
        protected $_schema = 'base1';
        protected $_name = 'table1';
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Modèle2 extends Zend_Db_Table
    {
        protected $_schema = 'base2';
        protected $_name = 'table2';
    }

  10. #10
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par Jonathan.b Voir le message
    Oui c'est bien ça. Deux bases sur un seul serveur.

    Donc pour la partie schéma, ton exemple me semble parfait. Le fonctionnement reste le même qu'avec PHP sans ZF.

    Il me reste à savoir comment tu gères la connexion aux bases dans le bootstrap.

    Comment gères tu cela?
    Comme déjà dis (par moi et par Yogui), tu n'as pas besoin d'ouvrir plusieurs connexions à la base de données. Donc tu te connectes comme c'est indiqué dans les tutos

    En fait, quand tu ouvres une connexion, tu définis une connexion à un serveur (permise par les paramètres hôte / utilisateur / mot de passe) et tu définis une base par défaut (le paramètre dbname, base1 par exemple). Dans ce cas, tu peux accéder aux tables de base1 sans préciser dans quelle base elles sont. Si tu veux accéder aux tables de base2 (sur le même serveur), il suffit de préciser à MySQL où sont tes tables en les préfixant par leur base (ex : base2.table2). Avec Zend, ça se fait simplement en définissant la propriété $_schema de ta classe table2.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/06/2011, 09h47
  2. Se connecter à plusieurs bases en même temps
    Par sihammaster dans le forum VB.NET
    Réponses: 6
    Dernier message: 12/04/2010, 20h33
  3. [MySQL] Se connecter à deux bases en même temps
    Par Jonathan.b dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 22/04/2008, 16h33
  4. [Débutant] Se connecter à 2 bases en même temps
    Par Prohte dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/02/2006, 18h20
  5. [MySQL] Se connecter à deux base de données en même temps ??
    Par leo13 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 20/01/2005, 10h36

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