Zend с Oracle: запросы не работают должным образом - PullRequest
2 голосов
/ 20 марта 2012

Я новичок в Zend Framework и имею проект для него с Oracle в качестве базы данных. После стольких трудностей я смог настроить Zend, а затем подключить его к БД.

Итак, это вступление; так что давайте перейдем к актуальной проблеме. Все будет хорошо, если ... если ...

Я могу выполнять запросы, используя методы абстрактного класса. Я использую модели гостевой книги, картографы в качестве основы и размещаю свои модели таким же образом, как они были настроены. Первоначально я не мог знать, был ли я подключен к БД или нет. Для этого я использовал: oci_connect();.

Это помогло мне узнать, что я действительно связан с oracle db. Но это только для тестирования. Затем я использовал Zend_Db::factory(...options...). Он тоже работал нормально, используя $db->fetchAssoc() и т. Д. Но это тоже не мое требование, так как я не хочу писать жестко закодированные запросы. Я хочу выполнить запросы, выполняющиеся с использованием:

<code>$db = Zend_Db::factory($config->database);

$select = $db->select()->from('clients');
$stmt = $select->query();$result = $stmt->fetchAll();echo "<pre>";print_r($sql);echo "
"; умереть;

ИЛИ, используя внутренние методы Abstract Class, такие как: $ resultSet = $ this-> getDbTable () -> fetchAll (); fetchAll ()

Последние 2 упомянутых способа не приводят к получению данных ... и я полностью потерян, где найти решение для этих двух способов.

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 Ответ

1 голос
/ 22 марта 2012

хорошо, я возьму это на себя.

Установка настроек application.ini, Замечания по адаптеру Oracle :

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. Я знаю, что в настоящее время вы используете мапперы, но информация может пригодиться и предоставляет простые демострации, так как адаптер БД по умолчанию уже доступен.

//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 (). Для этого требуется ссылка на адаптер БД.

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;
    }

При работе вне классов расширенный абстрактный доступ к БД немного отличается.

//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. Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...