PHP Conference Japan 2024

odbc_longreadlen

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

odbc_longreadlen处理 LONG 列

描述

odbc_longreadlen(Odbc\Result $statement, int $length): true

控制 LONGLONGVARCHARLONGVARBINARY 列的处理。可以使用 uodbc.defaultlrl php.ini 指令设置默认长度。

参数

statement

ODBC 结果对象。

length

返回到 PHP 的字节数由参数 length 控制。如果将其设置为 0,则使用 odbc_result() 检索时,长列数据将传递到客户端(即打印)。

返回值

始终返回 true

变更日志

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

备注

注意:

LONGVARBINARY 列的处理也受 odbc_binmode() 影响。

添加注释

用户贡献的注释 6 条注释

3
php dot net dot notes at webqs dot com
19 年前
你好

如果您在通过 ODBC 使用 PHP 与 MS SQL 时遇到截断和/或编码奇怪的数据问题,请尝试将 odbc.defaultlrl(在 php.ini 或通过 ini_set())设置为较大的数字,例如 65536,如此处其他注释中所述。
诀窍是了解您的数据将有多长,因此您可能需要提供一些开销。不幸的是,您必须在切割之前知道字符串的长度。

这样做将允许您的应用程序一次读取最多此数量的数据。我确信这种行为是有原因的,但我在 5 年的 MySQL 和 Postgres 开发中从未遇到过类似的情况。

如果您仍然遇到问题并且在表的长列中使用 Unicode 数据,请确保将其设置为“ntext”类型,如果它是“text”。MSDN 有关 Unicode 数据的数据类型的一些信息。
这导致我头疼了大约 3 天,“二进制”数据导致浏览器崩溃和循环结果集(即在 odbc.defaultlrl 字节后重复数据)。

此修复程序仅通过用棍子戳东西才找到。

希望对您有所帮助
2
Eion Robb
8 年前
此处未在注释中提及,但 odbc_longreadlen($result, 0); 仅影响 odbc_result() 的输出。将读取长度设置为 0(或小于零)将在 odbc_fetch_object()、odbc_fetch_array() 和 odbc_result_all() 函数中仅输出空字符串
0
egil at wp dot pl
15 年前
我尝试使用第一条评论中的建议,但它并没有按我预期的那样工作……我想获取所有数据,无论它有多大,但发生了奇怪的事情,我最终找到了这个解决方案(至少对于 MS SQL 2000 而言,至少对于几 MB 的二进制数据有效)

<?php
// 连接
$link = odbc_connect($odbc_source_name, $user, $pass);

// 查询(注意 - 此示例中一行)
$sql = 'SELECT image_data_column FROM some_table WHERE record_id=1';

// 运行
$result = odbc_exec ($link, $sql)
if (!
$result)
{
trigger_error ('[sql] exec: '.$sql, E_USER_ERROR);
}

// 获取设置
odbc_binmode ($result, ODBC_BINMODE_PASSTHRU);
odbc_longreadlen ($result, 0);

// 获取内容
ob_start(); // 如果您期望更多行,您可能需要将其移到内部
while (odbc_fetch_row($result))
{
odbc_result($result, 1); // 这实际上会回显 image_data_column 的所有内容
}
odbc_free_result($result);
$contents = ob_get_clean();
?>
0
jdcard at inreach dot com
19 年前
我正在从 MSAccess 中的 MEMO 字段(长 varchar)读取,但数据始终在 255 个字符处被截断。我尝试了我能想到的所有 odbc_longreadlen() 和 odbc_binmode()(以及 odbc.defaultlrl)组合,但没有一个解决了问题。

唯一有效的修复方法是将我的查询从“SELECT Field1, Field2 FROM TableName”修改为“SELECT * FROM TableName”。

我怀疑您可以将字段强制转换为强制执行适当的数据类型,但当它在经过三天的奋斗后最终工作时,我甚至没有尝试。
0
匿名
22 年前
另一种方法是调整您的 php.ini 文件并设置
odbc.defaultlrl=65536
或其他足够大的东西。
lrl = 长读取长度
0
jasendorf at lcounty dot com
23 年前
我花了很长时间才弄清楚如何使用此函数。这是我找到的来自 Jason Lee 的一小段代码,它可能对其他人有所帮助……

$cur = odbc_exec($cnx, $query);
if(!$cur) {
/* 错误处理程序 */
}

odbc_binmode($cur, ODBC_BINMODE_PASSTHRU);
odbc_longreadlen($cur, 16384); /* 允许通过 16kb */

while(odbc_fetch_row($cur)) {
$bigger_than_4096_var = odbc_result($cur, 1);
/* 等... */

希望这对某人有帮助,John
To Top