在越來越多的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.限制/偏移量 接近“標記頁數”的結果
作為一個附加的功能。你可以看看如何完成顯示一個從很大的數據結果得出的限制/偏移量的查詢。
<?php
/*我們將從一個基礎的使用顯示一個方案。在這個例子里使用的文件是由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 "<h1>ERROR - Could not connect to Oracle</h1>";
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 "<h1>ERROR - Could not parse SQL statement.</h1>";
exit;
}
/*
如果你輸入了一個錯誤的SQL語句或者出現了另一個錯誤,你將看到“無法分析SQL”的錯誤提示,$stmt現在就是一個定義語句。
現在執行你的分析語句
*/
OCIExecute($stmt);
/*
語句現在已經被執行了,但是正如你所看到的,沒有結果標志符從OCIExecute()返回,由OCIParse()返回的結果包含了所有Oracle所需要的信息。
現在開始選擇這個查詢的結果,$total rows[0]將會包含一個數。如果沒有行被返回,則顯示錯誤并退出腳本的運行。
*/
OCIFetchInto($stmt, &$total_rows);
if ( !$total_rows[0] ) {
echo "<h1>Error - no rows returned!</h1>";
exit;
}
/*
這段代碼是可選擇的但將會使返回的結果更清楚,顯示一個類似于“總共有15條記錄,現在顯示的是第4條到第15條結果?!钡淖⑨?
*/
$begin =($offset+1);
$end = ($begin+($limit-1));
if ($end > $total_rows[0]) {
$end = $total_rows[0];
}
echo "There are <b>$total_rows[0]</b> results.<br>\n";
echo "Now showing results <b>$begin</b> to <b>$end</b>.<br><br>\n";
/*
現在是言歸正傳的時候了,釋放原先的語句標識然后建立SQL語句.分析并執行SQL語句,
寫代碼時需注意:不同于MYSQL,Oracle在SQL語句中不支持限制語句。就本身而言,有很多方法選擇特定的行,最好的方法是把選擇的結果放在一個臨時表里或者“緩沖“所有的結果。這樣的方法已經超出了這篇教程的范圍了。我們將使用一個更簡單的方法,在下面將進一步的解釋。
*/
OCIFreeStatement($stmt);
$sql = "Select * from table_name";
$stmt = OCIParse($conn, $sql);
if(!$stmt) {
echo "<h1>ERROR - Could not parse SQL statement.</h1>";
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 "<a href=\"$PHP_SELF?offset=$prevoffset\"><< PREV</a> \n";
}
// Now loop through the pages to create numbered links
// ex. 1 2 3 4 5 NEXT >>
for ($i=1;$i<=$pages;$i++) {
// Check if on current page
if (($offset/$limit) == ($i-1)) {
// $i is equal to current page, so don't display a link
echo "$i ";
} else {
// $i is NOT the current page, so display a link to page $i
$newoffset=$limit*($i-1);
echo "<a href=\"$PHP_SELF?offset=$newoffset\">$i</a> \n";
}
}
//檢查當前頁面是否為最后一頁
if (!((($offset/$limit)+1)==$pages) && $pages!=1) {
// Not on the last page yet, so display a NEXT Link
$newoffset=$offset+$limit;
echo "<a href=\"$PHP_SELF?offset=$newoffset\">NEXT >></a><p>\n";
}
/*
現在我們完成了有關Oracle的任務,所以釋放最后的語句標識并且退出。
*/
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
所有人都還在這里?很好,你完成了!這個方法可以被用在很多更深入的理解Oracle和PHP的能力上。