程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP+Oracle(OCI) 初步

PHP+Oracle(OCI) 初步

編輯:關於PHP編程

從Oracle(OCI)開始

在越來越多的PHP用戶選擇Oracle作為他們的數據庫的情況下,如何訪問PHP發布環境下的Oracle接口變的越發的重要了。我們將從快速的浏覽一個簡單基本且是更加明確的Oracle 的情況開始我們的旅程。Oralce 和Oralce8 使用PHP的OCI8 函數庫。在PHP手冊裡有簡要的說明(http://www.php.net/manual/ref.oci8.php): 這些函數允許你訪問Oracle 和 Oracle7d 的數據庫,它們使用的是Oracle8 Call-Interface(OCI8)。你將需要Oracle8 的客戶端函數庫來使用這些擴展功能。

這些擴展功能比起標准的Oracle擴展功能來更加的靈活,它支持PHP全局及本地變量及與Oracle的連編,有完整的LOB,FILE及ROWID的支持並且允許你定義用戶補充變量。

從這裡開始,我將使用“Oracle”指代任何Oracle版本,這篇文章假定你已經安裝並運行了PHP和Oracle。而Oracle的幫助可以在http://www.oracle.com 或者 http://technet.oracle.com 找到。

本文的觀點是
1.連接到ORALCLE
2.建立並運行SQL語句
3.顯示結果
4.限制/偏移量 接近“標記頁數”的結果

作為一個附加的功能。你可以看看如何完成顯示一個從很大的數據結果得出的限制/偏移量的查詢。

/*我們將從一個基礎的使用顯示一個方案。在這個例子裡使用的文件是由Rod Kreisler編寫的新版本的文章(http://www.phpbuilder.com/columns/rod20000221.php3)。新版本的文件可以在http://php.socket7.net 找到。把$offset設置為0,如果被設置為0或者空的話。
*/
if (empty($offset) || $offset < 0) {
$offset=0;
}

/*我們將從一個基礎的使用顯示一個方案。在這個例子裡使用的文件是由Rod Kreisler編寫的新版本的文章(http://www.phpbuilder.com/columns/rod20000221.php3)。新版本的文件可以在http://php.socket7.net 找到。把$offset設置為0,如果被設置為0或者空的話。
*/
if (empty($offset) || $offset < 0) {
$offset=0;
}

$limit = 3;
/*
連接到Oralce,如果你願意的話,可以在連接數據庫的時候直接使用ORACLE_SID。使用PHP作為CGI使用非連續的連接,現在讓我們在這個例子裡使用這種非連續的連接。在windows裡這個可以在注冊表裡設置,而在unix裡你可以使用 putenv()函數putenv(“ORALCE_SID=ORASID”);
或者 ,如果你願意,你可以在連接數據庫的時候直接參考你的ORACLE_SID,讓我們在這個例子裡直接參考ORACLE_SID。
如果你使用PHP作為APACHE的模塊的話,你可以使用持續連接。而使用非持續連接在使用PHP時作為CGI時,我們在這個例子裡使用非持續連接。
*/

$conn = OCILogon("user_name", "password", "ORASID");

/*
錯誤提示。在沒有數據庫被連接的情況下,將會顯示的錯誤信息並且退出腳本的執行。
*/

if (!$conn) {
echo "

ERROR - Could not connect to Oracle

";
exit;
}

/*
如果連接成功,$conn就是一個連接符。否則,腳本將結束並且輸出“Could not connect to Oracle”的錯誤信息
現在開始來分析並且創建你的SQL語句,由無限制的查詢結果得到可以記數的記錄。
在這裡的格式語句“Select count(*) from table_name”相當於count(),是個SQL函數將會在數據庫裡執行。比由依靠PHP計算得到的返回結果要好。
*/

$sql = "Select count(*) from table_name";

$stmt = OCIParse($conn, $sql);
if(!$stmt) {
echo "

ERROR - Could not parse SQL statement.

";
exit;
}

/*
如果你輸入了一個錯誤的SQL語句或者出現了另一個錯誤,你將看到“無法分析SQL”的錯誤提示,$stmt現在就是一個定義語句。
現在執行你的分析語句
*/

OCIExecute($stmt);

/*
語句現在已經被執行了,但是正如你所看到的,沒有結果標志符從OCIExecute()返回,由OCIParse()返回的結果包含了所有Oracle所需要的信息。
現在開始選擇這個查詢的結果,$total rows[0]將會包含一個數。如果沒有行被返回,則顯示錯誤並退出腳本的運行。
*/

OCIFetchInto($stmt, &$total_rows);

if ( !$total_rows[0] ) {
echo "

Error - no rows returned!

";
exit;
}

/*
這段代碼是可選擇的但將會使返回的結果更清楚,顯示一個類似於“總共有15條記錄,現在顯示的是第4條到第15條結果。”的注釋
*/

$begin =($offset+1);
$end = ($begin+($limit-1));
if ($end > $total_rows[0]) {
$end = $total_rows[0];
}

echo "There are $total_rows[0] results.
n";
echo "Now showing results $begin to $end.
n";

/*
現在是言歸正傳的時候了,釋放原先的語句標識然後建立SQL語句.分析並執行SQL語句,
寫代碼時需注意:不同於MYSQL,Oracle在SQL語句中不支持限制語句。就本身而言,有很多方法選擇特定的行,最好的方法是把選擇的結果放在一個臨時表裡或者“緩沖“所有的結果。這樣的方法已經超出了這篇教程的范圍了。我們將使用一個更簡單的方法,在下面將進一步的解釋。
*/
OCIFreeStatement($stmt);

$sql = "Select * from table_name";

$stmt = OCIParse($conn, $sql);

if(!$stmt) {
echo "

ERROR - Could not parse SQL statement.

";
exit;
}

OCIExecute($stmt);

/*
現在顯示結果。最簡單的做法是在結果集合中使用這個循環。HTML將用來顯示最終的結果,但是這個范例非常的簡單,所以我們一個也不會用。
編寫代碼時注意:如上述規定的,在Oracle裡是無法限制的,所以我們必須通過在全部的結果集取出我們想要的和終止我們已經有的結果來做這個循環。
在這一小節裡,我們將會有幾種不同的方法,實際上應該有更好的方法來寫這個代碼。但是我認為我的這種方法不太容易讀懂,它確實運行有效。
*/

$i=0;
$j=0;
while( OCIFetchInto($stmt, &$result_array) ) {
if ($i>=$offset) {
if ($j <$limit) {
for ($k=0; $k<=count($result_array); $k++) {
echo $result_array[$k]." ";
}
echo "
";
$j++;
}
}
$i++;
}
echo "
";

/*
結果將顯示在當前的頁面裡,現在是給訪問者一個使用NEXT/PREV點擊到其他頁面的時候了
*/

// 計算結果所需的頁面數,
$pages = intval($total_rows[0]/$limit);

// $pages 現在是除剩余的部分外總共所需的頁面數
if ($total_rows[0]%$limit) {
// has remainder so add one page
$pages++;
}

//在顯示的是第一頁時不顯示PREV的連接
if ($offset!=0) {
$prevoffset=$offset-$limit;
echo "

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved