仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1507|回复: 19
打印 上一主题 下一主题

[学习教程] PHP教程之Php操作oracle数据库指南-自己原创,经...

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:27:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
不断巩固,摸透大部分PHP常用函数,并可理解OOP,MYSQL优化,以及模板oracle|数据|数据库|原创   自己因为任务关系利用Oracle数据库,发明这里用的人不多,但经常发明有人提的关于PHP操作ORACLE数据库的成绩得不到回覆,我也曾问过几个,但也无人呼应,因而决意把自己在任务中积累起来的一些技能、经历贡献出来,但愿对利用oracle数据库的人有所匡助。
1、设置装备摆设情况:
会见Oracle8以上的数据库需求用到Oracle8 Call-Interface(OCI8)。这个扩大模块需求Oracle8 的客户端函数库,因而需求你要毗连近程Oracle数据库的话,还要装上Oracle的客户端软件-可以到Oracle网站上收费下载- http://www.oracle.com,这是很多初学者经常疏忽的,因而假如看了这篇文章,就不要在服装论坛上再提“为何我毗连不上Oracle数据库”之类的成绩了。
(1)起首确认装置了Oracle8i客户端,然后用net8 assistant(客户端软件供应)创立一个办事定名,注重服

务名是oracle数据库的sid,可查询initsid文件里的server_names失掉。
(2)在php.ini中把 ;extension=php_oci8.dll 后面的正文符号“;”去失落,使php可以加载撑持oracle的模块

。并把php_oci8.dll拷贝到你的windows2000 server装置目次下的system32子目次。如d:\winnt\system32,重

新启动你的机械。
(3)写个测试文件试一下是不是能准确毗连(假设办事名sid是test):
这里scott用户是Oracle自带的不必你本人创立了,只需把上面这个文件放到你的WEB根目次就能够了。假如显

示到数据库中的数据,则申明毗连正常,假如不可,你还要反省前几步有哪些中央做错了。
test.php
<?
$dbconn=OCILogon("scott","tiger","test");
$sql ="select * from emp";
$stmt = OCIParse($dbconn, $sql);
if(!$stmt) {
echo "<h1>ERROR - Could not parse SQL statement.</h1>";
exit;
}
OCIExecute($stmt);
while( OCIFetchInto($stmt, &$result_array) )
{
echo

"EMPno=$result_array[0];Ename=$result_array[1];JOB=$result_array[2];MGR=$result_array[3]<BR>";
}
?>

2、用PHP履行Oracle存储进程
(1)用sqlplus毗连后,创立一个存储进程:
CREATE OR REPLACE PROCEDURE inoutdemo (
par_in IN VARCHAR2,
par_in_out IN OUT VARCHAR2,
par_out OUT VARCHAR2)
IS
BEGIN
par_out := par_in;
par_in_out := par_in || ' ' || par_in_out;
END;
(2)PHP文件:
sptest.php
<?
//:in是输出变量;:inout是输出输入变量;:out是输入变量,详细注释请参考Oracle的PL/SQL手册
$conn=OCILogon("scott","tiger","test");
$stmt = OCIParse($conn,"BEGIN inoutdemo(:in,:inout,:out); END;");
OCIBindByName($stmt,":in",$in,32);
OCIBindByName($stmt,":inout",$inout,32);
OCIBindByName($stmt,":out",$out,32);

$in = "Hello ";
$inout = "World!";

OCIExecute($stmt);
echo "<BR><BR>";
echo "in=".$in."<BR>";
echo "inout=".$inout."<BR>";
echo "out=".$out."<BR>";
?>

3、Oracle数据库的分页
Oracle固然不象Mysql有limit可用,非常便利,但也有本人的处置办法,它特别的rownum对分页有很主要的作

用。分页可有良多种办法,个中最经常使用的是用minus。
如要显示n1-n2纪录可写为:
(1)SELECT * FROM tablename WHERE rownum <= n2 minus SELECT * FROM tablename WHERE rownum < n1
注重:该语句不克不及利用order by,不然报错。
(2)把指针下移的举措如:
个中:$page是以后页;$pagesize是每页显示的纪录数
for($i=0;$i<($page-1)*$pagesize;$i++)
{
@ocifetch($stmt);
}
然后再用ocifetch($stmt)掏出的数据就是你要显示的纪录了
(3)关于有庞杂查询语句并用order by来排序的,可以使用上面办法处理:
SELECT TABLE_NAME,TABLE_TYPE FROM( SELECT ROWNUM ROWSEQ,X.* FROM (SELECT * FROM CAT ORDER BY

TABLE_TYPE) X) WHERE ROWSEQ BETWEEN n1+1 AND n2;
自己最喜好的是第三种,也保举人人利用,十分便利的啊。呵呵。
其它办法就不引见了,很费事,利用了Oracle游标之类的东东,不太合适PHP利用。

4、特别字符的拔出处置
关于一些字符如单引号'在Oracle里是不克不及用addslashes处置的,但可使用Oracle的CHR函数或再加个单引号


如:SQL>insert into table values('it'||chr(39)||'s a test'));
或 SQL>insert into table values('it''s a test'));
显示:
it's a test.

5、PHP和Oracle的事务处置
OCIExecute()函数:int OCIExecute ( int statement [, int mode] )
第二个参数mode共有两个:缺省为OCI_COMMIT_ON_SUCCESS,可省略。OCI_DEFAULT 暗示用事务(Transation)

提交,不主动提交。
假如你在法式中假如有两个操作数据库的语句需求同时胜利履行,有一个掉败就要rollback的话,可如许写:

$conn=OCILogon($username,$password,$sid);
//first sentence
$Sql = "insert into tablename values()";
$stmt=OCIParse($conn,$Sql);
$result=OCIExecute($stmt, OCI_DEFAULT);
if (!$result) {
OCIRollback($conn);//不胜利则回滚
OCIFreeStatement($stmt); //释放资本
OCILogoff($conn);
}

//second sentence
$Sql = " update tablename set..";
$stmt=OCIParse($conn,$Sql);
$result=OCIExecute($stmt, OCI_DEFAULT);
if (!$result) {
OCIRollback($conn);//不胜利则回滚
OCIFreeStatement($stmt); //释放资本
OCILogoff($conn);
}


OCICommit($conn);//假如都胜利则提交
OCIFreeStatement($stmt); //释放资本
OCILogoff($conn);



6、用PHP把持Oracle的LOB类型的数据(含图片的存储与显示处置)
对PHP法式员来说,Oracle最使人头痛的莫过于利用LOB来处置图片了。
1。PHP操作BLOB:
先创立一个表用于保留图片。用户上传的图片文件寄存到BLOB中
CREATE TABLE PICTURES (
ID NUMBER,
IMGTYPE, VARCHAR2(60),
DESCRIPTION VARCHAR2(100),
PICTURE BLOB
);
假如要完成ID的主动增添,再建一个SEQUENCE:
CREATE SEQUENCE PIC_SEQ;

PHP法式-拔出局部:
<?
$conn=OCILogon($username,$password,$sid);
//在这里要注重的两点:一是用EMPTY_BLOB()函数。这是Oracle的外部函
//数,前往一个LOB的定位符。在拔出LOB时,只能用这个举措师长教师成一个
//空的LOB定位符,然后对这个定位符停止操作。EMPTY_BLOB()函数是针
//对BLOB类型的,对应于CLOB的是EMPTY_CLOB()。二是RETURNING前面的
//局部,把picture前往,让PHP的OCI函数可以处置。
$stmt = OCIParse($conn,"INSERT INTO PICTURES (id, imgtype,description, picture) VALUES

(PIC_SEQ.NEXTVAL, '$imgtype','$description', '$lob_upload_type', EMPTY_BLOB()) RETURNING picture

INTO :PICTURE");
//生成一个当地LOB对象的描写符。注重函数的第二个参数:OCI_D_LOB,
//暗示生成一个LOB对象。其它能够的还有OCI_D_FILE和OCI_D_ROWID,分
//别对应于BFILE和ROWID对象。
$lob = OCINewDescriptor($conn, OCI_D_LOB);
//将生成的LOB对象绑定到后面SQL语句前往的定位符上。
OCIBindByName($stmt, ':PICTURE', &$lob, -1, OCI_B_BLOB);
OCIExecute($stmt);

//办法一:向LOB对象中存入数据。由于这里的源数据是一个文件,所以直接用LOB对象的savefile()办法。LOB

对象的其它办法还有:save()和load(),分离用来保留和掏出数据。但BFILE类型只要一个办法就是save()
if($lob-〉savefile($lob_upload)){
OCICommit($conn);
echo "上传胜利〈br〉";
}else{
echo "上传掉败〈br〉";
}

//办法二:用SAVE的办法保留
//$fp = fopen($lob_upload, "r");
//$File->save(fread($fp, filesize($lob_upload)));
//fclose($fp );

//释放LOB对象
OCIFreeDesc($lob);
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
小技能:在sqlplus里可用select dbms_lob.getlength(picture) from pictures;检查文件是不是已存入到数据

库或在PHP法式里用strlen()函数检查。

PHP法式-显示局部(getpicture.php):
<?
$conn = OCILogon($username, $password, $sid);
$stmt = OCIParse($conn,"SELECT imgtype,picture FROM PICTURES WHERE ID=$pictureid");
if (OCIFetchInto($stmt, $result))
{
Header("Content-type: ".$result[0]);
echo $result[1]->load();
}
//可用strlen($result[1]->load()) 检查图片的巨细以肯定图片是不是准确存入到数据库。

?>

在需求显示图片的中央只需:
<IMG SRC="getpicture.php?pictureid=99" ALT="放在Oracle LOB中的图片">

就可以显示图片了
有的网上文章写用前往LOB值而非描写符的办法显示,我没有试胜利,人人可以试下
代码以下:
if (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))
{
echo "Content-type: " . StripSlashes($result[imgtype]);
echo StripSlashes($result[picture]);
}

2。PHP操作CLOB:
Oracle有一种数据类型叫VARCHAR2,用来暗示不定长的字符串。VARCHAR2也是Oracle公司保举利用的类型。但

利用VARCHAR2有个成绩:最大只能暗示4000个字符,也就相当于2000个汉字。假如你的法式中某个字符串的长

度要大于2000个汉字,用VARCHAR2就不克不及知足请求了。这时候候,你可以测验考试利用CLOB。CLOB和BLOB的最大长度

是4GB。

上面是示例(参考了PHP英文版的手册):
<?
//要保留的文字
$clobtext="different dr2";

//db connection
$conn = OCIlogon("user","pw","TNS");

//这里原例子利用了一个存储进程,你也能够用下面操作BLOB的办法来完成。
//如:$stmt = OCIParse($conn,"INSERT INTO table (id, clobtext) VALUES (text.NEXTVAL,,

EMPTY_CLOB()) RETURNING clobtext INTO :clob");


$sql = "begin tempclobtest_package.saveclob(:clob); end;";

$clob = OCINewDescriptor($conn, OCI_D_LOB);

$stmt = OCIParse($conn, $sql);

OCIBindByName ($stmt,':clob', &$clob , -1,OCI_B_CLOB );

if(!OCIExecute($stmt, OCI_DEFAULT)) {print_r(OCIError($stmt));}
else{echo "提交胜利";}

if($clob->save($clobtext))
{
OCICommit($conn);
echo "提交胜利";
}
else
{
print_r(OCIError($stmt));
}

//释放资本
$clob->free();
OCIFreeStatement($stmt);
?>
  学校并没有那么多的时间可以让我们在实际开发上面。
爱飞 该用户已被删除
沙发
发表于 2015-2-4 13:09:58 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
深爱那片海 该用户已被删除
板凳
发表于 2015-2-9 23:05:06 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
地板
发表于 2015-2-22 20:15:01 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
老尸 该用户已被删除
5#
发表于 2015-2-26 06:31:25 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
飘飘悠悠 该用户已被删除
6#
发表于 2015-3-8 12:26:44 | 只看该作者
基础有没有对学习php没有太大区别,关键是兴趣。
不帅 该用户已被删除
7#
发表于 2015-3-15 22:53:41 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
愤怒的大鸟 该用户已被删除
8#
发表于 2015-3-22 17:21:00 | 只看该作者
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
金色的骷髅 该用户已被删除
9#
发表于 2015-4-6 23:11:39 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
精灵巫婆 该用户已被删除
10#
发表于 2015-4-20 23:50:24 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
灵魂腐蚀 该用户已被删除
11#
发表于 2015-6-4 17:04:27 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
小女巫 该用户已被删除
12#
发表于 2015-6-7 14:56:58 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
admin 该用户已被删除
13#
发表于 2015-6-11 20:00:00 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
谁可相欹 该用户已被删除
14#
发表于 2015-6-23 20:28:51 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
分手快乐 该用户已被删除
15#
发表于 2015-7-3 02:12:14 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
再见西城 该用户已被删除
16#
发表于 2015-7-4 01:07:45 | 只看该作者
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
山那边是海 该用户已被删除
17#
发表于 2015-7-12 20:58:48 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
因胸联盟 该用户已被删除
18#
发表于 2015-7-12 22:19:09 | 只看该作者
本文当是我的笔记啦,遇到的问题随时填充
第二个灵魂 该用户已被删除
19#
发表于 2015-7-13 23:46:48 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
只想知道 该用户已被删除
20#
 楼主| 发表于 2015-7-15 07:52:40 | 只看该作者
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-4 18:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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