Oracle / OCI / Fonctionnement d'OCI-Lob

Oracle / OCI / Fonctionnement d'OCI-Lob - PHP - Programmation

Marsh Posté le 22-11-2007 à 14:50:52    

Hopla, un topic au cas où certains pourraient confirmer les résultats que j'obtiens avec cet objet de satan.

 

J'ai une table dans une base oracle, avec des photos de gens dedans, dans un blob.

 

Le code suivant fonctionne (affiche la photo de mon numéro 12):

 
Code :
  1. $conn  = oci_connect($user,$passwd,$base);
  2.  
  3. $stmt = oci_parse($conn, $sql);
  4.  
  5. oci_execute($stmt);
  6.  
  7. $lob = oci_fetch_object($stmt);
  8.  
  9. $mesJPG = array();
  10.  
  11. while($row = oci_fetch_object($stmt)){
  12.     $lob = $row->MONJPG;
  13.     $mesJPG[] = $lob->read($lob->size());
  14. }
  15. header("Content-type: image/jpeg" );
  16. echo $mesJPG[12];
 

mais pas celui-là (affiche la photo de mon numéro 0):

 
Code :
  1. $conn  = oci_connect($user,$passwd,$base);
  2.  
  3. $stmt = oci_parse($conn, $sql);
  4.  
  5. oci_execute($stmt);
  6.  
  7. $lob = oci_fetch_object($stmt);
  8.  
  9. $mesJPG = array();
  10.  
  11. while($row = oci_fetch_object($stmt)){
  12.     $mesJPG[] = $row->MONJPG;
  13. }
  14.  
  15. header("Content-type: image/jpeg" );
  16. echo $mesJPG[12]->read($mesJPG[12]->size());
  

ok, lol.
Donc si quelqu'un sait m'expliquer pourquoi, et comment faire marcher la 2eme version (le problème étant forcément un poil plus compliqué que l'exemple dans la vraie vie), je lui devrai une fière bretelle.[:dawa]

 


NB : oci_fetch_array($toto, OCI_RETURN_LOBS) fonctionne mais n'est pas une réponse considérée satisfaisante, merci!:D


Message édité par skeye le 22-11-2007 à 14:53:37

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 22-11-2007 à 14:50:52   

Reply

Marsh Posté le 22-11-2007 à 15:19:36    

Je dirais que c'est parce qu'en fait à chaque fetch le OCI-Lob est réinitialisé, du coup quand t'es en dehors de la boucle ça marche plus ;)

Reply

Marsh Posté le 22-11-2007 à 15:32:15    

ratibus a écrit :

Je dirais que c'est parce qu'en fait à chaque fetch le OCI-Lob est réinitialisé, du coup quand t'es en dehors de la boucle ça marche plus ;)

 

Bah non, c'est pire que ça...l'instance d'OCI-Lob est la même à chaque tour de la boucle, et maintient un pointeur de position dans le bouzin et ce genre de conneries...

 

Du coup si on ne fait pas de read(), il semblerait qu'on se retrouve à la fin dans le même état qu'au départ...sauf qu'un read() ne rétablit plus la situation, parce-que le parcours des lignes de résultats est terminé...:/

 

Bref, oci_fetch_object n'est pas utilisable dans le contexte que je voulais, à moins de bidouiller...

Message cité 1 fois
Message édité par skeye le 22-11-2007 à 15:32:26

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 22-11-2007 à 15:34:31    

skeye a écrit :


 
Bah non, c'est pire que ça...l'instance d'OCI-Lob est la même à chaque tour de la boucle, et maintient un pointeur de position dans le bouzin et ce genre de conneries...
 
Du coup si on ne fait pas de read(), il semblerait qu'on se retrouve à la fin dans le même état qu'au départ...sauf qu'un read() ne rétablit plus la situation, parce-que le parcours des lignes de résultats est terminé...:/
 
Bref, oci_fetch_object n'est pas utilisable dans le contexte que je voulais, à moins de bidouiller...


Oui faut faire le read dans le while, ça pose souci ?

Reply

Marsh Posté le 22-11-2007 à 15:36:51    

ratibus a écrit :


Oui faut faire le read dans le while, ça pose souci ?

 

oui.:D
A la base tout ça est dans une fonction qui ne sait pas le contenu de $sql. Donc pas s'il y a un blob, ni quel paramètre c'est.
Bref, c'est faisable : je récupère le type de tous les champs avec oci_field_type, et je traite différemment tous les champs BLOB...mais pour le coup c'est vraiment de l'overkill par rapport à oci_fetch_array($stmt, OCI_RETURN_LOBS)...[:dawao]

 

(d'ailleurs si quelqu'un pouvait m'expliquer pourquoi seul fetch_array a droit à ce paramètre ça m'intéresse [:moule_bite])

Message cité 1 fois
Message édité par skeye le 22-11-2007 à 15:37:40

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 22-11-2007 à 16:22:48    

skeye a écrit :


 
oui.:D
A la base tout ça est dans une fonction qui ne sait pas le contenu de $sql. Donc pas s'il y a un blob, ni quel paramètre c'est.
Bref, c'est faisable : je récupère le type de tous les champs avec oci_field_type, et je traite différemment tous les champs BLOB...mais pour le coup c'est vraiment de l'overkill par rapport à oci_fetch_array($stmt, OCI_RETURN_LOBS)...[:dawao]
 
(d'ailleurs si quelqu'un pouvait m'expliquer pourquoi seul fetch_array a droit à ce paramètre ça m'intéresse [:moule_bite])


Faudrait effectuer un instanceof OCI-Lob sur tous les champs effectivement :D

Reply

Marsh Posté le 22-11-2007 à 16:24:25    

ratibus a écrit :


Faudrait effectuer un instanceof OCI-Lob sur tous les champs effectivement :D


oui, ben au-secours.[:joce]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 22-11-2007 à 16:30:36    

skeye a écrit :


oui, ben au-secours.[:joce]


Boh ça va c'est pas crade je trouve
Et ca te permet de pas avoir à faire tes ->read() et ->size() après le while

Reply

Marsh Posté le 22-11-2007 à 16:35:25    

ratibus a écrit :


Boh ça va c'est pas crade je trouve
Et ca te permet de pas avoir à faire tes ->read() et ->size() après le while

 

Moué...moi je trouve ça moche.[:joce]


Message édité par skeye le 22-11-2007 à 16:35:54

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 22-11-2007 à 16:39:38    

Allez cadeau (à tester, j'ai pas d'Oracle ici) :

Code :
  1. $conn  = oci_connect($user,$passwd,$base);
  2. $stmt = oci_parse($conn, $sql);
  3. oci_execute($stmt);
  4. $lob = oci_fetch_object($stmt);
  5. $results = array();
  6. while($row = oci_fetch_object($stmt)){
  7.     foreach(get_object_vars($row) as $fieldName) {
  8.          if($row->$fieldName instanceof OCI-Lob) {
  9.               $lob = $row->$fieldName;
  10.               $row->$fieldName = $lob->read($lob->size())
  11.          }
  12.      }
  13.      $results[] = $row;
  14. }

Message cité 1 fois
Message édité par ratibus le 22-11-2007 à 16:40:42
Reply

Marsh Posté le 22-11-2007 à 16:39:38   

Reply

Marsh Posté le 22-11-2007 à 16:47:29    

ratibus a écrit :

Allez cadeau (à tester, j'ai pas d'Oracle ici) :

Code :
  1. $conn  = oci_connect($user,$passwd,$base);
  2. $stmt = oci_parse($conn, $sql);
  3. oci_execute($stmt);
  4. $lob = oci_fetch_object($stmt);
  5. $results = array();
  6. while($row = oci_fetch_object($stmt)){
  7.     foreach(get_object_vars($row) as $fieldName) {
  8.          if($row->$fieldName instanceof OCI-Lob) {
  9.               $lob = $row->$fieldName;
  10.               $row->$fieldName = $lob->read($lob->size())
  11.          }
  12.      }
  13.      $results[] = $row;
  14. }



 
Nan mais je sais faire, hein, ça.:D
Je voulais juste vérifier que je biglais pas, et qu'il était bien impossible de traiter les lobs comme les autres champs avec oci_fetch_object...[:joce]


---------------
Can't buy what I want because it's free -
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed