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

命名管道是一种在操作系统中相对比较低级的进程通信方式,它是一种以文件为中介的进程通信方式。在Go语言中,通过os包提供了对命名管道的支持。在本文中,我们将介绍如何在Go中使用命名管道来实现进程间通信。一、命名管道的概念命名管道是一种特殊的文件,可以被多个进程同时访问。在Linux系统中,命名管道是一种特殊的文件类型,它们存在于文件系统的某个位置上,并且可以在

在Go语言中,使用第三方库是非常方便的。许多优秀的第三方库和框架可以帮助我们快速地开发应用程序,同时也减少了我们自己编写代码的工作量。但是如何正确地使用第三方库,确保其稳定性和可靠性,是我们必须了解的一个问题。本文将从以下几个方面介绍如何使用第三方库,并结合具体例子进行讲解。一、第三方库的获取Go语言中获取第三方库有以下两种方式:1.使用goget命令首先

Lambda表达式是无名称的匿名函数,其语法为:(parameter_list)->expression。它们具有匿名性、多样性、柯里化和闭包等特点。实际应用中,Lambda表达式可用于简洁地定义函数,如求和函数sum_lambda=lambdax,y:x+y,并通过map()函数应用于列表来进行求和操作。

随着音频处理在各种应用场景中的普及,越来越多的程序员开始使用Go编写音频处理程序。Go语言作为一种现代化的编程语言,具有优秀的并发性和高效率的特点,使用它进行音频处理十分方便。本文将介绍如何在Go中使用音频处理技术,包括读取、写入、处理和分析音频数据等方面的内容。一、读取音频数据在Go中读取音频数据有多种方式。其中比较常用的是使用第三方库进行读取,比如go-

<p>Windows 系统上的 OneDrive 应用程序允许您将文件存储在高达 5 GB 的云上。OneDrive 应用程序中还有另一个功能,它允许用户选择一个选项,是将文件保留在系统空间上还是在线提供,而不占用您的系统存储空间。此功能称为按需文件。在这篇文章中,我们进一步探索了此功能,并解释了有关如何在 Windows 11 电脑上的 OneDrive 中按需使用文件的各种选项。</p><h2>如何使用 On

在Go语言中,嵌套结构是一种非常常见的技术。通过将一个结构体嵌入到另一个结构体中,我们可以将复杂的数据模型分解成更小的部分,使其易于理解和维护。本篇文章将介绍如何在Go中使用嵌套结构以及一些最佳实践。一、定义嵌套结构首先,我们需要定义一个包含嵌套结构的结构体。下面的代码演示了如何定义一个包含Person结构体的Company结构体:typePersons

近年来,WebSocket技术已经成为了Web开发中不可或缺的一部分。WebSocket是一种在单个TCP连接上进行全双工通信的协议,它使得客户端和服务器之间的通信更加流畅和高效。如今,很多现代的Web应用程序都使用了WebSocket技术,例如实时聊天、在线游戏以及实时数据可视化等。Go语言作为一个现代的编程语言,自然也提供了很好的支持WebSock

MySQL.proc表是MySQL数据库中存储存储过程和函数信息的系统表,通过深入了解其结构及用途,可以更好地理解存储过程和函数在MySQL中的运行机制,并进行相关的管理和优化。下面将详细解析MySQL.proc表的结构及用途,并提供具体的代码示例。1.MySQL.proc表的结构MySQL.proc表是一个系统表,存储了所有存储过程和函数的定义和相关信息


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전
