动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > PHP技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ PHP技巧 ]的信息

本月文章推荐
.也谈 PHP 和 MYSQL.
.在PHP中进行GB2312与UTF-8的互换.
.Php+SqlServer实现分页显示.
.Linux下PHP连接MS SQLServer的办.
.PHP一些常用的正则表达式.
.用PHP调用Oracle存储过程.
.PHP中GET变量的使用.
.php中实现多线程.
.通过对服务器端特性的配置加强ph.
.PHP MySQL integration.
.实现分十页分向前十页向后十页的.
.使用php重新实现PHP脚本引擎内置.
.使用php4加速网络传输 .
.做一个有下拉功能的留言版.
.win2003 iis整合php后 环境变量无.
.用PHP函数解决SQL injection.
.实现强大的翻页跳转功能.
.在PHP中全面阻止SQL注入式攻击之.
.php的mysql性能优化.
.如何在PHP中使用Oracle数据库(2).

BS结构中使用PHP访问ORACLE LOB

发表日期:2004-12-4 |


   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数据库技术却遇到此方面难题的程序员会有所帮助。

上一篇:php中数据的批量导入(csv文件) 人气:15582
下一篇:php分别做为cgi和module来运行的配置 人气:9899
浏览全部PHP的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-11-19 老Y文章管理系统 v2.2 bulid 081
2008-11-19 仿webmasterhome 网站收录查询 v
2008-11-19 小计天空儿童教育网站 v1.0
2008-11-19 小计天空儿服装企业网站 v1.0
2008-11-19 FLV地址解析小偷
2008-11-18 bbclone v0.4.9c 多国语言版
2008-11-18 雪晖在线投票系统 (asp) Build 2
2008-11-18 Piwik ( PHP统计系统,可以和GOOG
2008-11-18 SonsinCMS v1.0 bulid 081117
2008-11-15 BitTorrent 6.1.2 Build 13185
2008-11-15 BitComet 1.06
2008-11-15 SpeedFan 4.36 Final
2008-11-15 Windows Installer CleanUp Util
2008-11-15 Safari 3.2
2008-11-15 RealPlayer 11.0.0.835 简体中文
2008-11-15 QQ for Mac Preview 3 Build 394
2008-11-15 Vista优化大师3.20
2008-11-15 酷点 CoolDock 0.6
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成