Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & Oracle
PHP & Oracle Forum d'entraide sur Oracle avec PHP. Avant de poster -> FAQ Oracle et Cours Oracle
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 01/06/2006, 14h52   #1
Nouveau Membre du Club
 
Inscription : décembre 2003
Messages : 223
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 223
Points : 25
Points : 25
Par défaut Problème de connexions simultanées différentes

Salut tout le monde !

j'ai un problème avec mes connexions oracle, c tellement un truc de fou que je sais pas si je vais reussir a l'expliquer et si vous aller comprendre ...
Je vais essayer d'etre clair ...

En résumé, mon probleme et que j'ai 2 connexions oracle, et dans certains cas, les 2 connexions se melangent, on dirait que PHP perd les pédales ...
Mais dans d'autre, ca fonctionne.
J'ai fait un script de test, qui reprends le contexte de mon vrai script en simplifié ...

Voici le fonctionnement :

En debut de script, je me connecte a une base que nous appelons supervision, la connexion me retourne une variable que j'appelle : $c_client.

Ensuite, j'ai un tableau qui contient des noms de projets (nous avons une base par projet).

Dans une boucle for, je parcours ce tableau de projets.
Je fais une 1ere requete sur la base supervision (requete sur la table d_product).
- Ensuite, je fais une connexion sur le projet en cours qui me retourne une variable appelée $c_projet.
- Ensuite, je fais une 2ème requete sur la base supervision.

--> Cette requete plante : ociexecute(): OCIStmtExecute: ORA-00942: Table ou vue inexistante

En effet, la table d_product existe sur la base supervision, mais pas sur la base du projet en cours.

Conclusion : cela veut dire que les 2 connexions sont mélangées .

J'ai passé 3h a debugger et a faire des tests hier, les résultats obtenus sont assez hallucinants ...


1er test (Test qui est decrit ci dessus)

Code :
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
 
<?php
 
$c_client = OCIPLogon($schema1, $passClient, $_ENV["ORACLE_SID"]);	
echo "c_client: ".$c_client."<br/>";
 
//tableau des projets sur lesquels on va se connecter
$aSchema=array("Projet1","Projet2","Projet3");
for($i=0;$i<3;$i++)
{
        //nom du projet (nom de la base)
	$strSchemaName=$aSchema[$i];
	echo "$strSchemaName<BR>";
 
	$strFilter="select * from d_product";
        $stmt = OCIParse($c_client,$strFilter);
        OCIExecute($stmt, OCI_DEFAULT);
        OCIFetchStatement($stmt, $arrayProductInfos);
	OCIFreeStatement($stmt);
 
	$c_projet = OCIPLogon($schema, $pass, $_ENV["ORACLE_SID"]);
	echo "c_projet: ".$c_projet."<br/>";
 
	$strFilter="select * from d_product";
        $stmt = OCIParse($c_client,$strFilter);
        OCIExecute($stmt, OCI_DEFAULT);
        OCIFetchStatement($stmt, $arrayProductInfos);
	OCIFreeStatement($stmt);
}
 
?>
Ce test ne fonctionne pas : ociexecute(): OCIStmtExecute: ORA-00942: Table ou vue inexistante .
Le plus étrange, c que le bug est aleatoire, c a d qu'il ne plante pas tout le temps des le 1er passage dans la boucle.
Il va meme parfois reussir a faire les 3 itérations.
C fou !!

2ième test


Dans ce test, j'initialise d'abord mes 2 connexions, en 1er une connexion a la supervision, en 2ieme, une connexion sur un projet.
Ensuite seulement, je fais une requete sur le projet, et une requete sur la supervision.

Code :
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
 
<?php
$strSchemaPwd=$_SESSION['sesOraPwd_client'];
 
$c_client = OCIPLogon($schema1, $passClient, $_ENV["ORACLE_SID"]);	
echo "c_client: ".$c_client."<br/>";
 
 
$aSchema=array("Projet1","Projet2","Projet3");
for($i=0;$i<3;$i++)
{
	$c_client = OCIPLogon($schema1, $passClient, $_ENV["ORACLE_SID"]); $_SESSION["sesOraPwd_client"]);	
	echo "c_client: ".$c_client."<br/>";
 
	$c_projet = OCIPLogon($schema, $pass, $_ENV["ORACLE_SID"]);
	echo "c_projet: ".$c_projet."<br/>";
 
	$strSchemaName=$aSchema[$i];
	echo "$strSchemaName<BR>";
 
	$strFilter="select * from d_module";
        $stmt = OCIParse($c_projet,$strFilter);
        OCIExecute($stmt, OCI_DEFAULT);
        OCIFetchStatement($stmt, $arrayProductInfos);
	OCIFreeStatement($stmt);
 
 
 
	$strFilter="select * from d_product";
        $stmt = OCIParse($c_client,$strFilter);
        OCIExecute($stmt, OCI_DEFAULT);
        OCIFetchStatement($stmt, $arrayProductInfos);
	OCIFreeStatement($stmt);
}
 
 
?>

Ce test fonctionne !
Autrement dit, en faisant l'ordre Connexion - connexion - requete-requete, les 2 connexions ne se mélangent pas .

3ième test


Ce test met en evidence la seul solution que j'ai trouvé, cad que je reinitialise ma connexion a la supervision apres la connexion sur le projet. (pour lui dire "et au fait, la supervision c ca !! )

Code :
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
 
 
<?php
 
$strSchemaPwd=$_SESSION['sesOraPwd_client'];
 
$c_client = OCIPLogon($schema1, $passClient, $_ENV["ORACLE_SID"]);		
echo "c_client: ".$c_client."<br/>";
 
 
$aSchema=array("Projet1","Projet2","Projet3");
for($i=0;$i<3;$i++)
{
 
	$strSchemaName=$aSchema[$i];
	echo "$strSchemaName<BR>";
 
	$strFilter="select * from d_product";
        $stmt = OCIParse($c_client,$strFilter);
        OCIExecute($stmt, OCI_DEFAULT);
        OCIFetchStatement($stmt, $arrayProductInfos);
	OCIFreeStatement($stmt);
 
	$c_projet = OCIPLogon($schema, $pass, $_ENV["ORACLE_SID"]);
	echo "c_projet: ".$c_projet."<br/>";
 
	$c_client = OCIPLogon($schema1, $passClient, $_ENV["ORACLE_SID"]); $_SESSION["sesOraPwd_client"]);	
	echo "c_client: ".$c_client."<br/>";
 
 
	$strFilter="select * from d_product";
        $stmt = OCIParse($c_client,$strFilter);
        OCIExecute($stmt, OCI_DEFAULT);
        OCIFetchStatement($stmt, $arrayProductInfos);
	OCIFreeStatement($stmt);
}
 
 
?>

Voila, j'ai regardé sur php.net, j'ai trouvé une fonction qui me paraissait interessante : OCIPLogon.
C en fait une connexion persistante, je pensais que ca ferait l'affaire, donc dans ma fonction openOracle j'utilise OCIPLogon. --> pas mieux ...


Voila, j'espere que vous avez compris mon probleme.
Avez vous deja rencontré des pbs de connexions oracles en php, les avez vous resolues ?

Je vous remercie d'avance pour vos réponses !

@+.
schnito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2006, 14h58   #2
Membre habitué
 
Avatar de scorpking
 
Inscription : avril 2006
Messages : 207
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : avril 2006
Messages : 207
Points : 113
Points : 113
j'ai pas tout lu sur tes test
mais tu voudrai fournir des information a la base projet depuis la base supervision
moi je te proposerai un truc
tu te connecte a ta premiere base, tu y prend les renseignement et tu libere la base
tes renseignement mis sous forme de variable sont gardé dans php
ensuite tu ouvre la connection a l'autre base et tu y met tes informations
oracle a toujour eu un défault au niveau des doubles connection j'ai souvent lu ça sur internet donc ça pourai venir de là l'erreur
scorpking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2006, 15h15   #3
Nouveau Membre du Club
 
Inscription : décembre 2003
Messages : 223
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 223
Points : 25
Points : 25
Citation:
Envoyé par scorpking
mais tu voudrai fournir des information a la base projet depuis la base supervision

Nan.
Dans une boucle, j'ai besoin d'information sur la base supervision, ensuite j'ai besoin d'infos sur la base projet.
Ensuite, j'ai de nouveau besoin d'infos sur la base supervision (plus possible car la connexion est ecrasée par la connexion sur le projet).
Cet ordre ne peut pas etre changé

Citation:
Envoyé par scorpking
moi je te proposerai un truc
tu te connecte a ta premiere base, tu y prend les renseignement et tu libere la base
tes renseignement mis sous forme de variable sont gardé dans php
ensuite tu ouvre la connection a l'autre base et tu y met tes informations
Ce n'est pas ca que je veux ...

Citation:
Envoyé par scorpking
oracle a toujour eu un défault au niveau des doubles connection j'ai souvent lu ça sur internet donc ça pourai venir de là l'erreur
Jpense plus que c un bug de php ...
Tu aurais dex exemples, des liens ... stp ??

En tout cas merci !
schnito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2006, 15h25   #4
Membre habitué
 
Avatar de scorpking
 
Inscription : avril 2006
Messages : 207
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : avril 2006
Messages : 207
Points : 113
Points : 113
c'est des lien que j'ai trouvé par hazard j'avais pas fais très attentions cherche vir sur google mysql se detache de oracle ils racontaient que oracle avait acheter une partie de programme qdont se servait mysql et comment mysql avait ratrapé le tir puis ils ajoutaient que mysql avait l'avantage de supporter les connections multiple ce que oracle nacceptait pas ou quelquechose dans le genre.

oui donc j'avais mal compris ce que tu voulais.
si tu fais une boucle c'est pareille tu peux faire varier la connection tu peux meme te creer des classes connections pour simplifier ton code et comme php fonctionne avec des variable ça ne poserai aucun problème ainsi tu tes informations et la connection reste propre.
scorpking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2006, 11h45   #5
Nouveau Membre du Club
 
Inscription : décembre 2003
Messages : 223
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 223
Points : 25
Points : 25
Yo !

Bon, ben nouvelles solution :

A chaque fois qu'on a besoin d'une requete
Ouvrir une connexion, faire la requete, et fermer la connexion dans l'ordre .

Ceci donne l'algo suivant :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
Pour i de 0 a NbProjets
  connexion supervision
  requete supervision
  fermeture
  connexion projet
  requete projet
  fermeture
  connexion supervision 2
  requete supervision 2
  fermeture 2
Fin Pour
Mais faut avouer que c qd meme tres spe tout ca, si qqn a plus d'infos je suis preneur !

@+ et merci !
schnito est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h44.


 
 
 
 
Partenaires

Hébergement Web