PHP 大会日本 2024

odbc_binmode

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_binmode处理二进制列数据

描述

odbc_binmode(Odbc\Result $statement, int $mode): true

控制二进制列数据的处理方式。受影响的 ODBC SQL 类型为 BINARYVARBINARYLONGVARBINARY。默认模式可以使用 uodbc.defaultbinmode php.ini 指令设置。

当二进制 SQL 数据转换为字符 C 数据 (ODBC_BINMODE_CONVERT) 时,源数据的每个字节 (8 位) 都表示为两个 ASCII 字符。这些字符是该数字以十六进制形式表示的 ASCII 字符表示形式。例如,二进制 00000001 转换为 "01",二进制 11111111 转换为 "FF"

虽然 BINARYVARBINARY 列的处理仅取决于 binmode,但 LONGVARBINARY 列的处理也取决于 longreadlen。

LONGVARBINARY 处理
binmode longreadlen 结果
ODBC_BINMODE_PASSTHRU 0 直通
ODBC_BINMODE_RETURN 0 直通
ODBC_BINMODE_CONVERT 0 直通
ODBC_BINMODE_PASSTHRU >0 直通
ODBC_BINMODE_RETURN >0 按原样返回
ODBC_BINMODE_CONVERT >0 返回为字符

如果使用 odbc_fetch_into(),则直通表示这些列返回空字符串。如果使用 odbc_result(),则直通表示数据直接发送到客户端(即打印)。

参数

statement

ODBC 结果对象。

mode

mode 的可能值为

注意二进制长列的处理也受 odbc_longreadlen() 影响。

返回值

始终返回 true

变更日志

版本 描述
8.4.0 statement 现在期望一个 Odbc\Result 实例;以前,期望一个 resource
添加注释

用户贡献的注释 4 条注释

yhalmoe at yahoo dot no
14 年前
对于使用 ODBC 的 Sybase 用户(这可能也适用于 MS-SQL Server)

我使用与 mizmerize 相同的代码,但在选择具有 image 数据类型的数据时,我从服务器获取到的数据被截断(在 32kb 标记处)。我的 Sybase 服务器的 @@textsize 属性为 2Gb,应该足够了。但显然,php ODBC 驱动程序在建立连接时将其重置为 32Kb,然后在之后将其重置回 2Gb。解决方法是执行查询

<?php odbc_exec($connH, "set textsize 131072"); ?>

在您的主查询之前立即执行,在 mizmerize 的代码中。这应该会覆盖默认设置。
mizmerize at yahoo dot com
18 年前
我目前正在使用 SQL Server 2000 作为 ODBC 访问的数据源,在运行 Windows 2000 的 Apache 2 服务器上测试 PHP 脚本。

我试图使用 ODBC 从数据库获取图像,但输出始终自动刷新,而我只是使用 odbc_result() 函数获取结果。

使用此代码,图片在我点击 odbc_result() 时会自动打印到浏览器(可能是一个错误,但错误报告并不容易)。

<?php
$connH
=odbc_pconnect("ImageDB","sa","",SQL_CUR_USE_IF_NEEDED) or die(odbc_errormsg());
$result=odbc_exec($connH, "SELECT Emp_Image FROM tblEmployeePics WHERE Emp_Id=547");
if (
$result) {
odbc_longreadlen($result, 131072);
odbc_binmode($result,ODBC_BINMODE_PASSTHRU);
//调用此函数后,输出会刷新到浏览器...让我抓狂
$m_FValue=odbc_result($result, 1);
}
?>

...在抓狂了 48 小时后,我终于找到了一个解决方法,但使用了 bin2hex() 函数文档中的一个函数...

<?php
function hex2bin($data){
$len = strlen($data);
return
pack("H" . $len, $data);
}


$connH=odbc_pconnect("ImageDB","sa","",SQL_CUR_USE_IF_NEEDED) or die(odbc_errormsg());
$result=odbc_exec($connH, "SELECT Emp_Image FROM tblEmployeePics WHERE Emp_Id=547");
if (
$result) {
odbc_longreadlen($result, 131072);
odbc_binmode($result,ODBC_BINMODE_CONVERT);
$m_FValue=odbc_result($result, 1);
$out=hex2bin($m_FValue);
}
?>

技巧是将输出转换为十六进制,方法是将 odbc_binmode 更改为 ODBC_BINMODE_CONVERT,并使用一个方便的函数将其转换回二进制,以便于操作其大小、深度等。
andrea dot galli at acotel dot com
21 年前
示例:从数据库中检索图像。

<?php

$Link_ID
= odbc_connect("DSN", "user", "pass");
$Query_ID = odbc_exec($Link_ID, "SELECT picture FROM categories");

// 更改为 ODBC_BINMODE_CONVERT 以进行比较

odbc_binmode($Query_ID, ODBC_BINMODE_RETURN);

$Images = odbc_result($Query_ID, 1);

echo
$Images;

?>
bortuzar
15 年前
我在脚本开头设置了 odbc_longreadlen(),以便 nText 字段类型不会被截断,如下所示

<?php odbc_longreadlen (0, 1000000); ?>
To Top