PHP新手上路(十二)


Posted in PHP onOctober 09, 2006

使用PHP来操作Oracle数据库

11. 数据库连接

在上一节里,我们已经介绍了PHP与MySQL数据库的一些基本操作知识,在互联网中有关PHP与MySQL的教程也最多。MySQL是免费的,这一点也许就吸引了不少人。由于其广泛应用,我就不想在这里赘述MySQL的使用方法了。Oracle被大量在企业应用中采用,因此我们就利用Oracle来进一步介绍PHP与数据库的连接。我们当然不会提及Oracle数据库的设计原理,原因是这已经超出了我们的讨论范围。

PHP提供了两套函数与Oracle连接,分别是ORA_和OCI函数。其中ORA_函数略显陈旧。OCI函数更新据说更好一些。两者的使用语法几乎相差无几。如前所述,你的PHP安装选项应该可以支持两者的使用。

想获得更多有关在Microsoft Windows平台上安装支持PHP3的Apache服务器的知识以及更多有关Oracle数据库的知识,请查阅以下URL:www.csoft.net/~vsbabu/articles/oraphp.html。  

11.1 连接

<?  
if ($conn=Ora_Logon("user@TNSNAME","password"))  
{
echo "<B>SUCCESS ! Connected to database<B>n";
}  
else  
{
echo "<B>Failed :-( Could not connect to database<B>n";
}
Ora_Logoff($conn);
phpinfo();
?>
以上代码使用TNSNAME(在你的tnsnames.ora文件中指明)定义的Oracle数据库名称、用户名称和密码连接数据库。在成功连接的基础上,ora_logon函数返回一个非零的连接ID并储存在变量$conn中。

11.2 查询

假设与数据库已经连接就绪,下面我们就来实际的应用对数据库的查询。下面的代码演示了一个连接并查询的典型例子:
<?
/*
* 连接数据库并执行查询
*/
function printoraerr($in_cur)
{
// 检查Oracle是否出错
// 如果存在错误则显示
// 当指针被激活时每次请求Oracle后调用该函数
if(ora_errorcode($in_cur))
echo "Oracle code - ".ora_error($in_cur)."n";
return;
}
/** 主程序 */
if (!($conn=ora_logon("user@TNSNAME","password")))  
{
echo "Connection to database failedn";
exit;
}
echo "Connected as connection - <b>$conn</b><br>n";
echo "Opening cursor ...<br>n";
$cursor=ora_open($conn); printoraerr($cursor);
echo "Opened cursor - <b>$cursor</b><br>n";
$qry="select user,sysdate from dual";
echo "Parsing the query <b>$qry</b> ...<br>n";
ora_parse($cursor,$qry,0); printoraerr($cursor);
echo "Query parsed <br>n";
echo "Executing cursor ...<br>n";
ora_exec($cursor); printoraerr($cursor);
echo "Executed cursor<br>n";
echo "Fetching cursor ...<br>n";
while(ora_fetch($cursor))
{
$user=ora_getcolumn($cursor,0); printoraerr($cursor);
$sysdate=ora_getcolumn($cursor,1); printoraerr($cursor);
echo " row = <B>$user, $sysdate </B><br>n";
}
echo "Fetched all records<br>n";
echo "Closing cursor ...<br>n";
ora_close($cursor);
echo "Closed cursor<br>n";
echo "Logging off from oracle... <br>n";
ora_logoff($conn);
echo "Logged off from oracle <br>n";
?>
(译者注:以上代码段缺少注释,请读者参考PHP Manual的Oracle数据库函数部分)

11.3 显示结果

以下代码演示了怎样查询数据库并将结果输出:
<?
function printoraerr($in_cur, $conn)
{
// 检查Oracle是否出错
// 如果存在错误则显示
// 当指针被激活时每次请求Oracle后调用该函数
// If it encountered an error, we exit immediately
if(ora_errorcode($in_cur))  
{
echo "Oracle code - ".ora_error($in_cur)."<br>n";
ora_logoff($conn);
exit;
}
return;
}

function exequery($w_qry,$conn)  
{
$cursor=ora_open($conn); printoraerr($cursor,$conn);
ora_parse($cursor,$w_qry,0); printoraerr($cursor,$conn);
ora_exec($cursor); printoraerr($cursor,$conn);
$numrows=0;
$w_numcols=ora_numcols($cursor);
// 显示头部
echo "
<TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="2">
<TR>n";
for ($i=0;$i<$w_numcols;$i++)
{
$align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";
echo "t<TH VALIGN=TOP ALIGN=$align>".ora_columnname($cursor,$i)."</TH>n";
}
echo "</TR>n";
while(ora_fetch($cursor))
{
echo "<TR>n";
for ($i=0;$i<$w_numcols;$i++)  
{
$align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";
if(ora_columntype($cursor,$i)=="LONG")
echo "<TD VALIGN=TOP ALIGN=$align><PRE>".
ora_getcolumn($cursor,$i)."</PRE></TD>n";
else
echo "<TD VALIGN=TOP ALIGN=$align>".ora_getcolumn($cursor,$i)."</TD>n";
printoraerr($cursor,$conn);
}
$numrows++;
echo "</TR>n";
}
if ($numrows==0)
echo "<TR><TD COLSPAN="$w_numcols"><B>Query returned no records
</B></TD></TR>n";
else  
{
echo "<TR>n";
echo "<TH COLSPAN="".($w_numcols-1)."" ALIGN=RIGHT>Count</TH>n";
echo "<TH ALIGN=RIGHT>$numrows</TH>n";
echo "</TR>n";
}
echo "</TABLE>n";
ora_close($cursor);
return;
}

// 主程序
if(!($conn=ora_logon("user@SID","password")))  
{
echo "Error: Cannot connect to databasen";
exit;
}
$qry="SELECT
deptno "Dept"
,empno "Emp"
,empnm "Name"
,salary "Salary"
FROM
employee
ORDER BY 1,2";
exequery($qry);
ora_logoff($conn);
?>
(译者注:以上代码段缺少注释,请读者参考PHP Manual的Oracle数据库函数部分)

11.4 基于HTTP的Oracle登录

将以下代码加在PHP页面代码之前以确认Oracle登录。注意你必须正确设定$ SID。
<?  
if(!isset($PHP_AUTH_USER))  
{
Header("WWW-authenticate: basic realm="$SID"");
Header("HTTP/1.0 401 Unauthorized");
$title="Login Instructions";
echo "<blockquote>
You are not authorized to enter the site
</blockquote> n";
exit;
}  
else  
{
if (!($conn=ora_logon("$PHP_AUTH_USER@$SID",$PHP_AUTH_PW)))  
{
Header("WWW-authenticate: basic realm="$SID"");
Header("HTTP/1.0 401 Unauthorized");
$title="Login Instructions";
echo "<blockquote>
You are not authorised to enter the site
</blockquote> n";
exit;
}
}
?>   

PHP 相关文章推荐
PHP截取中文字符串的问题
Jul 12 PHP
PHP 抓取网页图片并且另存为的实现代码
Mar 24 PHP
PHP 异步执行方法,模拟多线程的应用分析
Jun 03 PHP
php使用smtp发送支持附件的邮件示例
Apr 13 PHP
PHP基本语法总结
Sep 06 PHP
php表单敏感字符过滤类
Dec 08 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
Jul 29 PHP
WordPress网站性能优化指南
Nov 18 PHP
PHP实现的统计数据功能详解
Dec 06 PHP
微信公众号模板消息群发php代码示例
Dec 29 PHP
PHP实现中国公民身份证号码有效性验证示例代码
May 03 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
PHP新手上路(十三)
Oct 09 #PHP
PHP新手上路(十四)
Oct 09 #PHP
PHP简介
Oct 09 #PHP
PHP入门
Oct 09 #PHP
使用php4加速网络传输
Oct 09 #PHP
与数据库连接
Oct 09 #PHP
PHP新手上路(八)
Oct 09 #PHP
You might like
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
针对初学PHP者的疑难问答(2)
2006/10/09 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
Ionic2开发环境搭建教程
2020/08/20 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
深入理解Angular4订阅(Subscribe)与取消
2017/11/22 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
Django自定义用户认证示例详解
2018/03/14 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
2018/05/30 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
2018/11/30 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
沙特阿拉伯电子产品和家用电器购物网站:Black Box
2019/07/24 全球购物
Jdbc数据访问技术面试题
2012/03/30 面试题
信息技术专业大学生个人的自我评价
2013/10/05 职场文书
社会实践感言
2014/01/25 职场文书
收银出纳员岗位职责
2014/02/23 职场文书
合伙经营协议书
2014/04/18 职场文书
公司董事长岗位职责
2014/06/08 职场文书
最新离婚协议书范本
2014/08/19 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
工作保证书怎么写
2015/02/28 职场文书
大学感恩节活动总结
2015/05/05 职场文书
情感电台广播稿
2015/08/18 职场文书
MySQL 角色(role)功能介绍
2021/04/24 MySQL