在 PHP 文件中显示来自 Firebird 查询的 BLOB

问题描述 投票:0回答:1

我在 HTML 表中显示 Firebird 查询中的 BLOB 字段时遇到问题。

该字段包含:“清扫地板。”

在 HTML 表中显示为:“0x00ea9572000001ec”

BLOB 仅包含字符。基于此,我找到了代码行

cast(RECORDEDNOTES as blob sub_type text character set utf8) as CONVERTED_RECORDEDNOTES
,我在其中更改了字段名称并添加了别名,但出现了以下错误。我也试过:
cast(RECORDEDNOTES as VARCHAR(250)) as CONVERTED_RECORDEDNOTES

两者都造成了错误:

动态 SQL 错误 SQL 错误代码 = -104 令牌未知 - 第 2 行,列 45、

这是 SQL 语句中代码开始的地方。

后者在 DBeaver 中工作,但在 PHP 中它创建了上述错误,而不是错误的输出。

如何转换 BLOB 数据?我是在查询中执行此操作还是使用生成的查询数据执行此操作?

php firebird
1个回答
0
投票

我使用为 Firebird SQL 编写的以下 PHP 函数。它非常适合我使用和不使用 BLOB 字段的查询来检索其记录。它检测给定查询中是否存在任何 BLOB 字段。读取记录时,如果存在BLOB字段,则读取该BLOB字段的内容。它可以处理没有和有(多个)BLOB 字段的查询。

function selectSQLarray($sql) {
    $dataArr = array();
    /* Attempt to connect to Firebird database */
    $link = ibase_connect (DB_DATABASE, DB_USERNAME, DB_PASSWORD);

    $rid = @ibase_query ($link, $sql);
    if ($rid===false) var_dump($sql); //errorHandle(ibase_errmsg(),$sql);
    
    $coln = ibase_num_fields($rid);
    $blobFields = array();

    /* Get all blob fields from result */
    for ($i=0; $i < $coln; $i++) {
        $col_info = ibase_field_info($rid, $i);
        if ($col_info["type"]=="BLOB") $blobFields[$i] = $col_info["name"];
    }

    /* Read each row from query result */
    while ($row = ibase_fetch_object ($rid)) {
        /* put each blob data into the field */
        foreach ($blobFields as $field_num=>$field_name) {
            try {
                $blobid = ibase_blob_open($row->$field_name);
                if ($blobid == false) {
                    $row->$field_name = '';
                } else {
                    $row->$field_name = ibase_blob_get($blobid,102400);
                    ibase_blob_close($blobid);
                }
            }
                catch(Trowable $t) {
                    $row->$field_name = '';
                }
        }
        $dataArr[] = $row;
    }
    ibase_close ($link);
    return $dataArr;
}
© www.soinside.com 2019 - 2024. All rights reserved.