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 :

[Doctrine] Oracle 9ir2 Clob


Sujet :

PHP & Base de données

  1. #1
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut [Doctrine] Oracle 9ir2 Clob
    Bonjour,

    Voilà un problème sur lequel je bloque depuis plusieurs jours...

    J'ai déclaré dans mon shema yaml un champ de type string sans contrainte de longueur.
    la table créée dans Oracle par doctrine définit pour ce champ le type CLOB

    J'ai donc crée un listener héritant de Doctrine_Record_Listener afin de récupérer le flux du champ et de le modifier en string à la volée :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    function fixClob_recursive(&$array, &$table)
    {
     
        if (!is_null($array)) {
            $columns = $table->getColumns();
            $relations = $table->getRelations();
            foreach ($array as $k => &$v) {
                if (is_array($v)) {
                    fixClob_recursive($v, $relations[key($v)]);
                } else {
     
                	if (array_key_exists(strtolower($k), $columns) && ($columns[strtolower($k)]['type'] == 'string' && empty($columns[strtolower($k)]['length']))) {
     
                        /* le bloc ci-dessous fonctionne bien, il m'affiche un string */
                        var_dump(stream_get_contents($v));
     
                        /* ce bloc ne fonctionne pas, page blanche pas de trace... */
                        $array[$k]= stream_get_contents($v); 
     
                    }  
                }
            }
            unset($columns, $relations);
        }
    }
     
     
    class OracleFixHydratationListener extends Doctrine_Record_Listener {
     
    	public function preHydrate(Doctrine_Event $event) {
     
     
    		$datas = $event->data;
                    $table = $event->getInvoker();
     
     
                    fixClob_recursive($datas, $table);
     
     
            /* ce debug me sort le flux directement ( ressource id #XX ) */
            echo "<pre>";
            print_r($datas);
            echo "</pre>";
            //*/
     
            $event->data = $datas;
            unset($datas, $table);
     
        }
     
    }
     
    ?>
    J'aurais loupé quelque chose ?

    Toute aide sera bienvenue !!

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Un clob en php, il est vu comme un string non ?

    Je ne comprend pas trop l'intérêt de tous ce code compliqué ? Il me manque le : "mais pourquoi qu'il fait si compliqué qu'il a surement raison mais que je n'en vois vraiment pas l'intérêt". Si tu avais le pourquoi, j'aurais peut-être une solution...
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  3. #3
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    Citation Envoyé par Michel Rotta Voir le message
    Un clob en php, il est vu comme un string non ?
    eh ben non justement, le CLOB dans oracle permet de stocker du binaire (une image par exemple) comme du textuel de plus de 4ko, mais le format texte est stocké en ASCII aussi.
    c'est pourquoi je suis obligé de le parser à la manière d'un flux de fichier avec stream_get_contents()

    Citation Envoyé par Michel Rotta Voir le message
    Je ne comprend pas trop l'intérêt de tous ce code compliqué ? Il me manque le : "mais pourquoi qu'il fait si compliqué qu'il a surement raison mais que je n'en vois vraiment pas l'intérêt".
    Je me complique la vie J'utilise un listener car je peux facilement le charger au moment de la création du pool de connexion si et seulement si le SGBD le requiert. (pas besoin de gérer le CLOB avec postgresql et mysql, l'appli fonctionne bien...)

    Le listener est executé par le gestionnaire d'événement de doctrine avant chaque hydratation (passage du result sql sous forme d'objet en un tableau de valeur), ceci quand on appelle la méthode fetchArray() de l'objet Doctrine_Query
    Je crée un Listener appliqué à la connexion (CAD à toutes les tables) afin de gérer tous les champs de type CLOB de la même façon.
    En gros, cela m'évite de modifier manuellement le jeu de résultats à chaque DQL...

    Ce que je ne comprends pas, c'est que j'affiche le résultat de stream_get_contents() mais que je n'arrive pas à le pusher dans un array. C'est comme si la méthode ne renvoyait pas vraiment un string mais plutôt un standard out (comme print_r() en somme ) ou un truc du genre...

    Petite précision, je force le charset doctrine en ISO8859-1 (mon appli fonctionne en UTF-8) mais je pense qu'il n'y a pas de rapport...

    merci

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    J'étais passé à côté du fait que tu utilises Oracle, qui manque à ma culture en temps que base liée à php (utilisé, mais pas dans ce cadre).

    Donc... question idiote, as-tu déjà fait des recherches sur google pour ce truc ? Tu ne dois pas être le seul à utiliser oracle avec des clob et doctrine ?

    Si non, je n'ai jamais utilisé les listner sous doctrine, je suppose qu'il doivent ressembler à l'équivalent que l'on a sous symfony, mais ce n'est qu'une supposition.

    Ta fonction stream_get_contents est bien sensée retourner du string. Essaye peut-être de passer par une variable intermédiaire ? Et de vérifier le contenu de la variable (j'ai déjà eu une fois un truc pareil avec je ne sais plus quel fonction, il fallait passer par une variable, un bug de php dans une vielle version de 4 quelque chose.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  5. #5
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    Merci de ta réponse,

    Le listener est une solution que j'ai trouvé/adapté sur la toile...

    j'ai déjà essayé en vain de passer par une allocation intermédiaire. Résultat identique.

    Tomorrow will be a better day !

  6. #6
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Bon, si on doit voir cela demain, ca me laisse une journée pour y réfléchir.

    Le pb est que je n'ai pas de base oracle sous la main pour tester quoi que cela soit.

    Questions : Quel est le message d'erreur ? Est-il systématique (champ vide, champ très petit) ? Est-ce le même message si tu passes par une variable intermédiaire ?

    Exemple de code pour le passage par une variable intermédiaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $strInt = '';
    $strInt .= stream_get_contents($v);
    $array[$k] = $strInt;
    Si erreur, elle arrive quant ? Lors de l'affectation du stream dans $strInt ou celle du supposé string dans le tableau ?
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  7. #7
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    Bonjour Michel,

    Tout d'abord, merci de ta réactivité...

    Ca marche enfin !!!

    J'ai en fait combiné 2 solutions dont la tienne...
    Je ne comprends pas très bien comment fonctionne la fonction stream_get_contents() en natif, je ne parle pas de la doc, mais de son fonctionnement réel. Il fallait que je précise la longueur du tampon (ici -1 pour "tout le flux") et que je l'empile dans une variable...

    Si j'ai le temps, j'approfondirai ma recherche plus tard.
    pour info, je suis sous PHP5.3.1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    $fixClob= '';
    $fixClob .= stream_get_contents($v, -1);
    $array[$k]= $fixClob;
    ...
    Encore merci !

  8. #8
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Ca ressemble furieusement au bug que j'avais sur la 4...

    Tu devrais pouvoir te passer de la variable et faire la même chose directement dans le tableau.

    Heureux que cela marche. Comme quoi, les vieux bogue peuvent donner de nouvelles solutions
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertion CLOB to NCLOB oracle 9ir2
    Par Mehdilis dans le forum SQL
    Réponses: 4
    Dernier message: 20/05/2008, 14h35
  2. [oracle 9ir2 + PLSQL] statistiques de tables
    Par seal dans le forum Oracle
    Réponses: 6
    Dernier message: 12/08/2005, 15h56
  3. [Oracle 9ir2] Export zippé ?
    Par seal dans le forum Oracle
    Réponses: 21
    Dernier message: 09/08/2005, 15h48
  4. Oracle 9iR2 sur Fedora Core 3 PROBLEME de runInstaller
    Par greatmaster1971 dans le forum Oracle
    Réponses: 13
    Dernier message: 29/12/2004, 19h34
  5. [PL/SQL - Oracle 9i] CLOB et owa_pattern
    Par rebolon dans le forum Oracle
    Réponses: 9
    Dernier message: 18/11/2004, 15h28

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