Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
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 19/04/2007, 14h24   #1
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
Par défaut fetchall et pdo_oci

Bonjour, j'ai un problème super zarb avec php et le driver pdo oci.
En gros, je me connecte a la base, je fais une requete basique, un fetchall et j'affiche. le problème, c'est que rien n'est affiché. Aucun message d'erreur, rien.

La ou c'est vraiment fun, c'est que si je fait un "flush()" mettons au milieu du fichier, il m'affiche tout ce qui était avant.
Si le flush est ma derniere commande, tout est affiché.
Si le flush est ma derniere commande php est que derriere, j'ai encore un peu de html pur, tout est affiché jusqu'au flush, mais pas le html se trouvant derriere.

ob_end_flush(); ne donne rien.

La table que je tente de lire contient un BLOB. Si j'utilise le même code sans lire de BLOB, ca passe correctement.

Voici l'intégralité du code pour reproduire le problème :
Code :
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
<body>
<?php
 
$dsn = "oci:dbname=10.199.2.30/oradev1;host=";
$login = "root";
$pass = "root";
 
try
{
	$db = new PDO($dsn, $login, $pass);
	echo ("<u>Connection établie : </u><br />\n");
	echo ("dsn = " . $dsn . "<br />\n");
	echo ("login=" . $login . " - pass=" . $pass . "<br />\n");
} 
catch (PDOException $e) {
	printf("Erreur a la connection : %s\n", $e->getMessage()); 
}
 
$sql = 'SELECT "content" FROM "f_locale" WHERE "id" = :id AND "lang" = :lang';
$key = 'modules.auth.backoffice.front.logintitle';
$lang = 'fr';
$stmt = $db->prepare($sql);
$stmt->bindValue(':id', $key, PDO::PARAM_STR);
$stmt->bindValue(':lang', $lang, PDO::PARAM_STR);
$stmt->bindColumn('content', $results[0]['content'], PDO::PARAM_LOB);
if (!$stmt->execute()) {$this->showError($stmt);}
$results = $stmt->fetchAll();
 
if (count($results) > 0)
{
	$streamContent = stream_get_contents($results[0]['content']);
	fclose($results[0]['content']);	
	echo $streamContent;
} else {
	echo ("Il n'y a aucun résultat pour la requête.");	
}
echo ("<br />");
?>
Hello world !
</body>
La table "f_locale" ressemble a ca :
Code :
1
2
3
4
5
6
"id" NOT NULL VARCHAR2(256) 
"lang" NOT NULL CHAR(2) 
"package" VARCHAR2(256) 
"overridden" NUMBER(10)
"overridable" NUMBER(10) 
"content" BLOB
Merci a quiconque aurait un début de piste, parce que j'en viens a me demander si ce n'est pas pdo_oci qui est completement buggé... (Apparament, les CLOB ne sont même pas géré, ce qui m'incite a penser que ce driver n'est pas franchement stabilisé, et le "Ce module est EXPERIMENTAL." qui est sur cette page a tendance a me faire un peu peur.
Ceci dit, dans la mesure ou le but est de migrer une appli sous mysql vers du oracle et que l'appli en question est faite avec pdo (justement pour être "portable" ) je suis obligé d'utiliser pdo.

Bref, a l'aide...
__________________
Rakken

Oneira, un monde imaginaire d'Heroic Fantasy.

Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/
Rakken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2007, 09h52   #2
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
Bon, visiblement quand on execute ce code sur une redhat via putty et le php cli, ca marche sans problème. Par contre, si on est directement sur la session, qu'on ouvre un xterm et qu'on execute le même fichier, avec le même php cli, environs une fois sur trois, il affiche un segementation fault.

Après avoir activé les options qui vont bien pour creer le fichier core et en lisant le fichier core avec gdb on obtient :

Code :
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
#0  0x0165d960 in kohfri () from /usr/lib/oracle/10.2.0.3/client/lib/libclntsh.so.10.1
No symbol table info available.
#1  0x0165cb39 in kohfrem () from /usr/lib/oracle/10.2.0.3/client/lib/libclntsh.so.10.1
No symbol table info available.
#2  0x0165c1e8 in kohfrr () from /usr/lib/oracle/10.2.0.3/client/lib/libclntsh.so.10.1
No symbol table info available.
#3  0x0165cc0f in kohfrw () from /usr/lib/oracle/10.2.0.3/client/lib/libclntsh.so.10.1
No symbol table info available.
#4  0x014fbd74 in kollfrfn () from /usr/lib/oracle/10.2.0.3/client/lib/libclntsh.so.10.1
No symbol table info available.
#5  0x00fb2907 in kpufdesc () from /usr/lib/oracle/10.2.0.3/client/lib/libclntsh.so.10.1
No symbol table info available.
#6  0x010822fe in OCIDescriptorFree () from /usr/lib/oracle/10.2.0.3/client/lib/libclntsh.so.10.1
No symbol table info available.
#7  0x0818fad7 in oci_blob_close (stream=0xb7c7bfa0, close_handle=1)
    at /tmp/downloads/php-5.2.0/ext/pdo_oci/oci_statement.c:626
        self = (struct oci_lob_self *) 0x1bb94a4
        stmt = (pdo_stmt_t *) 0xb7c7bf88
#8  0x082e4572 in _php_stream_free (stream=0xb7c7bfa0, close_options=167502108)
    at /tmp/downloads/php-5.2.0/main/streams/streams.c:342
        ret = 1
        preserve_handle = 0
        release_cast = 1
#9  0x082e4aae in stream_resource_regular_dtor (rsrc=0xb000003e)
    at /tmp/downloads/php-5.2.0/main/streams/streams.c:1365
No locals.
#10 0x08314409 in list_entry_destructor (ptr=0xb7c7c050) at /tmp/downloads/php-5.2.0/Zend/zend_list.c:184
        ld = (zend_rsrc_list_dtors_entry *) 0x9ec5450
#11 0x083122a1 in zend_hash_del_key_or_index (ht=0x87146a0, arKey=0x0, nKeyLength=0, h=5, flag=1)
    at /tmp/downloads/php-5.2.0/Zend/zend_hash.c:492
        nIndex = 5
        p = (Bucket *) 0xb7c7c024
#12 0x083141a4 in _zend_list_delete (id=5) at /tmp/downloads/php-5.2.0/Zend/zend_list.c:58
Bref, en d'autre terme, c'est la fonction oci_blob_close qui pose problème, fonction du drivers (et donc sur laquelle je n'ai pas la main).

Si quelqu'un a quand même une idée... j'suis prenneur... vraiment.
__________________
Rakken

Oneira, un monde imaginaire d'Heroic Fantasy.

Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/
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 01h38.


 
 
 
 
Partenaires

Hébergement Web