2024年PHP开发者大会 日本站

odbc_result

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

odbc_result获取结果数据

描述

odbc_result(Odbc\Result $statement, 字符串|整数 $field): 字符串|布尔值|空值

获取结果数据

参数

statement

ODBC 结果对象。

field

要检索的字段名。它可以是一个包含字段列号的整数;也可以是一个包含字段名的字符串。

返回值

返回字段的字符串内容,错误时返回false,NULL 数据返回null,二进制数据返回true

变更日志

版本 描述
8.4.0 statement 现在需要一个 Odbc\Result 实例;之前需要一个 资源

范例

第一次调用 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()

添加备注

用户贡献的备注 13 条备注

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

-D
lucas at bizzfone dot nl
15年前
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_ 函数不是可行的替代方案。它们不使用块工作(AFAIK),甚至在查询结果包含大值时会崩溃 php(溢出,分段错误)。
匿名
21年前
来自 https://php.net/manual/en/function.odbc-longreadlen.php,但在这里也很相关。

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

以解决返回字符的限制。
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 in SQLGetData in [**脚本名称和路径已移除**] 第126行

即使我明确地选择了名为'projanfang'的字段。我最终发现的原因是Sybase/ODBC尝试对TEXT字段'description'进行转换,但由于CONVERT的限制为255个字符,而TEXT字段类型限制为2GB,因此转换失败。我不确定为什么它不能隐式工作,但显式工作。以下代码可以正常运行:

"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 Enteprise,PHP 4.0.5。
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")));
nomail at nomail dot nomail
24年前
问题:函数一次调用最多返回4095字节的单元格数据。

提示:如果单元格包含超过4095字节的数据,请编写一个循环,并反复调用单元格,直到返回为空字符串""。所有返回结果可以拼接成完整的字符串。
dac at felspar dot com
24年前
顺便说一句,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。

第三,如果您稍微更改了查询或表,则无需重新修改所有代码来应对更改。

对于这些显而易见的内容,以及我示例缺乏想象力,我表示歉意。
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");
?>

我从Role表和Organisation表中都有“Name”字段,对于MySQL,您可以这样做:

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

但是使用ODBC,您可以这样做:

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

这将为您提供Role表的“Name”字段的结果,因此您必须找到Organisation表“Name”字段的字段编号才能获得正确的结果。
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!
huevo dot SP at M dot earthling dot net
23年前
对于Access 2K数据库,odbc_result只能在第一次调用备忘录字段(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);
...省略...
}
}

对于除备忘录字段之外的任何字段类型,此代码都能完美运行。但在备忘录字段中,odbc_result在第二次调用时返回false,并且没有任何内容被输出。

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

for (...) {
$temp = odbc_result($result,$i);
if($temp){
...
echo $temp;
...
}
}
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驱动程序]无效的描述符索引,SQL状态S1002 in SQLGetData in 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
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);
我希望这会有用!
cgray at develop4 dot us
12年前
参考信息: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, "%"); //数据库连接,数据库名称,模式,表名,列名);

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
echo '<br /><br />';
}
}
}
}
To Top