Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & ODBC
PHP & ODBC Forum d'entraide sur ODBC avec PHP. Avant de poster -> FAQ ODBC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/11/2010, 07h16   #1
Candidat au titre de Membre du Club
 
Celine Delfuego
Inscription : mai 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : Celine Delfuego

Informations forums :
Inscription : mai 2010
Messages : 36
Points : 10
Points : 10
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 :
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 :
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 :
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 :
1
2
 
 $rs=odbc_exec($conn+$conn2,$sql);
Je ne sais pas si c'est tres clair...
Merci d'avance,


Sel
dufeu.celine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 17h25   #2
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 15
Points : 10
Points : 10
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
garfield_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 17h31   #3
Membre éclairé
 
Inscription : octobre 2004
Messages : 235
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 235
Points : 360
Points : 360
Citation:
Envoyé par dufeu.celine Voir le message
Code :
1
2
 
 $rs=odbc_exec($conn+$conn2,$sql);
La semantique de $conn+$conn2 me laisse perplexe
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 01h59   #4
Candidat au titre de Membre du Club
 
Celine Delfuego
Inscription : mai 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : Celine Delfuego

Informations forums :
Inscription : mai 2010
Messages : 36
Points : 10
Points : 10
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?
dufeu.celine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 09h58   #5
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 15
Points : 10
Points : 10
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 :
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 :
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...
garfield_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 10h02   #6
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 15
Points : 10
Points : 10
Citation:
Envoyé par dufeu.celine Voir le message
Code :
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.
garfield_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 11h34   #7
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 834
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 1 834
Points : 3 312
Points : 3 312
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 :
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.
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 07h12   #8
Candidat au titre de Membre du Club
 
Celine Delfuego
Inscription : mai 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : Celine Delfuego

Informations forums :
Inscription : mai 2010
Messages : 36
Points : 10
Points : 10
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?
dufeu.celine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 14h49   #9
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 15
Points : 10
Points : 10
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....
garfield_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 03h36   #10
Candidat au titre de Membre du Club
 
Celine Delfuego
Inscription : mai 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : Celine Delfuego

Informations forums :
Inscription : mai 2010
Messages : 36
Points : 10
Points : 10
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.
dufeu.celine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 10h28   #11
Membre chevronné
 
Inscription : juillet 2003
Messages : 625
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 625
Points : 600
Points : 600
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))
syl2095 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 01h57   #12
Candidat au titre de Membre du Club
 
Celine Delfuego
Inscription : mai 2010
Messages : 36
Détails du profil
Informations personnelles :
Nom : Celine Delfuego

Informations forums :
Inscription : mai 2010
Messages : 36
Points : 10
Points : 10
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!
dufeu.celine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2010, 09h55   #13
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 15
Points : 10
Points : 10
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...
garfield_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h48.


 
 
 
 
Partenaires

Hébergement Web