odbc_result

(PHP 4、PHP 5、PHP 7、PHP 8)

odbc_result获取结果数据

说明

odbc_result(资源 $statement, 字符串|整数 $field): 字符串|布尔值|

获取结果数据

参数

statement

ODBC 资源

field

要检索的字段名称。它可以是包含要检索的字段的列号的整数;或者可以是包含字段名称的字符串。

返回值

返回字段的字符串内容,false 表示错误,null 表示 NULL 数据,或者true 表示二进制数据。

范例

第一次调用 odbc_result() 返回查询结果中当前记录的第三个字段的值。第二次调用 odbc_result() 返回查询结果中当前记录的字段名为 "val" 的字段的值。如果字段的列号参数小于 1 或超过当前记录中的列数(或字段数),则会发生错误。类似地,如果字段的名称不是正在查询的表(s)的字段名之一,也会发生错误。

范例 #1 odbc_result() 例子

<?php
$item_3
= odbc_result($Query_ID, 3);
$item_val = odbc_result($Query_ID, "val");
?>

注释

字段索引从 1 开始。关于返回二进制或长列数据的方式,请参考 odbc_binmode()odbc_longreadlen()

添加注释

用户贡献的注释 14 条注释

3
dinin at fas dot harvard dot edu
24 年前
这里有一个限制,任何地方都没有提到(我能看到的),它让我头疼了好几个小时,试图找出为什么我的数据库没有正确初始化。
如果您尝试从数据库中检索大量字段,请注意 odbc_result 只能返回最多 33 个结果列。如果超过 33 个,它会在您的脚本中生成“结果超出范围”警告。
(我尝试调整为 32 个字段,但错误仍然存在。)每当您尝试检索足够大的记录的最后一个字段时,它都会生成一个错误“警告:字段索引大于您的脚本 your-script.php 第 70 行中的字段数”。对我来说,有效的做法是将最后一列写两次... 这样,查询就有 34 个字段,但最后两个是相同的。您知道如果要求第 34 列,它会崩溃,但只要使用 ODBC_result(current_query, 33) 就可以了,您不会有问题。祝好运

-D
3
lucas at bizzfone dot nl
14 年前
odbc_result() 函数有一个明显鲜为人知的特性,在检索大型文本或二进制字段时非常有用。
考虑以下代码片段将大型值检索到临时文件(为了清晰起见,省略了错误测试)

<?php
$con
=odbc_connect(...);
$query="set textsize 2147483647 ".
"select someLargeField from ...";
$resultset=odbc_exec($con,$query);
odbc_binmode($resultset,ODBC_BINMODE_RETURN);
odbc_longreadlen($resultset,4096);
while (
odbc_fetch_row($resultset)) {
$fileHandle=fopen('/tmp/myfile','wb');
while ((
$chunk=odbc_result($resultset,'someLargeField'))!==false) {
fwrite($fileHandle,$chunk);
}
fclose($fileHandle);
// 对文件执行某些操作
}
?>

要使其正常工作,需要着重注意以下几点
- 确保在您的查询中包含 "set textsize 2147483647 "。
如果没有它,MSSQL 默认情况下会将大型值截断为 4096 字节。
其他数据库可能也有类似的限制。
- odbc_binmode() 和 odbc_longreadlen() 调用仅仅是为了安全起见。
它们在 php.ini 中的默认值通常是正确的。
- 每次对大型字段的 odbc_result() 调用似乎都会返回下一个块。
当然,您必须在下一个 odbc_fetch_row() 调用之前读取所有块。
- 当所有大型值都被读取后,odbc_result() 将返回 false。

注意:使用 mssql_ 而不是 odbc_ 函数不是可行的替代方案。它们不适用于块(据我所知),甚至会在查询结果包含大型值时导致 PHP 崩溃(溢出、段错误)。
2
匿名
21 年前
来自 https://php.net/manual/en/function.odbc-longreadlen.php,但在这里也相关。

另一种方法是调整您的 php.ini 文件并设置
odbc.defaultlrl=65536
或其他足够大的值。
lrl = 长读取长度

以解决返回字符的限制。
1
user at frosch dot org
23 年前
关于在 Windows 上访问 TEXT 字段的希望有用的注释,使用 PHP 的 ODBC 支持访问 Sybase*。使用以下代码

"SELECT status AS projstatus,oid AS projident,LOWER(title) AS projtitel,startsOn AS projanfang,terminatesOn AS projende,description AS projinfo FROM Project ORDER BY projtitel ASC"

我遇到了一个奇怪的错误

警告:SQL 错误:[INTERSOLV][ODBC SQL Server 驱动程序][SQL Server]无效的列名 'projanfang'。,SQL 状态 S0022 在 [**脚本名称和路径已删除**] 的 SQLGetData 中,第 126 行

尽管我清楚地选择了 "projanfang" 作为字段。我最终发现的原因是 Sybase/ODBC 试图对 TEXT 字段 "description" 进行转换,这会失败,因为 CONVERT 的限制为 255 个字符,而 TEXT 是一种字段类型,其限制为 2 GB。我不确定为什么它不能隐式工作,但它可以显式工作。以下代码将不会出现错误

"SELECT status AS projstatus,oid AS projident,LOWER(title) AS projtitel,startsOn AS projanfang,terminatesOn AS projende,CONVERT(CHAR(255),description) AS projinfo FROM Project ORDER BY projtitel ASC"

我不知道如果需要超过 255 个字符的文本字段该怎么办 :(。我也尝试了 longreadlen,但我不知道如何使用它。

* 系统详细信息:Windows NT 4.0 SP6a、IIS 4.0、Sybase 11.5 Adaptive Enterprise、PHP 4.0.5。
0
murat at nospam dot robcol dot k12 dot tr
22 年前
当尝试从 Access 数据库中获取日期/时间字段时,odbc_result 会将日期作为文本返回(例如 1998-07-11 21:12:23)。您可以使用 strtotime 函数将其转换为可用于 PHP 的格式。

例如
echo "日期是 "
.date("r",strtotime(odbc_result($myquery,"mydate")));
0
nomail at nomail dot nomail
23 年前
问题:函数一次调用最多返回 4095 字节的单元格数据。

提示:如果您有一个单元格包含超过 4095 个字节的数据,请编写一个循环,并在返回值不为空字符串 "" 的情况下,反复调用该单元格。所有返回值都可以累加到整个字符串中。
0
dac at felspar dot com
23 年前
顺便说一句,ADO 和类似使用 ODBC 的接口也无法区分 A.id 和 B.id。简单的解决方案是在 SQL 中使用别名。

考虑一个名为 "A" 的表,它只包含 "id" 列。接下来,考虑以下查询:

SELECT * FROM A JOIN B ON A.id=B.id

使用 ODBC,您将被迫使用数字索引,而不是名称。但是,您也可以重写查询:

SELECT A.id AS A_id, B.id AS B_id FROM A JOIN B ON A.id=B.id

这在三个方面更好:

首先,除非您真的想要结果集中的所有内容,否则它可能会更快。SQL 服务器使用 "*" 可能更快,但网络通常会从更少的数据(或更小的元组宽度,如果您精通数据库术语)中获益。

其次,由于您被迫思考查询中需要什么,因此您可能最终会编写更好的 SQL。

第三,如果您稍微更改查询(或表),则无需重新访问所有代码以应对更改。

抱歉说了一些显而易见的事情,而且我的例子缺乏想象力。
0
jniels23 at csc dot com
25 年前
如果您在结果集中有同名的字段,请小心。

<?php
$res
= odbc_exec($conn,"select * from PeopleMR,People,Role,Organisation".
" WHERE PeopleMR.MeetingID = $MeetingID" .
" ORDER BY People.Surname");
?>

我从 TABLE Role 和 TABLE Organisation 中都有 "Name" 字段,对于 MySQL,您将执行以下操作:

<?php
mysql_result
($res,$count,"Role.Name");
mysql_result($res,$count,"Organisation.Name");
?>

但使用 odbc,您将执行以下操作:

<?php odbc_result($res,$count,"Name"); ?>

这将为您提供 TABLE Role 的 "Name" 的结果,因此您必须找到 Organisation"Name" 的字段编号才能获得正确的结果。
-1
fate at doityourself dot com
21 年前
如果您想快速将网站从 odbc 数据访问更改为 mysql 数据访问,您可以使用以下简单的函数:
function myresult ($cur,$nr) {
return mysql_result($cur,0,mysql_field_name($cur,$nr-1));
}
只需将 "odbc_result" 全局替换为 "myresult" 即可。

请注意,您只应在不太关心性能的情况下使用此方法,因为这将为请求的每个字段启动一个查询。当然,更好的方法是使用 mysql_fetch_row!
-2
huevo dot SP at M dot earthling dot net
23 年前
对于 Access 2K 数据库,odbc_result 只能在第一次调用 memo 字段(odbc_field_type 返回 'LONGCHAR')时起作用。

$good = odbc_result($result,'Description');
# $good 包含字段值
$fail = odbc_result($result,'Description');
# $fail 包含 false

这让我在执行以下操作时遇到了麻烦:

for ($i=1; $i<=odbc_num_fields($result); $i++) {
if(odbc_result($result,$i)){
... 更多代码 ...
echo odbc_result($result,$i);
... 裁剪 ...
}
}

对于除 memo 以外的任何字段类型,此代码都能完美运行。但在 memo 字段上,odbc_result 在第二次调用时返回 false,并且不会输出任何内容。

小心,使用临时变量代替对 odbc_result 的多次调用。(无论如何,这是良好的编程实践)

for (...) {
$temp = odbc_result($result,$i);
if($temp){
...
echo $temp;
...
}
}
-3
baoshenyi at hotmail dot com
19 年前
我使用一个存储过程从 SQL Server 表中检索标识符、其他、名称、部分、数据和创建日期列的值到变量中。

使用 $odbc_result = odbc_exec($connect,$query); 函数。

之后,我使用以下代码:
for($f=1;$f<=odbc_num_fields($odbc_result);$f++) {echo "<td style=\"font-weight:bold\">$f ".odbc_field_name($odbc_result,$f)."</td>";}
echo "</tr></table>";
odbc_fetch_row($odbc_result);
echo odbc_result($odbc_result,1)."<br>";
echo odbc_result($odbc_result,2)."<br>";
echo odbc_result($odbc_result,3)."<br>";
echo odbc_result($odbc_result,4)."<br>";
echo odbc_result($odbc_result,5)."<br>";
echo odbc_result($odbc_result,6)."<br>";

结果如下:
1 identifier 2 other 3 name 4 section 5 data 6 datecreated
id1
other2
name3
section4
警告:odbc_result() [function.odbc-result]:SQL 错误:[Microsoft][ODBC SQL Server Driver]无效描述符索引,SQL 状态 S1002 在 SQLGetData 中 d:\lawdepot_test\contracts\common\LicensingSQL.php 的第 630 行
2005-03-16 18:12:00

我无法获取 "data"(文本列)数据。首先,我认为 "data" 列对于 odbc_result($odbc_result,5) 函数来说太长了,但当我检查我的旧代码时,我发现我可以使用相同的 odbc_result() 函数获取 "data" 数据。

我很想听听您的建议。这个问题让我很沮丧。

Michael
-2
vlad dot posea at mymail dot ro
21 年前
我使用 odbc 和 mysql,我注意到在浪费了大量时间后,如果您编写类似以下代码:
echo odbc_result($result,1);
....
echo odbc_result($result,1);
第二个 echo 将失败。因此,将 odbc_result 的结果保存到变量中并在稍后使用它会更有用,
例如:
$var=odbc_result($result,1);
-4
我希望这会有用!
12 年前

FYI:odbc_result 包含以下值:TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME PRECISION LENGTH SCALE RADIX NULLABLE REMARKS COLUMN_FLAGS

我编写了以下代码将这些值转储到页面上。我需要它来确定列的数据类型是否为特定类型(例如:blob),以便显示不同的结果,而不是实际内容。
$connection_string = 'OPTIM_BLOB';
$user = '';
$pass = '';

if (!($connect = odbc_pconnect($connection_string, $user, $pass))) {
} else {
echo '连接到 DSN,加载表格<br /><br />';
$result = odbc_tables($myconn);
$tables = array();
while (odbc_fetch_row($result)){
if(odbc_result($result,"TABLE_TYPE")=="TABLE") {
$TableName = odbc_result($result,"TABLE_NAME");
echo '<span id="tableName">表格:'.$TableName.'</span> ....<br /><br /> ';
//--------- 显示该表格中的列 ---------------

$result2 = odbc_columns($myconn, '', "%", $TableName, "%"); //db 连接、数据库名称、架构、表名、列名);
while(odbc_fetch_row($result2)){

//TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME PRECISION LENGTH SCALE RADIX NULLABLE REMARKS COLUMN_FLAGS
$COLUMN_NAME = odbc_result($result2, 4); // COLUMN_NAME
$DataType = odbc_result($result2, 6);

echo '<b>列名:'.$COLUMN_NAME.'</b> 类型:'.$DataType.'<br /><br />';
// 所有内容
echo '1: '.odbc_result($result2, 1).'<br />'; // TABLE_QUALIFIER
echo '2: '.odbc_result($result2, 2).'<br />'; // TABLE_OWNER
echo '3: '.odbc_result($result2, 3).'<br />'; // TABLE_NAME
echo '4: '.odbc_result($result2, 4).'<br />'; // COLUMN_NAME
echo '5: '.odbc_result($result2, 5).'<br />'; // DATA_TYPE (数字)
echo '6: '.odbc_result($result2, 6).'<br />'; // TYPE_NAME (字符串)
echo '7: '.odbc_result($result2, 7).'<br />'; // PRECISION
echo '8: '.odbc_result($result2, 8).'<br />'; // LENGTH
echo '9: '.odbc_result($result2, 9).'<br />'; // SCALE
echo '10: '.odbc_result($result2, 10).'<br />'; // RADIX
echo '11: '.odbc_result($result2, 11).'<br />'; // NULLABLE
echo '12: '.odbc_result($result2, 12).'<br />'; // REMARKS
echo '13: '.odbc_result($result2, 13).'<br />'; // COLUMN_FLAGS
}
}
}
}
-6
echo '<br /><br />';
24 年前
dave at quiver dot com
如果我使用带有 memo 类型字段的 MS Access 2000 数据库,我会得到
To Top