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 30/11/2006, 15h14   #1
Membre à l'essai
 
Avatar de gojira
 
Inscription : mars 2006
Messages : 89
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 89
Points : 23
Points : 23
Envoyer un message via MSN à gojira
Par défaut Lire des Clob

Bonjour,

après l'execution des exemples donnés ici:

Citation:
Exemple avec oci_fetch_array et OCI_BOTH


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$connection = oci_connect("apelsin", "kanistra");
 
$query = "SELECT id, name FROM fruits";
 
$statement = oci_parse ($connection, $query);
oci_execute ($statement);
 
while ($row = oci_fetch_array ($statement, OCI_BOTH)) {
    echo $row[0] . ' et ' . $row['ID'] . ' sont identiques<br />';
    echo $row[1] . ' et ' . $row['NAME'] . ' sont identiques<br />';
}
?>
Exemple avec oci_fetch_array et OCI_NUM


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$connection = oci_connect("user", "password");
 
$query = "SELECT id, name, lob_field FROM fruits";
 
$statement = oci_parse ($connection, $query);
oci_execute ($statement);
 
while ($row = oci_fetch_array ($statement, OCI_NUM)) {
    echo $row[0] . '<br />';
    echo $row[1] . '<br />';
    echo $row[2]->read(100) . '<br />';  //Affiche les 100 premiers bytes du LOB
}
?>
Exemple avec oci_fetch_array et OCI_ASSOC


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$connection = oci_connect("user", "password");
 
$query = 'SELECT id, name, lob_field FROM fruits';
 
$statement = oci_parse ($connection, $query);
oci_execute ($statement);
 
while ($row = oci_fetch_array ($statement, OCI_NUM)) {
    echo $row['ID'] . '<br />';
    echo $row['NAME'] . '<br />';
    echo $row['LOB_FIELD'] . '<br />';  //Affiche "Object id #1"
}
?>
Exemple avec oci_fetch_array et OCI_RETURN_LOBS


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$connection = oci_connect("user", "password");
 
$query = 'SELECT id, name, lob_field FROM fruits';
 
$statement = oci_parse ($connection, $query);
oci_execute ($statement);
 
while ($row = oci_fetch_array ($statement, OCI_NUM)) {
    echo $row[0] . '<br />';
    echo $row[1] . '<br />';
    echo $row['LOB_FIELD'] . '<br />';  //Affiche le contenu du LOB
}
?>
suivi d'une recherche avec mon ami gogole et une recherche sur ce forum avec le mot-clé "lob", je me présente humblement devant cette aimable assemblée avec un problème.

Je veux pouvoir afficher des clobs contenus dans une base oracle avec PHP5

J'ai testé:
avec comme requete:
select ID, MYCLOB FROM TABLE;
Code :
1
2
3
4
5
while ($row = oci_fetch_array ($parsed, OCI_RETURN_LOBS)) {
	$id = $row[0];
	$lob = $row['FIELDLOG'];
	echo $id . ' = ' . $lob . '<br />';
}
ce qui m'affiche bien les ID mais pas le clob (chaine vide)

Code :
1
2
3
4
5
while ($row = oci_fetch_array ($parsed, OCI_NUM)) {
	$id = $row[0];
	$lob = $row[1]->load();
	echo $id . ' = ' . $lob . '<br />';
}
ce qui plante tout bêtement en me donnant un message d'erreur:
Citation:
Fatal error: Call to a member function load() on a non-object in /.../clob.php on line 27
je ne sais pas où se trouve mon erreur, d'autant plus que je fais comme les exemples trouvés sur le net.
Et de plus mes clobs ne sont ni null ni vides.

Merci d'avance pour votre inestimable coup de main.
gojira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2006, 11h31   #2
Membre à l'essai
 
Avatar de gojira
 
Inscription : mars 2006
Messages : 89
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 89
Points : 23
Points : 23
Envoyer un message via MSN à gojira
j'ai oublié de dire que j'utilise le driver oci8

Merci d'avance pour votre aide
gojira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2006, 20h08   #3
Modérateur
 
Avatar de Rakken
 
Inscription : août 2006
Messages : 1 207
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 207
Points : 1 137
Points : 1 137
Exectute ta requete comme une requete tout a fait classique. Normalement, avec ton fetch, quand tu affiches chacun de tes champs, tu devrais obtenir une valeur lisible pour les champs contenant des données classiques (les champs number ou varchar2) et un truc genre "#rowid 210" pour les clob.

Ces champs là sont de type "oci-lob" et tu peux donc leur appliquer les fonctions qui vont bien avec lob-read par exemple (cette fonction là retourne le contenu de ton clob dans une string).

Ton problème dans l'exemple numero deux est que tu appliques la fonction load a un objet qui n'est pas de type oci-lob. La première étape est donc de trouver une maniere de faire ta requête qui te renvoie bien ce qu'il faut (je ne me suis jamais servi de OCI_RETURN_LOBS je ne connais pas son influence sur les oci-lob).

Bonne chance ;-))

--
Rakken
Rakken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2006, 12h07   #4
Membre à l'essai
 
Avatar de gojira
 
Inscription : mars 2006
Messages : 89
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 89
Points : 23
Points : 23
Envoyer un message via MSN à gojira
Merci beaucoup Rakken pour ton aide.
J'ai résolu le problème de l'erreur grâce a ton explication.
En fait je ramenais des réponses NULL et la fonction load() ne s'applique pas sur des input nuls.
Par contre maintenant je fais:
Code :
1
2
3
4
5
6
while ($row = oci_fetch_array ($parsed, OCI_NUM)) {
	echo '<br />';
	$id = $row[0];
	$lob = $row[1]->load();
	echo $id . ' <=> ' . $lob . '<br />';
}
je n'ai plus d'erreur.
si j'enlève le "->load()"
j'obtiens: Object id #1
si je mets le "->load()"
j'obtiens une chaine vide: le lob n'est pas affiché

Bref n'étant pas un spécialiste en PHP je ne fais que suivre les tutoriaux, exemples et cours sur le net et je ne vois absolument pas où se trouve l'erreur et ce qui coince.

Merci d'avance
gojira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2006, 14h10   #5
Modérateur
 
Avatar de Rakken
 
Inscription : août 2006
Messages : 1 207
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 207
Points : 1 137
Points : 1 137
Essaie :
Code :
1
2
3
 
$test = $row[1]->read($row[1]->size());
echo $test;
Pour avoir le code "complet" jette un oeil sur ce topic.

--
Rakken
Rakken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2006, 14h42   #6
Membre à l'essai
 
Avatar de gojira
 
Inscription : mars 2006
Messages : 89
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 89
Points : 23
Points : 23
Envoyer un message via MSN à gojira
J'ai essayé selon ta proposition en m'inspirant du code dont tu as donné le lien.
Merci beaucoup, ça m'aide énormément à comprendre.

J'ai donc fait
Code :
1
2
3
4
5
6
7
oci_execute($stmt, OCI_DEFAULT);
while (oci_fetch($stmt)) {
   $myid = oci_result($stmt, 1);
   $myvar = oci_result($stmt, 2);
   $mylob = $myvar->read($myvar->size());
   echo $myid . ' <=> ' . $mylob . '<br />';
}
Pas d'erreur... juste rien d'affiché pour le lob.
Par contre si j'affiche $myvar->size()
j'obtiens bien des tailles non nulles allant de 1 à n
Donc les lobs sont bien renseignés, ils sont bien non vides mais il n'est pas possible de les lire avec load() ou read().
Là, je suis complètement dépassé.

Merci infiniment pour ton aide.
gojira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2006, 16h02   #7
Modérateur
 
Avatar de Rakken
 
Inscription : août 2006
Messages : 1 207
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 207
Points : 1 137
Points : 1 137
Ils sont cencé contenir quoi tes clobs ?

Ca peut être un truc tout bête (qui m'est arrivé), ou je lisais du xml dans mes clobs.

Le xml peut ne pas s'afficher si tout le contenu est dans des balises (reconnue comme des balises html non valide, donc cachée ^^).

Vérifie dans le code source de la page que tu génères.

--
Rakken
Rakken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2006, 16h06   #8
Membre à l'essai
 
Avatar de gojira
 
Inscription : mars 2006
Messages : 89
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France

Informations forums :
Inscription : mars 2006
Messages : 89
Points : 23
Points : 23
Envoyer un message via MSN à gojira
ils contiennent du texte... tout bêtement des chaines de caractères sans aucun formattage.
si j'édite la source de la page affichée j'ai belle et bien une chaine vide...
peut-être qu'il s'agit d'une config spéciale au niveau du serveur?
Je ne sais pas... et là dessus je n'ai pas la main.

Merci beaucoup pour ton aide
gojira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2006, 16h14   #9
Modérateur
 
Avatar de Rakken
 
Inscription : août 2006
Messages : 1 207
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 207
Points : 1 137
Points : 1 137
Alors là je seche...

J'crois que le mieux c'est de reposer ta question, avec ton code actuel, dans la section "oracle" (en n'oubliant pas de faire un ptit lien sur le thread ici), ils auront peut-être une idée coté "serveur".

--
Rakken
Rakken 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 13h34.


 
 
 
 
Partenaires

Hébergement Web