使用OCI的错误:“期望参数1是资源”

时间:2015-06-01 22:33:38

标签: php oci

尝试使用OCI访问数据库时出现以下错误:

  

oci_parse()期望参数1为资源,
  oci_bind_by_name()期望参数1是资源,
  oci_fetch_array()期望参数1是资源,

连接正常,我查了一下。

这是我的代码:

//<?php


class Connecter
{
    protected $tns = null;


    protected $account = 'acc';
    protected $password = 'pass';

    public $conn;  

    public function __construct()
    {
        $tns = " 
          (DESCRIPTION =
              (ADDRESS_LIST =  
                (ADDRESS = (PROTOCOL=TCP)(HOST=)(PORT=1521))
              )
              (CONNECT_DATA =
                (SERVICE_NAME = XE)
              )
          )";        
        $this -> conn = oci_connect("acc", "pass", $tns);
        return $this->conn;
    }

} //


/*<?php
include "domains/Connecter.php";

$con = new Connecter();
$query    = 'SELECT BLOBDATA FROM BTAB WHERE BLOBID = :MYBLOBID';
$stmt     = oci_parse($con, $query);
$myblobid = 1;
oci_bind_by_name($stmt, ':MYBLOBID', $myblobid);
oci_execute($stmt);
$arr    = oci_fetch_array($stmt, OCI_ASSOC);
$result = $arr['BLOBDATA']->load();

header("Content-type: image/JPEG");
echo $result;

oci_close($con);

?>
*/

2 个答案:

答案 0 :(得分:0)

new Connecter()将返回一个PHP对象,而不是资源,这是oci_parse()所期望的。

您尚未发布Connecter.php,因此无法准确说出需要更改的内容,但在某处您正在建立连接。您需要找到一种方法从您的类中获取返回的值,以便您可以使用它。由于您没有在代码的其余部分使用OOP结构,所以您应该放弃Connecter类并始终使用过程方法。

附注:连接器拼写为 o

答案 1 :(得分:0)

如Hobo的回答所示,oci_parse要求第一个参数是资源,而您传递的是包含资源的Connector对象。因此,简单的解决方法是将代码更改为:

$con = new Connecter();
$query    = 'SELECT BLOBDATA FROM BTAB WHERE BLOBID = :MYBLOBID';
$stmt     = oci_parse($con->conn, $query);

然而,构建你的Connector类并使其更像是一个OCI8数据库处理类来保存大部分或全部oci8函数(例如oci_parse)可能更合适。考虑类似的事情:

protected function parse($query) {

      $response = oci_parse($this->conn, $query);
      return $response;
}

/* end of new method bit */

$con = new Connecter();
$query    = 'SELECT BLOBDATA FROM BTAB WHERE BLOBID = :MYBLOBID';
$stmt     = $conn->parse($query);