PHP Conference Japan 2024

odbc_result

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

odbc_result取得結果資料

描述

odbc_result(Odbc\Result $statement, string|int $field): string|bool|null

取得結果資料

參數

statement

ODBC 結果物件。

field

要檢索的欄位名稱。它可以是一個整數,包含您想要欄位的欄號;或者它可以是一個字串,包含欄位的名稱。

回傳值

回傳欄位的字串內容,錯誤時回傳 false,NULL 資料時回傳 null,二進位資料時回傳 true

變更記錄

版本 描述
8.4.0 statement 現在預期是 Odbc\Result 實例;先前預期是 resource

範例

第一次呼叫 odbc_result() 回傳查詢結果目前記錄中第三個欄位的值。第二次呼叫 odbc_result() 回傳查詢結果目前記錄中欄位名稱為 "val" 的值。如果欄位的欄號參數小於 1 或超過目前記錄中的欄數(或欄位數),則會發生錯誤。同樣地,如果欄位名稱不是正在查詢的表格之欄位名稱之一,也會發生錯誤。

範例 #1 odbc_result() 範例

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

注意事項

欄位索引從 1 開始。關於二進位或長欄位資料的回傳方式,請參考 odbc_binmode()odbc_longreadlen()

新增註解

使用者貢獻的註解 13 個註解

3
dinin at fas dot harvard dot edu
24 年前
這裡有一個沒有在任何地方提及的限制(我可以看到),並且讓我為了找出為什麼我的資料庫沒有正確初始化而頭痛了幾個小時。
如果您嘗試從資料庫中檢索大量欄位,請注意 odbc_result 可能只會回傳最多 33 個結果欄。超過此數量,則會在您的腳本中產生「結果超出範圍」的警告。
(我嘗試調整為 32 個欄位,但出現相同的錯誤。)每次您嘗試檢索足夠大的記錄的最後一個欄位時,都會產生「警告:欄位索引大於您的腳本.php 第 70 行的欄位數」的錯誤。對我來說有效的方法是將最後一個欄位寫入兩次...這樣,查詢有 34 個欄位,但最後兩個欄位是相同的。您知道如果要求第 34 個欄位會崩潰,但只要使用 ODBC_result(current_query, 33) 就不會有問題。祝你好運

-D
3
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_ 函式並非可行的替代方案。它們無法與區塊一起運作(據我所知),甚至在查詢結果包含大型值時會使 php 崩潰(溢位、分段錯誤)。
2
匿名
21 年前
來自 https://php.dev.org.tw/manual/en/function.odbc-longreadlen.php 但這裡也適用。

另一種方法是調整您的 php.ini 檔案並設定
odbc.defaultlrl=65536
或其他足夠大的值。
lrl = long read length(長讀取長度)

以繞過傳回字元的限制。
1
user at frosch dot org
23 年前
希望此註解對使用 PHP 的 ODBC 支援來存取 Sybase* 的 Windows 上存取 TEXT 欄位有所幫助。使用以下程式碼

"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'。,在 [**腳本名稱與路徑已移除**] 的第 126 行的 SQLGetData 中出現 SQL state S0022

即使我明明已經選取了一個欄位並將其命名為 '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 Enteprise, 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 "The date is "
.date("r",strtotime(odbc_result($myquery,"mydate")));
0
nomail at nomail dot nomail
24 年前
問題:函式一次呼叫最多傳回一個儲存格的 4095 個位元組。

提示:如果您的儲存格包含超過 4095 個位元組,請編寫一個迴圈並重複呼叫該儲存格,直到傳回值為 "" 為止。所有傳回值都可以加總為整個字串。
0
dac at felspar dot com
24 年前
順帶一提,ADO 和類似的使用 ODBC 的介面也無法區分 A.id 和 B.id。簡單的解決方案是在 SQL 中使用別名。

考慮一個只包含資料行 "id" 的資料表 "A"。接著,考慮以下查詢

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 僅在第一次呼叫備忘欄位時才有效 (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;
...
}
}
-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] 無效的描述元索引,在 d:\lawdepot_test\contracts\common\LicensingSQL.php 的第 630 行的 SQLGetData 中出現 SQL state S1002
2005-03-16 18:12:00

我無法取回 "data" (Text 欄位)。首先,我認為 "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
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, "%"); //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
echo '<br /><br />';
}
}
}
}
To Top