odbc_num_rows

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

odbc_num_rows结果中的行数

说明

odbc_num_rows(resource $statement): int

获取结果中的行数。对于 INSERT、UPDATE 和 DELETE 语句,odbc_num_rows() 返回受影响的行数。对于 SELECT 子句,这 可以 是可用行的数量。

参数

statement

odbc_exec() 返回的结果标识符。

返回值

返回 ODBC 结果中的行数。此函数在出错时将返回 -1。

注释

注意:

使用 odbc_num_rows() 确定 SELECT 之后可用的行数,对于许多驱动程序来说,这将返回 -1。

添加说明

用户贡献说明 17 个说明

6
walt at brookhouse dot co dot uk
14 年前
在驱动程序返回 -1 的情况下,计算 odbc 结果集中的行数的简单方法是让 SQL 来完成工作。

<?php

$conn
= odbc_connect("dsn", "", "");
$rs = odbc_exec($conn, "SELECT Count(*) AS counter FROM tablename WHERE fieldname='" . $value . "'");
$arr = odbc_fetch_array($rs);
echo
$arr['counter'];

?>
1
j.c
4 年前
在我的服务器上,odbc_num_rows() 返回一种奇怪的 48 位整数(可能是一个 64 位整数,前面有 16 位零)。
我发现可以通过用 0xffffffff 对结果进行掩码来获取正确的值。
<?php
// your $result=odbc_exec(...)
$num_rows = odbc_num_rows($result) & 0xffffffff;

echo
"这对我有效:行数=$num_rows\n";
?>
3
chew_baka at hotmail dot com
14 年前
这些示例对我来说都没有用,所以我提出了以下愚蠢的程序,它可以给出我的行数。这个例子很粗糙,但你应该明白其中的意思。

<?php
$cxn
= odbc_connect("ODBC_DSN_NAME", "", "");
$sql = "SELECT * FROM some_table'";
$res = odbc_exec($cxn, $sql);
$items = 0;
while (
$row = odbc_fetch_array($res))
{
$items++;
}
odbc_free_result($res);
echo
"<br>总行数: $items";
?>
1
areznik at survdata dot com
16 年前
我之前可能在该线程中提到过,但我第一次搜索时没有找到。

当对 MS SQL 进行 ODBC 操作并难以获取返回的记录集中的行数时,此函数(odbc_num_rows)将返回 -1。

两种解决方法
1. 当你只需要验证你的查询是否返回了任何行时,你可以使用 select count(*) as cnt from table,然后只获取 $row['cnt']
2. 当你确实需要循环遍历记录时,只有当你在查询语句中包含 ORDER BY 子句时,此函数才会返回记录集中行数。

这听起来有点令人讨厌,但我想这就是处理 MS SQL odbc 驱动程序时的解决方法。

如果有人能解释一下 ORDER BY 子句是如何造成差异的,那就太好了。
0
tom dot underwood5 at gmail dot com
5 年前
有时如果你使用的是存储过程而不是实际的 SELECT/INSERT/UPDATE,odbc_num_rows 可能会返回不可靠的数字(我所有的内容都得到了 3 或 0)。在我的情况下,我能够使用以下方法来确定行数

// 将数据放入数组

while ($data[] = odbc_fetch_array($result));

// 使用本机 php 函数来获取其大小

$num_rows = count($data);
echo $num_rows;

希望这能帮助到某些人。
0
panchome66 at gmail dot com
10 年前
此代码在 SQL Server 2000 中经过测试,在其他版本(如 2005 或 2008)中未经测试。尽管如此,它不适用于 MySQL,因为不存在 "sysindexes" 表。

$cnx = odbc_connect("dbSQLEmpresa","Admin","123");
if ($cnx)
{
$rs = odbc_exec($cnx, "SELECT * FROM alumnos");
$f = odbc_num_fields($rs);
$r = odbc_num_rows($rs);
$r = LFRJ_odbc_num_rows($cnx,"alumnos");

echo "<table border = '1'>";
for ($i = 1; $i <= $f; $i++)
{
$n = odbc_field_name($rs, $i);
echo "<th>", $n, "</th>";
}
while(odbc_fetch_row($rs))
{
echo "<tr>";
for ($i = 1; $i <= $f; $i++)
{
$d = odbc_result($rs, $i);
echo "<td>", $d, "</td>";
}
echo "</tr>";
}
echo "<tr><td colspan = '" . $f . "'>字段(" . $f . ") 记录(" . $r . ")</td></tr>";
echo "</table>";
}
odbc_close($cnx);

function LFRJ_odbc_num_rows($cnx,$Tabla)
{
$rs = odbc_exec($cnx, "SELECT rows FROM sysindexes WHERE id = OBJECT_ID('" . $Tabla . "') AND indid < 2;");
return odbc_result($rs, 1);
}
0
johnnyboyct-AT-yahoo.com
11 年前
function best_odbc_num_rows($r1) {
ob_start(); // 阻止打印带有结果的表格
(int)$number=odbc_result_all($r1);
ob_clean(); // 阻止打印带有结果的表格
return $number;
}

以上是如果你没有使用 IBM Netezza 和 ODBC 并且没有处理超过 100000 条记录的最佳计数方法,否则即使这种方法也会耗尽内存。

IBM Netezza 和 ODBC 会给你匹配 odbc.ini 文件中预取设置的计数 :( 默认值为 256,所以要小心,因为它是精确的,直到那个数字。
0
pjavilla at gmail dot com
11 年前
当通过 ODBC 函数通过 PHP 访问 DB2 数据库时,请注意包含对 IBM LONGDESCRIPTION 表的引用的语句(例如,如果你像我一样,正在深入研究 IBM 的 Maximo 产品)。从该表读取通常需要错误抑制,因为尽管它有效,但 ODBC 会在屏幕上输出警告消息。

然而,当你将其作为另一个查询的一部分时,ODBC_NUM_ROWS 将始终返回 -1。解决方法是将对 LONGDESCRIPTION 的任何查询保持在独立的单独查询中。

但是,如果你通过 Toad for DB2 等预览程序运行查询,在更大的查询中使用 LONGDESCRIPTION 是可以的,并且会显示结果。只是如果你为 PHP 编写 ODBC 查询,则必须将查询分解并单独隔离对 LONGDESCRIPTION 的查询。

对于其他发现 ODBC_NUM_RESULTS 通常很可靠,但在某些情况下莫名其妙地始终返回 -1 的人来说,只是一个快速提示。
0
sirio3mil at gmail dot com
16 年前
这里使用的函数之间的差异相当大,例如,对于一个包含 36 列和 806 行的表,执行这两个函数的时间分别是:

使用 odbc odbc_result_all 的函数耗时 2.6 秒
使用 odbc_fetch_row 的函数耗时 0.8 秒
0
pmo@raadvst-consetatDOTbe
16 年前
voland 的函数简直棒极了。
但是,我建议使用 ob_end_clean() 来完全关闭输出缓冲区(可能会导致奇怪的行为)。
0
nielsvandenberge at hotm dot dot dot dot dot com
16 年前
我刚尝试使用 voland 在 digitalshop dot ru 上提供的 best_odbc_num_rows($result) 函数,但它不太好用。执行完 odbc_result_all(); 后,结果集必须再次重置。
使用以下方法重置

odbc_fetch_row($result, 0);

对我来说不起作用。

我认为 odbc_result_all() 函数的内部数字值没有重置,但这只是一个猜测。

当我对一个包含 17 行的结果集执行该函数 3 次时,返回的值为:17、34 和 51。

他之前提供的 useful_odbc_num_rows($result) 函数对我来说效果更好。
0
voland at digitalshop dot ru
17 年前
今天我们找到了用 ODBC 统计行数的最佳方法!

function best_odbc_num_rows($r1) {

ob_start(); // 阻止打印带有结果的表格

(int)$number=odbc_result_all($r1);

ob_clean(); // 阻止打印带有结果的表格

return $number;

}
0
dm at personalcomputingsolutions dot co dot uk
17 年前
function db_get_row($cur, $rownum){
if (odbc_fetch_into($cur, $row, $rownum)){
return ($row);
}else{
return (FALSE);
}

$i=1;
if (db_get_row($cur,1)){
while ($record=db_get_row($cur,$i++)){
执行操作
}else{
告诉用户没有结果
}
-1
jeff at script-xs dot com
15 年前
经过几分钟的沮丧,我终于意识到为什么 odbc_num_rows 没有返回在预处理更新查询中受影响的行数。我正在使用 ODBC 连接到 Microsot SQL Server 2005。

我修正后的代码

<?php
$query
= odbc_prepare($conn, 'UPDATE table SET cat = ? WHERE id = 1');
$result = odbc_execute($query, $category);
$affected = odbc_num_rows($query);
?>

这段代码可以正常工作。我对 odbc_num_rows($result) 无法按预期工作感到沮丧,因为它需要我将原始预处理查询传递给该函数。
-2
Gerd Christian Kunze
11 年前
odbc_num_rows 在不应该返回 -1 时会返回 -1。

我使用了以下代码

<?php
if( odbc_num_rows( $Result ) ) {
while(
false !== ( $Row = @odbc_fetch_array( $Result ) ) ) {
// 对 $Row 执行某些操作
}
}
else {
return
false;
}
?>

但这不起作用... 显然

但这个 while 循环会跳过空结果集,所以我使用这个

<?php
while( false !== ( $Row = @odbc_fetch_array( $Result ) ) ) {
// 对 $Row 执行某些操作
}
if( !
odbc_num_rows( $Result ) ) {
return
false;
}
?>

因为在用 fetch 处理完 $Result 后,odbc_num_rows 会报告正确的计数(false|0..n)... 真神奇 :-)
-1
Nathaniel at comtel dot com dot au
16 年前
我的开发计算机运行的是 XP sql2005,而生产副本运行在 server 2003R2 sql2000 计算机上。

在尝试使此函数正常工作(从 mssql 切换到 odbc)的过程中,我发现这两个操作系统上的 ODBC 驱动程序版本不同,并且虽然可以在 2003 上安装的较新版本(发布日期 17/2/07)可以很好地处理此函数,但较旧的版本却不行。

Microsoft 网站建议 Vista 也可能支持它(即具有较新的驱动程序)。它还说没有计划以可安装包的形式发布较新的驱动程序。

http://support.microsoft.com/kb/892854

希望在不久的将来使用 server 2003R2 上的 sql2005 进行测试,以确认是驱动程序在这里提供了帮助。
-3
voland at digitalshop dot ru
17 年前
在花费一个小时寻找 odbc_num_rows 的好的替代函数后... 我决定自己写一个

function useful_odbc_num_rows($result){

$num_rows=0;

while($temp = odbc_fetch_into($result, &$counter))

{
$num_rows++;
}

@odbc_fetch_row($result, 0); // 重置游标

return $num_rows;
}
To Top