Zend with Oracle:查询无法正常工作

时间:2012-03-20 18:43:58

标签: php oracle zend-framework

我是zend框架的新手,并且以Oracle作为其db有一个项目。经过这么多困难后,我能够设置zend,然后将其连接到db。

这就是介绍;所以让我们转向实际问题。一切都会好的,如果......如果......

我可以使用抽象类方法运行查询。我使用留言板模型,映射器作为基础,并以与设置相同的方式放置我的模型。最初我无法知道我是否连接到db。因此我使用了oci_connect();

它帮助我知道我真的连接到oracle db。但这只是为了测试。然后我使用Zend_Db::factory(...options...).它使用$db->fetchAssoc()等方法也很好。但这也不是我的要求,因为我不想编写硬编码查询。我想使用:

执行运行的查询
$db = Zend_Db::factory($config->database);

$select = $db->select()->from('clients');
$stmt = $select->query();$result = $stmt->fetchAll();echo "<pre>";print_r($sql);echo "</pre>";die;

OR,使用Abstract Class内部方法,如:    $ resultSet = $ this-&gt; getDbTable() - &gt; fetchAll();    使用fetchall()

最后提到的两种方法并不是获取数据......我完全迷失了在哪里找到这两种方式的解决方案。

application.ini详细信息:

resources.db.adapter = "oracle"
resources.db.params.dbname = "//11.11.11.11/RAC"
resources.db.params.username = "abc"
resources.db.params.password = "abc"

1 个答案:

答案 0 :(得分:1)

好的,我会对此嗤之以鼻。

建立application.ini设置,Notes on Oracle Adapter

resources.db.adapter = "oracle" or "PDO_Oci"
resources.db.params.dbname = "//11.11.11.11/RAC"
resources.db.params.username = "abc"
resources.db.params.password = "abc"
//if you are only using one DB go ahead and set default adpter to true.
resources.db.isDefaultTableAdapter = true

设置DbTable类

<?php

class Application_Model_DbTable_Member extends Zend_Db_Table_Abstract
{
    //name of dtabase table
    protected $_name = 'member';
    //name of column with primary key
    protected $_primary = 'memberid';
    //primary key auto-increment? True for yes false for natural key
    protected $_sequence = FAlSE;

在您的DbTable类或其子类中,您将可以访问Zend_Db_Table_Abstract方法。我知道你目前正在使用mappers,但信息可能会派上用场,并提供简单的演示,因为默认的db适配器已经可用。

//I like the select() method when querying against a table because select() provides
//automatic quoting of most values. select() can be used to built fairly complex queries.
//This method will either fetchAll() in the table or fetchRow or Rowset against provided values
public function fetchAllMember($column = NULL, $value = NULL) {
        $select = $this->select();
        if ($column != NULL) {
            $select->where($column . '= ?', $value);
        }
        $result = $this->fetchAll($select);
        return $result;
    }

如果你没有使用select(),你可以选择使用quoteInto(),quote()或qouteIdentifier()方法。这些需要引用db适配器。

public function deleteMember($memberId) {
        //reference the available adapter and quote the values into the sql statement
        $where = $this->getAdapter()->quoteInto('memberid = ?', $memberId);
        $this->delete($where);
    }

当不使用引用方法时,它也可以在没有适配器的情况下工作。

public function addMember(array $memberData) {
        $data = array(
            //array of data
        );
        $this->insert($data);
    }

当抽象方法可用时,table_row方法也可用,我最喜欢的是save()方法,它在单行上作为插入和更新方法。

public function saveAlbum(array $data) {
        //I like to use object notation when possible
        $dataObject = (object) $data;
        //create row
        $row = $this->createRow();
        //if id is present as array key the row will be updated
        if (array_key_exists('id', $data)) {
            $row->id = $dataObject->id;
        }
        //else a new id will be assigned and a new row created
        $row->name = $dataObject->name;
        $row->artist_id = $dataObject->artist_id;
        $row->year = $dataObject->year;
        //insert or update row
        $row->save();
        // return the row of data
        return $row;
    }

在类之外工作时,访问db的扩展抽象有点不同。

//in controller or models or other classes the default adapter is easily available.
$db = Zend_Db_Table_Abstract::getDefaultAdapter();

如果适配器可用,您可以使用Zend_Db_Select()Zend_Db_Statement()来构建和执行查询。

//Zend_Db_Statement()
$stmt = $db->query('SELECT * FROM bugs');
$rows = $stmt->fetchAll();

//Zend_Db_Select()
$select = $db->select()
             ->from('products'); 
$stmt = $db->query($select);
$result = $stmt->fetchAll();

这绝不是全面的,但确实给出了Zend_Db的亮点。我希望它有所帮助