Discuz教程网

PHP新手上路 - 012 - 使用PHP来操作Oracle数据库

[复制链接]
authicon php1314 发表于 2010-12-5 10:47:03 | 显示全部楼层 |阅读模式
使用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 连接
  1. <?
  2. if ($conn=Ora_Logon("user@TNSNAME","password"))
  3. {
  4. echo "<B>SUCCESS ! Connected to database<B>n";
  5. }
  6. else
  7. {
  8. echo "<B>Failed :-( Could not connect to database<B>n";
  9. }
  10. Ora_Logoff($conn);
  11. phpinfo();
  12. ?>
复制代码

以上代码使用TNSNAME(在你的tnsnames.ora文件中指明)定义的Oracle数据库名称、用户名称和密码连接数据库。在成功连接的基础上,ora_logon函数返回一个非零的连接ID并储存在变量$conn中。
11.2 查询
假设与数据库已经连接就绪,下面我们就来实际的应用对数据库的查询。下面的代码演示了一个连接并查询的典型例子:



  1. <?
  2. /*
  3. * 连接数据库并执行查询
  4. */
  5. function printoraerr($in_cur)
  6. {
  7. // 检查Oracle是否出错
  8. // 如果存在错误则显示
  9. // 当指针被激活时每次请求Oracle后调用该函数
  10. if(ora_errorcode($in_cur))
  11. echo "Oracle code - ".ora_error($in_cur)."n";
  12. return;
  13. }
  14. /** 主程序 */
  15. if (!($conn=ora_logon("user@TNSNAME","password")))
  16. {
  17. echo "Connection to database failedn";
  18. exit;
  19. }
  20. echo "Connected as connection - <b>$conn</b><br>n";
  21. echo "Opening cursor ...<br>n";
  22. $cursor=ora_open($conn); printoraerr($cursor);
  23. echo "Opened cursor - <b>$cursor</b><br>n";
  24. $qry="select user,sysdate from dual";
  25. echo "Parsing the query <b>$qry</b> ...<br>n";
  26. ora_parse($cursor,$qry,0); printoraerr($cursor);
  27. echo "Query parsed <br>n";
  28. echo "Executing cursor ...<br>n";
  29. ora_exec($cursor); printoraerr($cursor);
  30. echo "Executed cursor<br>n";
  31. echo "Fetching cursor ...<br>n";
  32. while(ora_fetch($cursor))
  33. {
  34. $user=ora_getcolumn($cursor,0); printoraerr($cursor);
  35. $sysdate=ora_getcolumn($cursor,1); printoraerr($cursor);
  36. echo " row = <B>$user, $sysdate </B><br>n";
  37. }
  38. echo "Fetched all records<br>n";
  39. echo "Closing cursor ...<br>n";
  40. ora_close($cursor);
  41. echo "Closed cursor<br>n";
  42. echo "Logging off from oracle... <br>n";
  43. ora_logoff($conn);
  44. echo "Logged off from oracle <br>n";
  45. ?>
  46. (译者注:以上代码段缺少注释,请读者参考PHP Manual的Oracle数据库函数部分)
  47. 11.3 显示结果
  48. 以下代码演示了怎样查询数据库并将结果输出:
  49. <?
  50. function printoraerr($in_cur, $conn)
  51. {
  52. // 检查Oracle是否出错
  53. // 如果存在错误则显示
  54. // 当指针被激活时每次请求Oracle后调用该函数
  55. // If it encountered an error, we exit immediately
  56. if(ora_errorcode($in_cur))
  57. {
  58. echo "Oracle code - ".ora_error($in_cur)."<br>n";
  59. ora_logoff($conn);
  60. exit;
  61. }
  62. return;
  63. }
  64. function exequery($w_qry,$conn)
  65. {
  66. $cursor=ora_open($conn); printoraerr($cursor,$conn);
  67. ora_parse($cursor,$w_qry,0); printoraerr($cursor,$conn);
  68. ora_exec($cursor); printoraerr($cursor,$conn);
  69. $numrows=0;
  70. $w_numcols=ora_numcols($cursor);
  71. // 显示头部
  72. echo "
  73. <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="2">
  74. <TR>n";
  75. for ($i=0;$i<$w_numcols;$i )
  76. {
  77. $align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";
  78. echo "t<TH VALIGN=TOP ALIGN=$align>".ora_columnname($cursor,$i)."</TH>n";
  79. }
  80. echo "</TR>n";
  81. while(ora_fetch($cursor))
  82. {
  83. echo "<TR>n";
  84. for ($i=0;$i<$w_numcols;$i )
  85. {
  86. $align=(ora_columntype($cursor,$i)=="NUMBER")?"RIGHT":"LEFT";
  87. if(ora_columntype($cursor,$i)=="LONG")
  88. echo "<TD VALIGN=TOP ALIGN=$align><PRE>".
  89. ora_getcolumn($cursor,$i)."</PRE></TD>n";
  90. else
  91. echo "<TD VALIGN=TOP ALIGN=$align>".ora_getcolumn($cursor,$i)."</TD>n";
  92. printoraerr($cursor,$conn);
  93. }
  94. $numrows ;
  95. echo "</TR>n";
  96. }
  97. if ($numrows==0)
  98. echo "<TR><TD COLSPAN="$w_numcols"><B>Query returned no records
  99. </B></TD></TR>n";
  100. else
  101. {
  102. echo "<TR>n";
  103. echo "<TH COLSPAN="".($w_numcols-1)."" ALIGN=RIGHT>Count</TH>n";
  104. echo "<TH ALIGN=RIGHT>$numrows</TH>n";
  105. echo "</TR>n";
  106. }
  107. echo "</TABLE>n";
  108. ora_close($cursor);
  109. return;
  110. }
  111. // 主程序
  112. if(!($conn=ora_logon("user@SID","password")))
  113. {
  114. echo "Error: Cannot connect to databasen";
  115. exit;
  116. }
  117. $qry="SELECT
  118. deptno "Dept"
  119. ,empno "Emp"
  120. ,empnm "Name"
  121. ,salary "Salary"
  122. FROM
  123. employee
  124. ORDER BY 1,2";
  125. exequery($qry);
  126. ora_logoff($conn);
  127. ?>
  128. (译者注:以上代码段缺少注释,请读者参考PHP Manual的Oracle数据库函数部分)
  129. 11.4 基于HTTP的Oracle登录
  130. 将以下代码加在PHP页面代码之前以确认Oracle登录。注意你必须正确设定$ SID。
  131. <?
  132. if(!isset($PHP_AUTH_USER))
  133. {
  134. Header("WWW-authenticate: basic realm="$SID"");
  135. Header("HTTP/1.0 401 Unauthorized");
  136. $title="Login Instructions";
  137. echo "<blockquote>
  138. You are not authorized to enter the site
  139. </blockquote> n";
  140. exit;
  141. }
  142. else
  143. {
  144. if (!($conn=ora_logon("$PHP_AUTH_USER@$SID",$PHP_AUTH_PW)))
  145. {
  146. Header("WWW-authenticate: basic realm="$SID"");
  147. Header("HTTP/1.0 401 Unauthorized");
  148. $title="Login Instructions";
  149. echo "<blockquote>
  150. You are not authorised to enter the site
  151. </blockquote> n";
  152. exit;
  153. }
  154. }
  155. ?><!--分页开始--><!--分页结束-->

  156. <!-- 分页 -->
复制代码





上一篇:PHP新手上路 - 011 - 数据库链接
下一篇:PHP新手上路 - 013 - PHP资源
authicon ningbear 发表于 2011-5-12 12:59:32 | 显示全部楼层
支持一下,确实是不错的贴子。
authicon shakesxia 发表于 2011-5-12 16:59:31 | 显示全部楼层
支持!好东西,拿走了!
authicon 月之海洋 发表于 2011-5-13 10:59:52 | 显示全部楼层
顶啦,不错吧
authicon 月之海洋 发表于 2011-5-13 17:59:52 | 显示全部楼层
顶啦,不错吧
authicon melody0721 发表于 2011-5-13 23:59:38 | 显示全部楼层
很好的,我喜欢
authicon 福倒菜菜子 发表于 2011-5-14 18:00:01 | 显示全部楼层
看一下啊,嘻嘻
authicon huanglv80 发表于 2011-5-14 19:00:03 | 显示全部楼层
这个不错呀
authicon 乐娃娃 发表于 2011-5-16 03:59:50 | 显示全部楼层
我回不回呢 考虑再三 还是不回了吧 ^_^
authicon Cute宝贝儿 发表于 2011-5-16 07:59:39 | 显示全部楼层
看帖必回
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 11:00

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表