IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Lire des Clob


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Par défaut Lire des Clob
    Bonjour,

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

    Exemple avec oci_fetch_array et OCI_BOTH


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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:
    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.

  2. #2
    Membre confirmé Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Par défaut
    j'ai oublié de dire que j'utilise le driver oci8

    Merci d'avance pour votre aide

  3. #3
    Membre éprouvé
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Par défaut
    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

  4. #4
    Membre confirmé Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre éprouvé
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Par défaut
    Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $test = $row[1]->read($row[1]->size());
    echo $test;
    Pour avoir le code "complet" jette un oeil sur ce topic.

    --
    Rakken

  6. #6
    Membre confirmé Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. X3 - requêteur SQL : lire des zones CLOB
    Par SD_X3 dans le forum SAGE
    Réponses: 1
    Dernier message: 29/11/2017, 18h07
  2. Ecrire & Lire des énumérés dans un fichier Texte
    Par WebPac dans le forum Langage
    Réponses: 8
    Dernier message: 18/06/2008, 10h04
  3. [SAX] Lire des objets
    Par sylvain_2020 dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 01/12/2004, 16h10
  4. CFile : comment lire des données
    Par romeo9423 dans le forum MFC
    Réponses: 3
    Dernier message: 25/10/2004, 19h10
  5. [ZIP]besoin de lire des fichiers avec l'extension tar.gz
    Par mathieublanc13 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 24/05/2004, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo