Php 使用PDO和stream_get_内容将Oracle BLOB映像作为空资源返回

Php 使用PDO和stream_get_内容将Oracle BLOB映像作为空资源返回,php,oracle,pdo,blob,Php,Oracle,Pdo,Blob,我正在尝试从存储在Oracle XE数据库中的BLOB中检索图像 要测试是否“有东西在那里”: 因此,我尝试使用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->

我正在尝试从存储在Oracle XE数据库中的BLOB中检索图像

要测试是否“有东西在那里”:

因此,我尝试使用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);
结果是一个空字符串:(

有什么我遗漏的吗

提前谢谢

编辑:我的连接:

<?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);

我有这个旧的工作示例。但是,您确实应该使用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']));

?>

我有这个旧的工作示例。但是,您确实应该使用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']));

?>


Try
fpassthru($blob)
而不是
echo stream\u get\u contents($blob)
返回0:(@lufcTry
fpassthru($blob)
而不是
echo stream\u get\u contents($blob)
返回0:(@lufcI将尝试,但即使使用oci->load()我也有空结果)tooCheck for OCI8示例我将尝试它,但即使使用oci->load()tooCheck for OCI8示例,结果仍然为空
<?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']));

?>