Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2426 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Oracle / OCI / Fonctionnement d'OCI-Lob

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Oracle / OCI / Fonctionnement d'OCI-Lob

n°1647248
skeye
Posté le 22-11-2007 à 14:50:52  profilanswer
 

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 -
mood
Publicité
Posté le 22-11-2007 à 14:50:52  profilanswer
 

n°1647283
ratibus
Posté le 22-11-2007 à 15:19:36  profilanswer
 

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 ;)

n°1647309
skeye
Posté le 22-11-2007 à 15:32:15  profilanswer
 

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 -
n°1647313
ratibus
Posté le 22-11-2007 à 15:34:31  profilanswer
 

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 ?

n°1647320
skeye
Posté le 22-11-2007 à 15:36:51  profilanswer
 

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 -
n°1647380
ratibus
Posté le 22-11-2007 à 16:22:48  profilanswer
 

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

n°1647381
skeye
Posté le 22-11-2007 à 16:24:25  profilanswer
 

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 -
n°1647388
ratibus
Posté le 22-11-2007 à 16:30:36  profilanswer
 

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

n°1647399
skeye
Posté le 22-11-2007 à 16:35:25  profilanswer
 

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 -
n°1647404
ratibus
Posté le 22-11-2007 à 16:39:38  profilanswer
 

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
mood
Publicité
Posté le 22-11-2007 à 16:39:38  profilanswer
 

n°1647419
skeye
Posté le 22-11-2007 à 16:47:29  profilanswer
 

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 -

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Oracle / OCI / Fonctionnement d'OCI-Lob

 

Sujets relatifs
requete sql avec max sous oracleOracle - copier table + rajout colonne
SQL oracle erreur nombre invalidesql oracle
Oracle SQL - Requête fausseoracle + découper une chaînes de caractères suivant un séparateur
[oracle] récupérer un nom de domaine a partir de l'email ?[Oracle] Tri personnalisé sur colonne
Oracle et vérification du remplissage des TableSpace ?[SQL,ORACLE]Message d'erreur mutating, trigger....(RESOLU)
Plus de sujets relatifs à : Oracle / OCI / Fonctionnement d'OCI-Lob


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR