首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | linux相关 | linux认证 | 下载中心 | 专题
oklinux
 系统管理:中文环境 系统管理 桌面应用 内核技术 Linux基础:安装配置 常用命令 经验技巧 软件应用 Linux数据库:Mysql POSTGRE
 网络管理:网络安全 网络应用 Linux服务器 编程开发:PHP CC++ Python Perl SHELL 嵌入式开发 | PHP基础 PHP技巧 PHP应用 PHP文摘
 首页 linux资讯动态 Linux专题 | 其他Unix Linux解决方案 硬件相关 Linux认证 企业应用 Apache | 相关下载:软路由 参考手册 开发工具
 → 当前位置:首页>编程开发>php>php技巧>正文

PHP+Oracle(OCI) 初步

OKLinux www.oklinux.cn 2007-02-22 来源:oklinux收集整理 会员收藏 游客收藏

从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.限制/偏移量 接近“标记页数”的结果

作为一个附加的功能。你可以看看如何完成显示一个从很大的数据结果得出的限制/偏移量的查询。

<?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> &nbsp; \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 &nbsp; ";

} 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> &nbsp; \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的能力上。

上一篇:PHP用流方式制作缩略图   下一篇:Debian下php环境的简单搭建
收藏于收藏夹】 【评论】 【推荐】 【投稿】 【打印】 【关闭

相关文章
·Debian下php环境的简单搭建
·PHP用流方式制作缩略图
·PHP程序与服务器端通讯方法小结
·PHP程序员的优化调试技术和技巧
·用PHP在Linux上读取输入并进行文件操作
·PHP应用技巧:如何将代码中的通知和警告删
·如何利用PHP操纵Oracle LOB类型数据
·PHP应用技巧:通过SMTP发送电子邮件
·PHP程序与服务器端通讯的方法
·PHPUnit袖珍指南之自动测试
发表评论
密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。)
站内搜索
阅读排行榜
·PHP 应用程序配置模式
·PHP面向对象编程快速入门
·用 PHP 读取文件的正确方
·用 PHP V4 开发的代码迁移
·五个常见 PHP 数据库问题
·利用单元测试对PHP 代码进
·如何用PHP调用自己编写的C
·使用PHP 快速生成Flash 动
·用Pear加速PHP程序开发
·用PHP在Linux上读取输入并
最新文章
·用Pear加速PHP程序开发
·Debian下php环境的简单搭
·PHP用流方式制作缩略图
·PHP程序与服务器端通讯方
·PHP程序员的优化调试技术
·用PHP在Linux上读取输入并
·PHP应用技巧:如何将代码
·如何利用PHP操纵Oracle LO
·PHP应用技巧:通过SMTP发
·PHPUnit袖珍指南之自动测
·PHP程序与服务器端通讯的
·还是说php实现singleton模
·PHP编程技巧:看实例学正
·用 PHP 读取文件的正确方
·使用PHP 快速生成Flash 动

设为首页 - 加入收藏 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2007 All rights reserved OKLinux.Cn 版权所有
合作联系 QQ:18743986 Email:arlan8005#163.com