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 位元整數(也許是帶有 16 位元前導零的 64 位元...)。
我發現可以使用 0xffffffff 來遮罩結果以取得正確的值
<?php
// 您的 $result=odbc_exec(...)
$num_rows = odbc_num_rows($result) & 0xffffffff;

echo
"這對我有效:列數=$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>總列數: $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 . "'>欄位(" . $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);
}
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,且處理的記錄數不超過 10 萬筆,以上是計算筆數的最佳方式,否則即使這種方法也會耗盡記憶體。

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 的人的快速筆記。
sirio3mil at gmail dot com
16 年前
這裡使用的函數之間的差異相當大,例如,對於一個包含 36 個欄位和 806 列的表格,執行這兩個函數的時間如下

使用 odbc odbc_result_all 的函數耗時 2.6 秒
使用 odbc_fetch_row 的函數耗時 0.8 秒
pmo@raadvst-consetatDOTbe
17 年前
voland 的函數非常棒。
但是,我會建議使用 ob_end_clean() 來完全關閉輸出緩衝區 (可能會導致奇怪的行為)。
nielsvandenberge at hotm dot dot dot dot dot com
17 年前
我剛嘗試使用 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) 運作得更好(對我來說)。
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;

}
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{
告訴使用者沒有結果
}
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) 沒有像我預期的那樣工作,而是需要我將原始的準備好的查詢傳遞給這個函數。
Gerd Christian Kunze
11 年前
odbc_num_rows 在不應該的時候會返回 -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) ... 真神奇 :-)
Nathaniel at comtel dot com dot au
17 年前
我的開發電腦執行 XP sql2005,而生產副本位於 server 2003R2 sql2000 電腦上。

在嘗試讓這個函數運作 (從 mssql 切換到 odbc) 的過程中,我發現兩個作業系統之間的 ODBC 驅動程式版本不同,而且雖然較新版本 (發布日期為 2007/2/17) 能夠在 2003 上安裝,可以很好地處理此函數,但舊版本則不行。

Microsoft 網站建議 Vista 也可能處理它 (即擁有較新的驅動程式)。它還表示沒有計劃以可安裝套件的形式發布較新的驅動程式。

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

希望在不久的將來在 server 2003R2 上使用 sql2005 進行測試,以確認是驅動程式在此有所幫助。
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