odbc_binmode

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

odbc_binmode处理二进制列数据

描述

odbc_binmode(资源 $statement, 整数 $mode):

控制二进制列数据的处理方式。受影响的 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

结果标识符。

如果 statement0,则设置将作为新结果的默认值应用。

mode

mode 的可能值为

注意: 二进制长列的处理方式也会受到 odbc_longreadlen() 的影响。

返回值

始终返回

添加注释

用户贡献注释 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