结合PDO查询结果

时间:2016-10-18 21:14:28

标签: php oracle pdo

我有一个表,我将其称为table_x,将文件附件作为Oracle数据库中的二进制大对象。

但是,每个文件没有一行,每28kb文件块有一行。每个blob永远不会超过28kb。

行可能看起来像:

attachsysfilename        file_seq      file_size      file_data
blah.xlsx                0             12000          <BLOB>
poo.xlsx                 0             28000          <BLOB>
poo.xlsx                 1             9000           <BLOB>

没有行的文件大小&gt; 28000字节。每个attachsysfilenamefile_seq组合都是唯一的。当一个文件超过28000字节时,它将被拆分为2行以上,具体取决于存储文件所需的28kb块。

如果我直接从数据库中导出blob,我需要在打开它们之前连接存储在2行以上的blob。例如,如果我下载了2份Excel文件,我必须在命令行上使用Windows(例如type part1.xlsx part2.xlsx > combined.xlsx)来组合这些部分。组合文件将正常打开,但单独打开任一部分将返回错误。

我正在用PHP编写一些使用PDO访问这些数据的页面,并希望在代表同一文件时使用PHP类似地连接2+ blob。

编写页面以下载仅存储在一行(大小为28kb或更小)的文件时,我没有任何问题。我的工作原理如下:

$att = $cono -> prepare (" SELECT attachsysfilename,
                                  file_size,
                                  file_data
                           from   table_x
                           where  attachsysfilename = :file_id
                          ");

$att -> bindParam(':file_id', $file_id, PDO::PARAM_STR);
$att -> execute();
$att -> bindColumn(1, $attachsysfilename, PDO::PARAM_STR, 256);
$att -> bindColumn(2, $file_size, PDO::PARAM_STR, 256);
$att -> bindColumn(3, $file_data, PDO::PARAM_LOB);
$att_row = $att -> fetch( PDO::FETCH_BOUND );

header("Content-type: application/vnd.openxmlfo");
header("Content-Disposition: inline; filename = $attachsysfilename");
fpassthru($file_data);

只要文件限制为表格的一行,上述工作就可以正常工作。

这是我在2行以上处理这些文件的最佳尝试:

$att = $cono -> prepare (" SELECT attachsysfilename,
                                  file_size,
                                  file_data
                           from   table_x
                           where  attachsysfilename = :file_id
                          ");

$att -> bindParam(':file_id', $file_id, PDO::PARAM_STR);
$att -> execute();
$att -> bindColumn(1, $attachsysfilename, PDO::PARAM_STR, 256);
$att -> bindColumn(2, $file_size, PDO::PARAM_STR, 256);
$att -> bindColumn(3, $file_data, PDO::PARAM_LOB);

$combined_blob = '';

while (  $att_row = $att -> fetch( PDO::FETCH_BOUND ) )
{ 
  $combined_blob = $combined_blob . $file_data;

}

header("Content-type: application/vnd.openxmlfo");
header("Content-Disposition: inline; filename = $attachsysfilename");
fpassthru($combined_blob);
?>

返回此错误(在下载的文件中):

<b>Warning</b>:  fpassthru() expects parameter 1 to be resource, string given in ....

目标是将php中的2+ blob组合在一起,以便组合的blob可以作为文件下载,而不是任何一个部分。

0 个答案:

没有答案