?
本文檔使用 PHP中文網(wǎng)手冊(cè) 發(fā)布
PHP+Oracle(OCI) 初步
windy 2000年10月7日
PHP+Oracle(OCI) 初步
從Oracle(OCI)開(kāi)始
在越來(lái)越多的PHP用戶選擇Oracle作為他們的數(shù)據(jù)庫(kù)的情況下,如何訪問(wèn)PHP發(fā)布環(huán)境下的Oracle接口變的越發(fā)的重要了。我們將從快速的瀏覽一個(gè)簡(jiǎn)單基本且是更加明確的Oracle
的情況開(kāi)始我們的旅程。Oralce 和Oralce8 使用PHP的OCI8
函數(shù)庫(kù)。在PHP手冊(cè)里有簡(jiǎn)要的說(shuō)明(http://www.php.net/manual/ref.oci8.php):
這些函數(shù)允許你訪問(wèn)Oracle 和 Oracle7d 的數(shù)據(jù)庫(kù),它們使用的是Oracle8
Call-Interface(OCI8)。你將需要Oracle8 的客戶端函數(shù)庫(kù)來(lái)使用這些擴(kuò)展功能。
這些擴(kuò)展功能比起標(biāo)準(zhǔn)的Oracle擴(kuò)展功能來(lái)更加的靈活,它支持PHP全局及本地變量及與Oracle的連編,有完整的LOB,F(xiàn)ILE及ROWID的支持并且允許你定義用戶補(bǔ)充變量。
從這里開(kāi)始,我將使用“Oracle”指代任何Oracle版本,這篇文章假定你已經(jīng)安裝并運(yùn)行了PHP和Oracle。而Oracle的幫助可以在http://www.oracle.com
或者 http://technet.oracle.com 找到。
本文的觀點(diǎn)是
1.連接到ORALCLE
2.建立并運(yùn)行SQL語(yǔ)句
3.顯示結(jié)果
4.限制/偏移量 接近“標(biāo)記頁(yè)數(shù)”的結(jié)果
作為一個(gè)附加的功能。你可以看看如何完成顯示一個(gè)從很大的數(shù)據(jù)結(jié)果得出的限制/偏移量的查詢。
<?php
if (empty($offset) || $offset
< 0) {
$offset=0;
}
if (empty($offset) || $offset
< 0) {
$offset=0;
}
$limit = 3;
$conn = OCILogon("user_name", "password", "ORASID");
if
(!$conn) {
echo "<h1>ERROR - Could not connect to
Oracle</h1>";
exit;
}
$sql = "Select count(*) from table_name";
$stmt =
OCIParse($conn, $sql);
if(!$stmt) {
echo "<h1>ERROR - Could
not parse SQL statement.</h1>";
exit;
}
OCIExecute($stmt);
OCIFetchInto($stmt, &$total_rows);
if (
!$total_rows[0] ) {
echo "<h1>Error - no rows
returned!</h1>";
exit;
}
$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";
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);
$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 "
";
//
計(jì)算結(jié)果所需的頁(yè)面數(shù),
$pages = intval($total_rows[0]/$limit);
// $pages
現(xiàn)在是除剩余的部分外總共所需的頁(yè)面數(shù)
if ($total_rows[0]%$limit) {
// has remainder
so add one page
$pages++;
}
//在顯示的是第一頁(yè)時(shí)不顯示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";
}
}
//檢查當(dāng)前頁(yè)面是否為最后一頁(yè)
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";
}
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
所有人都還在這里?很好,你完成了!這個(gè)方法可以被用在很多更深入的理解Oracle和PHP的能力上。