http://www.phpstar.com/tutorial.htm
看看吧,里面有连接oralce的方法。

解决方案 »

  1.   

    NT下用PHP4连ORACLE8i出ORA_12154的处理 
    作者:robbin 
        NT4或Win2000下使用apache+php4+oracle client 805连oracle8i要点(我是用soloris下的oracle815) 
    1.安装oracle client805,并确定使用sql*plus可以连oracle server;
    2.安装apache1.3.12
    3.安装php402(from http://www.mm4.de)/ 
    4.配置apache
    1)在httpd.conf中设置ORACLE_HOME和TNSADMIN环境变量; 用SetEnv ORACLE_HOME "c:/orant" //(注意使用正斜杠)
    SetEnv TNSADMIN "C:/orant/net80/admin" 2)配置支持php;
    5.oracle连接串:
    ocilogin("username","password","(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(COMMUNITY=ORADB.world)
    (PROTOCOL=TCP)(HOST=192.168.101.90)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=oracle)))"); 其中(COMMUNITY=ORADB.world)去掉也可,说明可能是绕过了tnsnames.ora文件。
    经过将tnsnames.ora剪切到其他的目录,发现用sql*plus连不过去oracle数据库,而用上述连接串的php程序
    仍能连到oracle库,可见确实可以不依赖tnsnames.ora运行。 如果使用正常的连接串,我只在用win2000+iis5环境下的PHP ISAPI安装模式下运行成功,但在一定访问量条件
    下,经常出现IIS不响应的情况,不适合于建站使用。另一个可能原因是使用了虚拟站点功能,导致IIS开销过大
    而死掉。但用apache的虚拟主机功能运行正常??P>
    附: 如果查询出来的数据是乱码,那么可以通过修改注册表项来解决。地址: HK_LOCAL_MACHINE\software\ORACLE 将该处及子项下的几项NLS_LANG的设置改为""(空),即是删掉其设置值。
     
      

  2.   

    我又试了几次,没有错,确实有病毒!!!!!!
    rosen(考试机器)你的机器没有安装杀毒软件吧?!
      

  3.   

    我用的是Norton 最新版的,还是正版随DELL笔记本送的!
    不会错的!!!! 我开始怀疑自己的机器有毒的,先查了一遍,干净,然后我打开那个网,病毒警报就响了,出现位置:C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files
    ,兄弟你还不明白么?
    为了更确实,我把这个文件夹清空,查毒,干净!打开那个网页,警报再响!!!!
      

  4.   

    考试机器兄弟谢谢你!
    可是你没有看清楚我问的是什么问题,我要的是:php处理oracle里blob类型字段的方法或是成功代码或是资料啊!:)还有我建议你装Norton
      

  5.   

    http://www.aspsky.net/article/list.asp?id=1811
      

  6.   


    --------------------------------------------------------------------------------
     函式:OCIBindByName() 
    --------------------------------------------------------------------------------
     
    Oracle 8 资料库函式库
    OCIBindByName
    让动态 SQL 可使用 PHP 变数。语法: boolean OCIBindByName(int stmt, string ph_name, mixed &variable, int length, int [type]);传回值: 布林值函式种类: 资料库功能
     
     
    内容说明 
    本函式用来定义指定的 PHP 变数,使其能供动态的 SQL 指令 (Oracle Placeholder) 使用。在大小写的问题上要注意一下,因为 Oracle 资料库中的栏位名称其实都是大写的名字。参数 stmt 是经过 Oracle 解析 (OCIParse) 后的字串指标。参数 ph_name 即为欲供动态 SQL 指令所使用的变数。参数 variable 前面一定要加 & 符号,表 PHP 变数位址。参数 length 为资料的长度,若设为 -1 则使用指定的 variable 资料最大值。参数 type 可省略,其值有 OCI_B_FILE (二进位档)、OCI_B_CFILE (文字档)、OCI_B_CLOB (文字 LOB)、OCI_B_BLOB (位元 LOB) 及 OCI_B_ROWID (ROWID) 等数种。值得注意的是欲使用 Oracle 8 中特有的新资料型态 LOB/ROWID/BFILE 等时,需要先执行 OCINewDescriptor() 函式,同时必须要将 length 参数设成 -1。执行本函式成功则传回 true 值。
     
     
    使用范例 
    这个范例是 [email protected] 所提出的,它加入三笔资料到 emp 资料表中,并使用 ROWID 来更新资料。<?php
    $conn = OCILogon("scott", "tiger");
    $stmt = OCIParse($conn,"insert into emp (empno, ename) "."values (:empno,:ename) "."returning ROWID into :rid");
    $data = array(1111 => "Larry", 2222 => "Bill", 3333 => "Jim");
    $rowid = OCINewDescriptor($conn, OCI_D_ROWID);
    OCIBindByName($stmt, ":empno", &$empno, 32);
    OCIBindByName($stmt, ":ename", &$ename, 32);
    OCIBindByName($stmt, ":rid", &$rowid, -1, OCI_B_ROWID);
    $update = OCIParse($conn, "update emp set sal = :sal where ROWID = :rid");
    OCIBindByName($update, ":rid", &$rowid, -1, OCI_B_ROWID);
    OCIBindByName($update, ":sal", &$sal, 32);
    $sal = 10000;
    while (list($empno, $ename) = each($data)) {
      OCIExecute($stmt);
      OCIExecute($update);

    $rowid->free();
    OCIFreeStatement($update);
    OCIFreeStatement($stmt);
    $stmt = OCIParse($conn, "select * from emp where empno in (1111,2222,3333)");
    OCIExecute($stmt);
    while (OCIFetchInto($stmt, &$arr, OCI_ASSOC)) {
      var_dump($arr);
    }
    OCIFreeStatement($stmt);
    /* 删除刚加在 emp 资料表中的三笔资料 */
    $stmt = OCIParse($conn, "delete from emp where empno in (1111,2222,3333)");
    OCIExecute($stmt);
    OCIFreeStatement($stmt);
    OCILogoff($conn);
    ?>  
      

  7.   

    如果看不懂,我简要说几句
    先用:变量形式(如:empno)代表一个sql中的变量
    先OCIParse通过,然后在讲这个变量OCIBindByName
    这个方法已通过(以前编的时候经常用到)
      

  8.   

    我要哭了,你们有没有看清楚我的问题呀,还要我重复几次?
    php连oracle我会的,我要的是php操作oralce里的blob型字段的方法,插入读取等!!拜托看清楚在回答好不好!
      

  9.   

    别哭了,呵呵,试试看OCIBindByName
    OCIBindByName就是针对blob和text等字段的操作
      

  10.   

    看到这段了么
    $rowid = OCINewDescriptor($conn, OCI_D_ROWID);
    OCIBindByName($stmt, ":rid", &$rowid, -1, OCI_B_ROWID);将OCI_B_ROWID改为OCI_B_BLOB 如果还不明白,把你的代码和想要的结果写出来
      

  11.   

    找到一个教材,你看看吧(先擦干眼泪,呵呵)用PHP操纵Oracle的LOB类型的数据
    用户:kent 发言时间:2001-11-13 12:07:16 《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) 
    valuessS (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时间不长,本文中可能还会有错误,欢迎大家批评指正。 
    作者:诺亚Only you!!!
     
      

  12.   

    兄弟, 谢谢你……这么长!这篇文章我也有呀!我早就用他的方法了,还是不行才来求救的! 
    其中:$lob->savefile($lob_upload)
    $lob_upload是什么,是不是要存进数据库的那个文件名?
    如果是的话,那我就没有错!
    可是每执行到这一句的时候,它总是说打不开$lob_upload指定的文件!
      

  13.   

    提交的form中
    <input type=file name=lob_upload>
      

  14.   

    兄弟,这个问题前面有,搜索一下oracle吧.
      

  15.   

    那个问题在http://www.csdn.net/expert/topic/541/541525.xml?temp=.4387476
    我再贴一边吧,但下面的代码是操作myslq的blob的,oracle的原理一样/* Image Database Functions by: J. Patrick Ryans [email protected] July 1998 The following are provided niether with copyright or warranty.  I do not 
    believe that any of the code in this file is copyrighted by anyone else, but 
    if it is, please let me know. I gathered these functions from a larger php3 project to manage a 
    large and dynamic web site by keeping all html, images, and other file 
    contained in a MySQL database.  I couldn't find one single example that 
    explained how to insert binary images into a database and then extract them 
    and display it to the browser. The two major functions needed to load and display images are shown below, 
    but I have left out many details such as how to connect to the database, 
    how to use html forms, etc.  That information can be picked up from a number 
    of places.  I.e. check out: http://webdev.berber.co.il 
    for examples of how to connect to a database, and http://liquid-sky.media.mit.edu/file_upload.html 
    for how to use forms to upload files My database has a table for storing binary data such as images and other 
    types.  The schema is as follows: # 
    # Table structure for table 'binary' 

    CREATE TABLE binary ( 
      id int(11) DEFAULT '0' NOT NULL auto_increment, 
      title varchar(200) DEFAULT '' NOT NULL, 
      auth_id varchar(16) DEFAULT '' NOT NULL, 
      description varchar(200), 
      category varchar(50) DEFAULT '' NOT NULL, 
      body longblob, 
      cr_date date, 
      datestamp timestamp(14), 
      type varchar(50) DEFAULT '' NOT NULL, 
      KEY category (category), 
      KEY title (title), 
      KEY auth_id (auth_id), 
      PRIMARY KEY (id) 
    ); 
    */ 
    /* Loading binary files into the database There isn't room here to show the html forms, how to connect to the 
    database and the code for uploading the file into the database, so I'm 
    going to have to be a little terse here.  I'm going to assume that you 
    know how to use forms to upload files, and I'm going to assume that you 
    know how to connect to your database which has a table of structure 
    similar to the schema shown above. This script is expecting to recieve the following variables from the form: $title          // the title of the file 
    $auth_id        // the id name of the author -  field is specific to my needs 
    $desc           // a short description 
    $cat            // category, for organization purposes. 
    $type           // mime type - something like "image/gif" Be forewarned, error checking is very minimal in this routine, you will 
    probably want to do some more sanity checking in a production environment. 
    In my forms, I query the database to present a select list of valid author 
    ids and mime types. 
    */ 
    <? // load.php3         include "admin_connect.ini"; // connect as a user with insert auth. 
            include "main_h.inc";        // an html header for the page 
            echo "<center>\n"; 
            $date = date("Y-m-d"); 
            //$title = htmlentities($title);  // you may want to clean up the input 
                                              // with statements like this.         // Check to see if a file was included in the input="file" tag         if(chop($fileinput)!=""){                 // $fileinput should point to a temp file on the server 
                    // which contains the uploaded image. so we will prepare 
                    // the file for upload with addslashes and form an sql 
                    // statement to do the load into the database.                 $image = addslashes(fread(fopen($fileinput,"r"), 1000000)); 
                    $SQL = "Insert Into $PhotoTable  
    (title,auth_id,description,category,body,cr_date,type) values ('$title', 
    '$auth_id', '$desc', '$cat', '$image','$date','$type')";                 // now we can delete the temp file 
                    unlink($fileinput); 
            } 
            else{ 
                    echo "no file entered on form"; 
                    exit; 
            }         $Result = mysql_db_query ( $DB, $SQL );         if($Result==0){ 
                    echo "unsuccessful add"; 
            } 
            else{ 
                    echo "successful add"; 
            } 
            include "main_f.inc"; 
    ?> /* Displaying an image from the database. This is a very simple way to display the image that was loaded in the above 
    script.  In this case we will query the image by title, but it would be 
    a simple matter to add other queries. You must have the mime type for the image stored in the record with the 
    image data.  As per the schema above, the mime type is stored in the 'type' 
    field. Be careful that any includes and initialization files do not send anything 
    to the browser. You want the Header("Content-type: $type"); to be the first 
    line served. To use the following script to display an image, use an image tag similar 
    to the following: <img src="image.php3?title=myimage.gif"> */ 
    <? // image.php3         // connect to database with select access 
            include "user_connect.ini"; 
            $SQL = "select body,type from $PhotoTable where title='$title'"; 
            $Show = mysql ( $hDB, $hSQL ); 
            $Rows = mysql_num_rows($hShow);         if($Rows<1){ 
                    // no image matches this query 
            } 
            else{ 
                    // at least one image has this title 
                    $getPhoto = mysql_fetch_object($Show);                 // we need to determine the mime type 
                    $Type = $getPhoto->type;                 // and send the correct header to the browser 
                    Header("Content-type: $Type");                 // now send the image 
                    $Body = $getPhoto->body; 
                    echo $Body; 
                    flush(); 
            } 
    ?> 
      

  16.   

    这里都是菜鸟,问了也是白问,不是东抄一篇,就是西抄一篇,还在这里教别人写代码,我靠!自己多实验,想想以前MYSQL里面是怎么样二进制文件存进去的,如果还不行给我发EMAIL,大家一起来研究,这个问题应该不是很难的!还有个问题,千万不要被这里的人所误导!
      

  17.   

    to:loveun(皋皋)
    你先代码再发表意见也不迟.
    难道那段代码不是用myslq存储二进制文件吗?
    我发的那个东西的确是"抄"的,我又没说是自己原创的.但是,敢问大虾你有多少代码是自己原创的?要是如你所说不该"东抄一篇,西抄一篇",那么所有的东西都不能"抄"了,那我们还上csdn干嘛,我们还上网找资料干嘛,有问题靠自己不就得了.问别人不也是"抄"吗,找到了资料不也是"抄"吗?
      

  18.   

    我没有用过mysql,所以对于它怎么操作blob字段,我不好说什么! 如果让我用C/C++操作oralce,我就没有必要来这里问了,我想不同的语言工具有不同的方法或是函数!对于oracle呢,PHP里只是几个函数的问题!!
    我的问题就在于此,只要你告诉我用哪几个函数,问题就解决了!这么多人在这里, 有谁做过么?!你给我mysql的,数据库不同,接口会相同么?!
      

  19.   

    $dbcon = OCILogon($dbUser,$dbPassword,$dbName);
    $lob = OCINewDescriptor($dbcon, OCI_D_LOB);
    $data = fread(fopen($form_data, "r"), filesize($form_data));
    $query = "insert into IMAGE_DATA (";
    $query .= "NUM_IMAGEID, STR_IMAGE_TYPE, BLO_IMAGE_DATA";
    $query .= ") values (";
    $query .= "NUM_ID.NEXTVAL, $form_data_type, EMPTY_BLOB()";
    $query .= ") returning IMAGE_DATA into :img_blob";
    $stmt = OCIParse($dbcon,$query);
    OCIBindByName($stmt, ':img_blob', &$lob, -1, OCI_B_BLOB);
      

  20.   

    还是把上面的代码分析一下吧
    CREATE TABLE binary ( 
      id int(11) DEFAULT '0' NOT NULL auto_increment, 
      title varchar(200) DEFAULT '' NOT NULL, 
      auth_id varchar(16) DEFAULT '' NOT NULL, 
      description varchar(200), 
      category varchar(50) DEFAULT '' NOT NULL, 
      body longblob, 
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      cr_date date, 
      datestamp timestamp(14), 
      type varchar(50) DEFAULT '' NOT NULL, 
      KEY category (category), 
      KEY title (title), 
      KEY auth_id (auth_id), 
      PRIMARY KEY (id) 
    ); $getPhoto = mysql_fetch_object($Show); //读表 
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    $Body = $getPhoto->body;              //把表中的body字段(即blob字段赋给一个变量$Body
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Header("Content-type: $Type"); //发出正确的头信息(mime类型),让浏览器知道,应该显示图片,这里的$Type变量可以赋值为image/gif等)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    echo $Body; //显示图片
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    上面划线的部分就是核心代码了,原理是在数据库中建立一个blob类型的字段,然后将其读出.并且发出正确的http头信息,最后用echo把读出的blob字段值显示在浏览器上.
    我没用过oracle,所以不熟悉oracle的接口,其实这里也没用到什么函数,只是连接数据库,运行sql语句,读字段而已,哪个数据库没这些接口?