嗨,
在對 odbc_num_rows() 函式進行了很多調整,並嘗試讓 odbc_fetch_array() 與它良好搭配後,我決定編寫這個小函式,它將返回一個二維陣列,格式為 [列號][欄位]。
「列號」陣列索引顯然是儲存在陣列中的列號。
「欄位」索引對應於該列上的欄位名稱。
--函式--
<?
function fetch2DArray($res){
$i = 0;
$j = 0;
$toReturn = "";
while(odbc_fetch_row($res))
{
for ($j = 1; $j <= odbc_num_fields($res); $j++)
{
$field_name = odbc_field_name($res, $j);
$ar[$field_name] = odbc_result($res, $field_name);
}
$toReturn[$i] = $ar;
$i++;
}
return $toReturn;
}
?>
然後我更進一步... 並編寫了一個完整的類別來處理 odbc 連線... 它有點粗糙,但運作良好。
-- 類別 --
<?
class odbcConnection{
var $user; //資料庫的使用者名稱
var $pass; //密碼
var $conn_handle; //連線控制代碼
var $temp_fieldnames; //用於儲存欄位名稱的暫存陣列,讓剖析返回的資料更容易。
function odbcConnection(){ // 應為 odbcRecordset 建構函式
$this->user = "";
$this->pass = "";
}
function connectDatabase($dsn_link,$user,$pass){
$handle = @odbc_connect($dsn_link,$user,$pass,SQL_CUR_USE_DRIVER) or die("<B>錯誤!</B> 無法連線到資料庫。錯誤碼: ".odbc_error());
$this->conn_handle = $handle;
return true;
}
function runStoredQuery($query, $returns_results){
if($returns_results == false){
return false;
}
$toReturn = "";
$res = @odbc_exec($this->conn_handle, "exec ".$query."") or die("<B>錯誤!</B> 無法執行預存程序。錯誤碼: ".odbc_error());
unset($this->temp_fieldnames);
$i = 0;
$j = 0;
while(odbc_fetch_row($res))
{
//建立暫存陣列
for ($j = 1; $j <= odbc_num_fields($res); $j++)
{
$field_name = odbc_field_name($res, $j);
$this->temp_fieldnames[$j] = $field_name;
$this->temp_fieldnames[$j];
$ar[$field_name] = odbc_result($res, $field_name);
}
$toReturn[$i] = $ar;
$i++;
}
return $toReturn;
}
function runSQL($query,$returns_results){
$toReturn = "";
$res = @odbc_exec($this->conn_handle,$query) or die("<B>錯誤!</B> 無法執行查詢。錯誤碼: ".odbc_error());
unset($this->temp_fieldnames);
if($returns_results == false){
return false;
}
$i = 0;
$j = 0;
while(odbc_fetch_row($res))
{
//建立暫存陣列
for ($j = 1; $j <= odbc_num_fields($res); $j++)
{
$field_name = odbc_field_name($res, $j);
$this->temp_fieldnames[$j] = $field_name;
$ar[$field_name] = odbc_result($res, $field_name);
}
$toReturn[$i] = $ar;
$i++;
}
return $toReturn;
}
}
//以及如何使用這個類別的範例
include("dbClass.inc"); //其中 dbClass.inc 是包含此類別的檔案名稱
//宣告此類別的新實例
$dbConnection = new odbcConnection;
$dsn = "GroupWork"; //您的系統 DSN 名稱,指向您的資料庫
$dbConnection->connectDatabase($dsn,"",""); //無使用者名稱和密碼 - 唯讀存取
echo "<BR><HR><B>測試 SQL</b><BR><BR>";
$query_result = $dbConnection->runSQL("SELECT * FROM Event WHERE Type = 'Sport' ORDER BY EDate ASC",true);
if(!$query_result)
{
//無結果 - 您的錯誤代碼在此
}else{
//取得結果
$key = $dbConnection->temp_fieldnames;
$rows = count($query_result);
$keys = count($key);
$i = 0;
while($i < $rows){
$j = 1;
echo "印出第 $i 列:<BR>";
while($j < $keys - 1){
//$query_result[列][欄位];
$result = $query_result[$i][$key[$j]];
$field = $key[$j];
echo("欄位 <b>'".$field."'</b> : ".$result." <BR>");
$j++;
}
echo "<BR>----<BR><BR>";
$i++;
}
}
?>
希望這有所幫助。如果有人對這個類別有任何改進,請告訴我。