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)
Ce test ne fonctionne pas : ociexecute(): OCIStmtExecute: ORA-00942: Table ou vue inexistante .
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 <?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); } ?>
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 : 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 <?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 : 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 <?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 !
@+.
Partager