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 :

une requete = 2 bases/2 connexions ODBC?


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 25
    Points
    25
    Par défaut une requete = 2 bases/2 connexions ODBC?
    Bonjour a tous,

    Comme je découvre actuellement tous les mystères du php et des connexions ODBC j'en viens a chercher les limites
    Est il possible de manipuler deux connexions en même temps?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $conn  =  odbc_connect($dsn,"blabla","blabla");
    $conn2= odbc_connect ($dsn2,"blabla2","blabla2");

    Je m'explique:
    Dans une base j'ai une groOosse table qui contient les temps (parcourir cette table me mange énormément de temps), dans l'autre j'ai les informations permettant de faire la sélection, les deux tables peuvent etre liées par un chiffre (possible avec CR, mais tres lent)

    Pour le moment j'enregistre tous les temps dans un array en utilisant ma connexion 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     $sql="SELECT DATEDIFF(hour, start, end) As Time, Chiffre FROM t1";
     
        $rs=odbc_exec($conn2,$sql);
       if (!$rs) {exit("Error in SQL");}
    while (odbc_fetch_array($rs)){$Array1['Chiffre']= odbc_result($rs, 'Time');$i++;}
    puis j'enregistre toutes les info depuis ma connexion 2 dans un autre array et en meme temps j'essaie de comparer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     $sql="SELECT chiffre FROM t2 WHERE condition=true ";
     
       $rs=odbc_exec($conn,$sql);
       if (!$rs) {exit("Error in SQL");}
       while (odbc_fetch_array($rs)){
           $Array2[$i]= odbc_result($rs, 'chiffre');
           $Calcul=$Calcul+$Array1['chiffre'];
           $i++;}

    Ca marche mais je ne sais pas si c'est très optimisé, car enregistrer tous les temps prend du temps
    Alors que faire une sélection avec un INNER JOIN pourrait réduire le temps d'exécution de la recherche... non?
    (en meme temps je suis une faineante, donc je cherche les solutions les plus courtes)

    Alors est ce que par hasard un petit truc du genre ci dessous est envisageable???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     $rs=odbc_exec($conn+$conn2,$sql);
    Je ne sais pas si c'est tres clair...
    Merci d'avance,


    Sel

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    AMHA
    Clairement, si tu peux faire la même chose en une seule requête avec une jointure tu gagnera pas mal de temps. C'est le serveur SGBD qui fera tous le travail donc déjà des temps d'accès aux données largement plus rapide. Ensuite, si ton serveur SGBD et ton serveur Web ne sont pas sur la même machine tu gagnera du temps sur le transfert de données (le fetch peut prendre pas mal de temps) et tu limitera l'utilisation de ta bande passante réseau...

    Et comme tu es faineante, tu aura moins de code à taper

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    Citation Envoyé par dufeu.celine Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     $rs=odbc_exec($conn+$conn2,$sql);
    La semantique de $conn+$conn2 me laisse perplexe

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Je pense que ca ne marche pas non plus, mais comme on dit l'espoir fait vivre... Donc si quelqu'un a une idee.

    garfield_fr, je sais que ca me ferait gagner pas mal de temps... mais saurais tu comment faire?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par dufeu.celine Voir le message
    garfield_fr, je sais que ca me ferait gagner pas mal de temps... mais saurais tu comment faire?
    D'après ce que je comprend de ce que tu veux faire de ton code et de tes explications, j'ai l'impression que tu veux faire une somme du champs 'Time' pour chaque 'chiffre' avec une condition de selection de 'chiffre' liée à t2 ?

    Le SQL serait alors un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT  SUM(DATEDIFF(t1.hour, t1.start, t1.end)) as TotalTime, t1.chiffre
    FROM t1, t2
    WHERE t1.chiffre = t2.chiffre
    and <condition sur ta table t2>
    group by t1.chiffre
    Dans ton ensemble résultat ($rs) , ton $calcul serait la valeur de TotalTime et tu l'obtient pour chaque valeur de 'chiffre'.

    Donc un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       $sql="SELECT  SUM(DATEDIFF(t1.hour, t1.start, t1.end)) as TotalTime, t1.chiffre FROM t1, t2 WHERE t1.chiffre = t2.chiffre and <tes conditions sur ta table t2> group by t1.chiffre";
     
       $rs=odbc_exec($conn,$sql);
       if (!$rs) {exit("Error in SQL");}
       while ($a = odbc_fetch_array($rs)){
           $Calcul = $a['TotalTime'];
           $chiffre = $a['chiffre'];
           // et la tu fait ce que tu doit faire avec $Calcul et $chiffre
           // $Calcul étant la valeur de ton calcul pour le $chiffre sélectionné
       }
    Je pense que ca doit être ce que tu veux faire...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par dufeu.celine Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     $rs=odbc_exec($conn+$conn2,$sql);
    Marche pas, $conn est une ressource, c'est comme un pointeur ou un handle. Ca identifie juste le lien.

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Ta problématique n'a à mon avis pas grand chose à voir avec PHP.

    Si sur ton sgbd tu peux faire une requete sélectionnant des données sur deux bases différentes , tu dois pouvoir le faire en php et avec une seule connexion ODBC.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT b1.champs , b2.champs FROM base1.table1 b1 , base2.table2 b2
    Va sélectionner deux champs sur deux base différentes. Ce n'est bien sur valable que si ces deux bases sont sur le même serveur.
    Sur deux serveur physique différents je ne sais pas si c'est techniquement possible.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Justement les deux bases sont sur des serveurs differents (d'ou des connexion odbc differentes: mots de passe, serveurs, login.... tout est different )

    Je me demande comment c'est possible avec Crystal Report si ca ne l'est pas en php... il passe par deux requêtes différentes?

    (comme tout stocker dans un tableau pour les résultats de la 1ere sélection et puis parcourir la 2eme base de données en sélectionnant avec les résultats de la 1ere requete (j'ai mal a la tete!))

    Je me doute que c'est impossible... mais qui ne vérifie rien n'est sur de rien

    Donc double connections odbc pour n'avoir qu'une SEULE requete SQL (avec tous les INNER JOIN que vous voudrez, ca ce n'est pas un probleme)... est ce vraiment impossible?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    C'est quoi le moteur de base de données ?

    Par exemple, avec Oracle, tu pourrais faire un DATABASE LINK qui permet à une base B1 d'interrogé la base B2. Une fois le DBLINK installé, tu créé des synonymes de la table B2.T2 dans ta base B1 et tu accède alors à la table B2.T2 comme si elle était sur B1...

    Si tu n'est pas sous Oracle, regarde la doc pour voir si un tel liens est possible (ca peut s'appeler différemment).

    Sinon il te faut 2 connexions et faire le calcul via ton script PHP....

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    mmm.... comment fait-on pour verifier ca? Je sais que mon driver est SQL server...

    Pour le moment je suis partie sur un boucle avec du php car je ne voulais pas rester bloquee.

  11. #11
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    625
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 625
    Points : 673
    Points
    673
    Par défaut
    Bonjour,

    peut être ce lien pourrait t'aider :

    http://www.developpez.net/forums/d18...e/#post1183369
    Le savoir est utile que s'il est partagé par tous.
    /(bb|[^b]{2})/
    !sleep() ? array((string))

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Ce n'est toujours pas mon probleme, car si je fais une succession de requetes en jonglant entre les differentes bases je n'ai aucun problemes (elles ont des noms differents et ne s'ecrasent pas mutuellement)

    Non, mon probleme etait essentiellement un probleme de faineantise et surtout de recherche d'optimisation:

    une seule requête sur deux connexions...

    faire un INNER JOIN entre deux bases situees sur deux serveurs différents...

    Mais je crois que c'est impossible, donc je vais fermer cette discussion et jongler entre mes requêtes avec des boucles dans tous les sens.

    Merci tout de même pour toutes les réponses que j'ai eu.
    Si quelqu'un a tout de meme d'autres idees je suis toujours preneuse ^^

    Merciiiiiiiiii!

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par dufeu.celine Voir le message
    faire un INNER JOIN entre deux bases situees sur deux serveurs différents...
    Tu devrais aller voir du coté du forum SQL Server et poser la question s'il est possible de faire un lien entre 2 bases de données SQL Server pour faire une requete sur les 2.
    Ca m'étonnerais que SQL Server ne le fasse pas...

    petite recherche sur google: http://database.ittoolbox.com/groups...ver-tsql-52929

    Perso je ferais le liens au niveau de la base principale et ensuite je créerais des synonym des table de la base distante dans la base pricnipale. du coup tu as juste a interroger la base principale en faisant les jointure sur le synonyms...

Discussions similaires

  1. [WD19] Analyse windev basée sur connexion ODBC
    Par tunizar dans le forum WinDev
    Réponses: 3
    Dernier message: 02/10/2014, 15h54
  2. Réponses: 9
    Dernier message: 26/11/2008, 10h18
  3. error connexion ODBC a une base de donnees pour une requete select
    Par padawanette dans le forum Windows Forms
    Réponses: 7
    Dernier message: 10/09/2008, 18h49
  4. Variable d'une table dans une requete non basée sur cette table
    Par MickaelKael dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 22/10/2007, 09h46
  5. Réponses: 3
    Dernier message: 17/10/2007, 08h48

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