仓酷云
标题:
PHP网站制作之用PHP把持Oracle的LOB类型的数据
[打印本页]
作者:
海妖
时间:
2015-2-4 00:17
标题:
PHP网站制作之用PHP把持Oracle的LOB类型的数据
左手拿着MOTOLOLA右手拿着NOKIA,要多潇洒,有多潇洒,哈哈,终于学会了,但是可能这个时候,又会有人不经意的拍拍肩膀对你说:哥们,别高兴的太早,你还是菜鸟,离学会还差着一大截呢!oracle|数据 《PHP+Oracle(OCI) 初步》中讲了若何用PHP中的OCI函数来毗连Oracle数据库,履行一些SQL查询及封闭数据库毗连。本文将讲述另外一个难度稍大的成绩:用PHP的OCI函数来把持Oracle的LOB字段。浏览本文需求《PHP+Oracle(OCI) 初步》一文中的常识。
用过Oracle的人都晓得,Oracle有一种数据类型叫VARCHAR2,用来暗示不定长的字符串。VARCHAR2也是Oracle公司保举利用的类型。但利用VARCHAR2有个成绩:最大只能暗示4000个字符,也就相当于2000个汉字。假如你的法式中某个字符的值要大于20002个汉字,用VARCHAR2就不克不及知足请求了。这时候候,你有两个选择,一是用多个VARCHAR2来暗示,二是用LOB字段。这里咱们来看看第二个举措。
先来大体懂得一下Oracle的LOB字段。Oracle的LOB类型分为三种:BLOB,CLOB和BFILE。CLOB称为字符LOB,BLOB和BFILE是用来存储二进制数据的。CLOB和BLOB的最大长度是4GB,它们把值寄存在Oracle数据库中。BFILE和BLOB相似,但它把数据放在内部的文件中,所以它又称为内部BLOB(External BLOB)。
我想,咱们对MYSQL应当都不会生疏。MYSQL中也有相似的数据类型,如TEXT和BLOB。在PHP的MYSQL函数中,对TEXT/BLOB的操作是直接的,就象其它类型的数据一样。但在Oracle中,情形就纷歧样了。Oracle把LOB看成一种特别的数据类型来处置,在操作上不克不及用惯例的办法。好比,不克不及在INSERT语句中直接把值拔出到LOB字段中,也不克不及用LIKE停止查找。
上面就经由过程几个例子来讲明若何用PHP的OCI函数来拔出,掏出和查询LOB数据。
拔出
不克不及直接用INSERT语句向LOB字段中拔出值。普通情形下,有以下的几步:
1 先剖析一个INSERT语句,前往一个LOB的描写符
2 用OCI函数生成一个当地的LOB对象
3 将LOB对象绑定到LOB描写符上
4 履行INSERT语句
5 给LOB对象赋值
6 释放LOB对象和SQL语句句柄
上面的这个例子是把用户上传的图片文件寄存到BLOB(或BFILE中,操作稍有分歧)中。
起首要建一个表,布局以下:
CREATE TABLE PICTURES (
ID NUMBER,
DESCRIPTION VARCHAR2(100),
MIME VARCHAR2(128),
PICTURE BLOB
);
假如要完成ID的主动增添,再建一个SEQUENCE:
CREATE SEQUENCE PIC_SEQ;
然后是用来处置数据的PHP法式代码。
<?php
//创立Oracle数据库毗连
$conn = OCILogon($user, $password, $SID);
//提交SQL语句给Oracle
//在这里要注重的两点:一是用EMPTY_BLOB()函数。这是Oracle的外部函数,前往一个LOB的定位符。在拔出LOB时,只能用这个举措师长教师成一个空的LOB定位符,然后对这个定位符停止操作。EMPTY_BLOB()函数是针对BLOB类型的,对应于CLOB的是EMPTY_CLOB()。二是RETURNING前面的局部,把picture前往,让PHP的OCI函数可以处置。
$stmt = OCIParse($conn,"INSERT INTO PICTURES (id, description, picture)
VALUES (pic_seq.NEXTVAL, '$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>";
}
//释放LOB对象
OCIFreeDesc($lob);
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
还有一个要注重的中央:LOB字段的值起码要1个字符,所以在save()或savefile()之前,要确保值不克不及为空。不然,Oracle会失足。
掏出
对一个LOB中掏出数据,有两种举措。一是生成一个LOB对象,然后绑定到一条SELECT语句前往的定位符上,再用LOB对象的load()办法掏出数据;二是直接用PHP的OCIFetch***函数。第一种办法比第二种办法要费事很多,所以我直接说说第二种办法。
仍是用下面的表。
<?php
$conn = OCILogon($user, $password, $SID);
$stmt = OCIParse($conn,"SELECT * FROM PICTURES WHERE ID=$pictureid");
OCIExecute($stmt);
//奥密就在PCIFetchInfo的第三个参数上:OCI_RETURN_LOBS。第三个参数是FETCH的形式,假如OCI_RETURN_LOBS,就直接把LOB的值放到了局数组中,而不是LOB定位符,也就不必LOB对象的load()办法了。
if (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))
{
echo "Content-type: " . StripSlashes($result[MIME]);
echo StripSlashes($result[PICTURE]);
}
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
这个法式用来显示放在LOB中的数据(图片)。挪用办法(假定剧本名是getpicture.php):
<IMG SRC="getpicture.php?pictureid=99" ALT="放在Oracle LOB中的图片">
查询
后面已提了下,关于Oracle的LOB字段是不克不及用LIKE停止婚配的。怎样办呢?其实其实不庞杂,Oracle有一个匿名的法式包,叫DBMS_LOB,外面有一切的操作LOB所需的进程。
假定有象如许一个表:
CREATE TABLE ARTICLES (
ID NUMBER,
TITLE VARCHAR2(100),
CONTENT CLOB
);
文章的内容放在CONTENT字段中。
如今咱们要找出所之内容中包括"PHP中文用户"的文章,可以这么来做:
<?php
$conn = OCILogon($user, $password, $SID);
//WHERE子句顶用了DBMS_LOB.INSTR进程。它有四个参数,后面两个分离暗示LOB的定位符(可以直接用字段暗示)和要查找的字符串;前面两个分离暗示入手下手的偏移量和呈现的次数。要注重的是必需判别它的前往值,也就是要大于0。
$stmt = OCIParse($conn,"SELECT * FROM ARTICLES WHERE DBMS_LOB.INSTR(CONTENT, 'PHP中文用户', 1, 1) > 0");
OCIExecute($stmt);
if (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))
{
...
}
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
Oracle还供应了很多用来操作LOB数据的进程,如LENGTH, SUBSTR等等。至于它们的具体用法,可以思索Oracle的开辟手册。
关于对Oracle数据库中的LOB类型的数据的操作,就说这么多了。因为我接触Oracle工夫不长,本文中能够还会有毛病,接待人人品评斧正。 不懂的问题有很多高手帮你解决。但不要认为你是新手,就不能帮助别人,比如今天你学会了怎样安装PHP,明天还可能有朋友会问这个问题,你就可以给他解答,不要认为这是浪费时间,忙别人其实就是帮助自己。
作者:
冷月葬花魂
时间:
2015-2-4 10:48
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
作者:
透明
时间:
2015-2-7 08:08
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
作者:
兰色精灵
时间:
2015-2-21 04:55
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
作者:
因胸联盟
时间:
2015-3-11 02:23
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
作者:
金色的骷髅
时间:
2015-3-17 19:08
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
作者:
小魔女
时间:
2015-3-18 15:43
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
作者:
深爱那片海
时间:
2015-3-26 02:24
做为1门年轻的语言,php一直很努力。
作者:
变相怪杰
时间:
2015-3-30 01:14
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
作者:
莫相离
时间:
2015-4-21 11:55
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
作者:
只想知道
时间:
2015-4-21 21:05
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
作者:
谁可相欹
时间:
2015-6-7 03:19
爱上php,他也会爱上你。
作者:
海妖
时间:
2015-6-11 13:12
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
作者:
分手快乐
时间:
2015-6-13 09:40
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
作者:
精灵巫婆
时间:
2015-6-19 18:22
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者:
活着的死人
时间:
2015-7-9 01:01
本文当是我的笔记啦,遇到的问题随时填充
作者:
灵魂腐蚀
时间:
2015-7-12 21:15
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
作者:
不帅
时间:
2015-7-14 20:57
Ps:以上纯属原创,如有雷同,纯属巧合
作者:
若天明
时间:
2015-7-28 06:10
当然这种网站的会员费就几十块钱。
作者:
第二个灵魂
时间:
2015-7-28 21:55
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2