Образ BLOB-объекта Oracle возвращается как пустой ресурс с использованием PDO и stream_get_contents - PullRequest
1 голос
/ 30 июня 2019

Я пытаюсь получить изображение из BLOB, хранящегося в базе данных Oracle XE.

Чтобы проверить, «есть ли что-то там»:

enter image description here

Итак, я попробовал это с помощью PDO:

<?php
//carrega_foto_oracle.php?funcionario_id=10    

include '..\conexao_oracle.php';

$stmt = $pdo->prepare("select mimetype, binario from foto where funcionario_id=?");
$stmt->execute(array($_REQUEST['funcionario_id']));
$stmt->bindColumn(1, $type, PDO::PARAM_STR);
$stmt->bindColumn(2, $blob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);
header("Content-Type: $type");
echo stream_get_contents($blob);

Мой браузер жалуется на «некоторые проблемы с моей картинкой», поэтому я попытался сбросить ресурс (перед функцией заголовка):

var_dump(stream_get_contents($blob));exit();

И в результате получается пустая строка: (

string(0) "" 

Есть что-то, чего мне не хватает?

Заранее спасибо

РЕДАКТИРОВАТЬ: мое соединение:

<?php
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_CASE => PDO::CASE_LOWER //opcional: campos com nome minúsculo
];

$servidor = "localhost";
$usuario = "php";
$senha = "admin";
$service_name = "XE";
$sid = "XE";
$port = 1521;
$dbtns = "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = $servidor)(PORT = $port)) (CONNECT_DATA = (SERVICE_NAME = $service_name) (SID = $sid)))";

$pdo = new PDO("oci:dbname=" . $dbtns . ";charset=utf8", $usuario, $senha, $options);

1 Ответ

0 голосов
/ 03 июля 2019

У меня есть этот старый рабочий образец. Тем не менее, вы действительно должны использовать OCI8, а не PDO_OCI

<?php

try {
    $db = new PDO('oci:dbname=localhost/orclpdb1', 'cj', 'cj');
} 
catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
    exit;
}   

$stmt = $db->prepare("drop table cjblob");
$stmt->execute();

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $db->prepare("create table cjblob (id number, data blob)");
$stmt->execute();

function do_insert($db, $id, $data)
{
    $db->beginTransaction(); 
    $stmt = $db->prepare("insert into cjblob (id, data) values (:id, empty_blob()) returning data into :blob");
    $stmt->bindParam(':id', $id);
    $stmt->bindParam(':blob', $blob, PDO::PARAM_LOB);
    $blob = null;
    $stmt->execute();
    fwrite($blob, $data);  
    fclose($blob);  
    $db->commit();
}

do_insert($db, 1, str_pad("Z",  40000, "X"));

// Fetch it back
$stmt = $db->prepare('select data from cjblob where id = ?');
$id = 1;
$stmt->execute(array($id));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump(stream_get_contents($row['DATA']));

?>
...