|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不过还好,PHP语言给出的语法错误很详细,只要稍微熟悉一点之后,看错误提示就能很容易找出错误所在的。PHP还有一个特别好用的调试功能,在PHP语句中,你可以随时用echo来输出结果。oracle|会见 摘要:本文引见了若何使用PHP的数据库会见手艺完成对ORACLE LOB数据对象的存储。
关头字:PHP;ORACLE; LOB;存储;
引言
PHP,即“PHP: Hypertext Preprocessor”,是一种普遍用于 Open Source(开放源代码)并可以嵌入 HTML 的多用处剧本言语。它的语法接近 C、Java 和 Perl,易于进修。该言语的次要方针是让 Web 开辟人员疾速的书写静态生成的网页,但是,PHP 的功效其实不局限于此。PHP广泛被以为可以更快和更无效地完成庞杂的编程义务,并且恰是由于它的更不乱和占用更少资本的长处成为开辟B/S布局体系的必备的WEB剧本设计言语,饰演着相似两头件的脚色,即语法解析与履行。
ORACLE LOB数据模子
在B/S(Browser/Server,阅读器/办事器)使用体系中,需求存储的已不单单是复杂的文字信息,同时还包含一些图片和音像材料或是超长的文本。好比开辟一套公函体系,公函中的图表、附件等二进制文件或超长文本将没法利用通俗的字符或其他类型的数据描写,这就请求后台数据库要有存储这些数据的才能。应用Oracle LOB对象可完成该功效。
Oracle LOB是用来存储大批的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据)。今朝,它又分为两品种型:外部LOB和内部LOB。外部LOB将数据以字撙节的模式存储在数据库的外部。因此,外部LOB的很多操作都可以介入事务,也能够像处置通俗数据一样对其停止备份和恢复操作。Oracle8i撑持三品种型的外部LOB:BLOB(二进制数据)、CLOB(单字节字符数据)、NCLOB(多字节国度字符数据)。个中CLOB和NCLOB类型合用于存储超长的文本数据,BLOB字段合用于存储大批的二进制数据,如图象、视频、音频等。今朝,Oracle8i只撑持一种内部LOB类型,即BFILE类型。在数据库内,该类型仅存储数据在操作体系中的地位信息,而数据的实体之外部文件的模式存在于操作体系的文件体系中。因此,该类型所暗示的数据是只读的,不介入事务。该类型可匡助用户办理大批的由内部法式会见的文件。
PHP Oracle 8 函数剖析
PHP中有两套ORACLE函数扩大库,个中的ORACLE8函数答应会见 Oracle8 和 Oracle7 数据库,这些函数利用了Oracle8 Call-Interface(OCI8),撑持向 Oracle 地位标记符绑定部分和全局 PHP 变量,周全撑持 LOB、FILE 和 ROWID,答应用户利用用户自界说的变量,即用户数据库的自界说对象类。
Oracle8函数库中函数OCIFetchInto用于取回一行数据纪录放入数组中,该函数的语法描写以下:
int OCIFetchInto(array &result, int [mode])
个中,参数mode可省略,内定值为OCI_NUM。在会见Oracle LOB时,假如但愿前往LOB对象,则mode应设为OCI_ASSOC+OCI_RETURN_LOBS。
函数OCIBindByName用于将PHP变量与Oracle对象停止绑定,从而创立PHP与Oracle之间的数据通信,该函数语法描写为:
boolean OCIBindByName(int stmt, string ph_name, mixed &variable, int length, int [type])
个中:参数stmt是经由Oracle解析函数OCIParse解析后的字串目标。参数ph_name即需绑定的ORACLE前往变量称号;参数variable后面必定要加&符号,表PHP变量地址。参数length为变量的长度,若设为-1则利用指定的variable变量的最大值;参数type可省略,其值有OCI_B_FILE(二进制文件)、OCI_B_CFILE(文本文件)、OCI_B_CLOB(文字LOB)、OCI_B_BLOB(位元LOB)及OCI_B_ROWID(ROWID)等数种。值得注重的是,如利用Oracle8中独有的新数据类型LOB/ROWID/BFILE时,需求先履行 OCINewDescriptor()函数,同时必需要将length参数设成 -1。
函数OCINewDescriptor用于初始化新的LOB/FILE描写。该函数语法描写为:
string OCINewDescriptor(int connection , int [type])
个中的type同OCIBindByName函数中的type界说。
必需的情况设置装备摆设
利用PHP的ORACLE8函数库需求Oracle8客户端库。在利用这个扩大之前,请确认你已为Oracle 用户和WEB daemon 用户准确设置了 Oracle 情况变量。上面列出了需求设置的情况变量:
- ORACLE_HOME #ORACLE装置途径
- ORACLE_SID # ORACLE数据库ID
- LD_LIBRARY_PATH #LD联接库途径
- NLS_LANG #ORALCE区域(言语)设置
- ORA_NLS33 # ORA_NLS33途径
为Linux情况下验证以上变量是不是准确,最好的举措就是分离在oracle用户与nobody下履行:
# env
依据输入的了局,判别上述情况变量是不是分歧。
在为WEB 办事器用户设置情况变量以后,你还需求将WEB 办事器用户(nobody、 www)加到oracle组中。
有关ORACLE8客户端和PHP装置设置的具体申明,请参考相干的手艺手册。
使用典范
在PHP中上载并将文件存储在ORACLE LOB字段中的使用典范以下:
//LOB对象初始化,获得PHP变量指针
$lob = OCINewDescriptor($conn, OCI_D_LOB);
//向有关的文件纪录表添加记载,ORACLE SQL语法注释
$stmt = OCIParse($conn,"update T_FILE set FILENAME='".$_FILES['FJ1']['name'].
"',FILETYPE='".$_FILES['F1']['type']."',FILES=EMPTY_BLOB() where FILEID=".$newid." returning FILES into :lob");
//绑定LOB变量
OCIBindByName($stmt, ':lob', &$lob, -1, OCI_B_BLOB);
OCIExecute($stmt, OCI_DEFAULT);//履行语句
if($lob->savefile($F1)){//将表单提交的文件经由过程lob指针存入ORACLE数据库
OCICommit($conn);
//胜利上传
}else{
//未能胜利上传
}
OCIFreeDesc($lob);
OCIFreeStatement($stmt);
//停止
在PHP中将文件从数据库中提取并下载的使用典范以下:
$stmt = OCIParse($conn,"SELECT * FROM T_ FILE WHERE FILEID =$ID");
OCIExecute($stmt);
if(OCIFetchInto($stmt,$result,OCI_ASSOC+OCI_RETURN_LOBS)){
//输入文件类型信息供阅读器判别
header("Content-type: ".$result[FILETYPE]);
//输入文件名,阅读器可提醒是不是翻开或下载该文件
header("Content-Disposition: attachment; filename=".$result[FILENAME]);
//以上关于header函数的利用可参考PHP manual,HTML的文件头信息请参考Internet RFC 2616。
//输入文件流,在此,阅读器获得文件内容,呈现正鄙人载或直接翻开文件的提醒
echo $result[FILES];
}
OCIFreeStatement($stmt);
//停止
以上典范仅是使用的关头语句,并在Linux+PHP+Apache+Oracle8i平台上经由过程了验证,读者可依据本身需求停止完美和增补。
停止语
本文切磋PHP对ORACLE LOB会见的完成,仅是PHP在B/S布局体系中根基应用手艺所触及的一个方面。笔者曾对照了JDBC与PHP-OCI二者的履行效力,以JDBC为会见引擎的OAS HTTP Server(HTTP Server为apache2.0)的呼应速度要逊于创立在Linux+Aache+PHP-OCI平台之上的WEB Server,这个中固然有Linux的精彩体现,但不成否定的是,PHP与OCI的组合长短常优异的。
因为缺少ORACLE LOB与PHP ORACLE8函数库相联合应用的测验考试,在开辟信息办理体系中,为完成对大型数据文件的办理,PHP在此方面的功效并未失掉无效的使用,但愿本文对从事PHP数据库手艺却碰到此方面困难的法式员会有所匡助。
另外要叮嘱各位的是,抵御诱惑,ASP/PHP/JSP/.NET的对比也许会让你无所适从,你也许学了一半PHP,又开始打C#的主意,或者有人说JAVA很强,这个时候的你绝对不能动摇,哪怕你真想学。 |
|