PHP Conference Japan 2024

odbc_num_rows

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

odbc_num_rows结果集中的行数

描述

odbc_num_rows(Odbc\Result $statement): int

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

参数

statement

odbc_exec() 返回的 ODBC 结果对象。

返回值

返回 ODBC 结果集中的行数。如果出错,此函数将返回 -1。

变更日志

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

注释

注意:

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

添加注释

用户贡献的注释 17 条注释

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'];

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

echo
"this works for me: num rows=$num_rows\n";
?>
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>total No. of rows: $items";
?>
areznik at survdata dot com
17 年前
我可能之前在这个线程中提到过,但我第一次搜索时没有找到。

当使用 ODBC 连接到 MS SQL 并使其难以获取返回的结果集中的行数时,此函数 (odbc_num_rows) 返回 -1。

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

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

如果有人解释 ORDER BY 子句如何产生差异,将会有所帮助。
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;

希望这能帮到某些人。
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 . "'>Campos(" . $f . ") Registros(" . $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);
}
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,请注意,因为它是准确的,直到该数字。
pjavilla at gmail dot com
12 年前
当通过 ODBC 函数使用 PHP 访问 DB2 数据库时,请注意包含对 IBM 的 LONGDESCRIPTION 表的引用的语句(例如,如果您像我一样正在浏览 IBM 的 Maximo 产品)。读取该表通常需要错误抑制,因为尽管它有效,但 ODBC 仍会在屏幕上显示警告消息。

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

但是,如果您通过像 Toad for DB2 这样的预览器运行查询,在更大的查询中使用 LONGDESCRIPTION 就可以了,并且确实显示了结果。只是如果您正在为 PHP 编写 ODBC 查询,则必须分解查询并将对 LONGDESCRIPTION 的查询隔离到它自己。

给其他遇到 ODBC_NUM_RESULTS 通常可靠但在某些情况下无法解释地总是返回 -1 的人快速说明一下。
[email protected]
16 年前
这里使用的函数之间的差异很大,例如对于一个包含 36 列和 806 行的表,执行这两个函数的时间如下

使用 odbc odbc_result_all 函数耗时 2.6 秒
使用 odbc_fetch_row 函数耗时 0.8 秒
pmo@raadvst-consetatDOTbe
17 年前
voland 的函数非常棒。
但是,我建议使用 ob_end_clean() 完全关闭输出缓冲区(可能会导致奇怪的行为)。
[email protected]
17 年前
我尝试使用 [email protected] 的 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) 工作得更好(对我来说)。
[email protected]
17 年前
今天我们找到了使用 ODBC 统计行数的最佳方法!

function best_odbc_num_rows($r1) {

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

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

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

return $number;

}
[email protected]
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{
告诉用户没有结果
}
[email protected]
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) 没有按预期工作,而是要求我将原始准备好的查询传递给此函数。
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)……神奇 :-)
[email protected]
17 年前
我的开发计算机运行的是 XP sql2005,而生产副本位于 Server 2003R2 sql2000 计算机上。

在尝试使此函数工作(从 mssql 切换到 odbc)的过程中,我发现这两个操作系统上的 ODBC 驱动程序版本不同,并且较新版本(发布日期 2007 年 2 月 17 日)能够安装在 2003 上并可以很好地处理此函数,而旧版本则无法处理。

Microsoft 网站建议 Vista 也可能处理它(即具有更新的驱动程序)。它还表示没有计划以可安装软件包的形式发布更新的驱动程序。

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

希望在不久的将来在 Server 2003R2 上使用 sql2005 进行测试,以确认是驱动程序在这里起作用。
[email protected]
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