2012-08-23 75 views
1

我是Zend新手,但對PHP和其他MVC框架非常熟悉。客戶要求將Zend用於應用程序,並且在查找我喜歡的數據庫方法時遇到一些問題。我只連接到一個數據庫(現在的MySQL,生產中的MS SQL),並且只能與一個表進行交互。有了這個說明,我想找到一個很好的方法來打開該數據庫的句柄並保持打開狀態,以便它可以在我的所有控制器中使用,並允許我使用fetchAll,fetchOne等方法。Zend數據庫處理

理想情況下,我希望能夠從我的控制器中撥打下面的電話,並將結果傳遞給視圖。

$this->db->fetchAll("SELECT * FROM TABLE"); 

我按照在Zend的站點上的教程,但使用該方法的Zend_Db_Table後,我沒能找到我想要的,因此我在這裏希望有人能指出我在不同的方向上的靈活性。我似乎在圍繞着Zend數據庫模型如何與Zend控制器進行交互的過程中遇到困難,但我確信有很多SO用戶可以提供一些可靠的輸入。

在此先感謝!

+0

強烈推薦閱讀此。 http://survivethedeepend.com/zendframeworkbook/en/1.0 – ficuscr

回答

1

當你把這個配置到你的application.ini的Zend將estabilish連接到數據庫時,你會嘗試進行查詢(其中有些是可選):

resources.db.adapter = "pdo_mysql" 
resources.db.params.host = "[host_adress]" 
resources.db.params.username = "[db_username]" 
resources.db.params.password = "[db_password]" 
resources.db.params.dbname = "[db_name]" 
resources.db.isDefaultTableAdapter = true 
resources.db.params.charset = "utf8" 
resources.db.params.driver_options.1002 = "SET NAMES utf-8"


要查詢數據庫,它是最好的使用Zend的模型,例如定義模型,如:在

 
class Application_Model_Book extends Zend_Db_Table_Abstract{ 
    public function getBookById($id){ 
     return $this->find($id); 
    } 
} 


,然後用它你控制器,如:

 
$mBook = new Application_Model_Book(); 
$myBook = $mBook->getBookById(5); 



Ofcourse這是一個簡單的例子,並且很容易在控制器製成。但對於更多複雜的查詢,它將大量組織和清理您的代碼。閱讀http://framework.zend.com/manual/1.11/en/zend.db.select.html並在模型中使用知識。

0

您應該記住,Zend模型完全不瞭解您的控制器。這是MVC模式的一部分。

你似乎非常接近你要找的東西。如果您想使用SQL語句直接查詢您的數據庫,請參閱Zend_DB-> query()方法。我想這正是你要求的。 http://framework.zend.com/manual/en/zend.db.statement.html

但是真的,這樣做會拋棄Zend_DB的很多好處。如果你使用Zend_Select對象建立一個查詢,你會得到一個表/字段前綴的自動插值,所有查詢的參數化,連接等等。如果你可以得到SQL-> ORM學習曲線,那麼它們真的很棒。 http://framework.zend.com/manual/en/zend.db.select.html

無論如何,一定要使用Zend的參數化查詢,否則你會丟掉數據庫層的所有重要的安全和安全功能。

1

$this->db->fetchAll("SELECT * FROM TABLE");實際上很容易完成。

我打算假設您已經在application.ini或bootstrap中設置了數據庫適配器。PHP只要你在某個地方定義了一個適配器,那它真的沒關係。

//simplified for demonstration 
class SomeController extends Zend_Controller_Action 

    protected $db; 

    //items that are put into init() or predispatch() or similar function 
    //can usually be put into a frontcontroller plugin if needed app wide. 
    public function init() { 
     //this works as long as you have only one adapter defined or have set one as default. 
     $this->db = Zend_Db_Table::getDefaultAdapter(); 
    } 
    public function indexAction() { 
     //with your db adapter defined you have access to the api for Zend_Db_Table_Abstract 
     $result = $this->db->fetchRow($sql); 
     //while a simple string will work as $sql I would 
     //recommend the select() be used if for not other reason then that 
     //the queries are built programatically 
     $select = $this->db->select(); 
     $select->where('id = ?', $id)->orWhere('role = ?', 1); //selects can be chained or separated 
     $select->order('id','ASC'); 

     $rows = $this->db->fetchAll($select);//returns rowset object, toArray() if needed. 

    } 
} 

我認爲最大的問題大多數人首先使用Zend_Db是搞清楚這是使用它的最佳方式時有。有很多方法可以使用這個組件,並且我們大多數人都會找到我們喜歡的一個,並將其用於一切。

例如一個簡單的SQL查詢可以表示爲一個字符串$sql = "SELECT * FROM TABLE";
作爲select() object如在我的例子的代碼。
您可以使用Zend_Db_Expr表示更復雜的表達式$select->where(new Zend_Db_Expr("FIND_IN_SET('$genre', genre)"));
不要忘記Zend_Db_Statement(這是我從來沒有使用過,所以不能正確地演示)。

Quoting of values and identifiers可根據需要使用。
[編輯]

因爲已經如前所述,你必須定義一個database adpater。我更喜歡在我的application.ini中執行此操作,但是Bootstrap.php也是定義適配器的常用位置。

在你的application.ini確保你至少有這行:

resources.db.adapter = "pdo_Mysql" //or your chosen adapter 
resources.db.params.username = "username" 
resources.db.params.password = "password" 
resources.db.params.dbname = "dbname" 

我希望這至少給你方向看好運!

+0

洛基:感謝您的迴應!當我把數據庫連接的東西放在init()方法中時,我無法在indexAction()中訪問它,它會以未定義的方式返回。有什麼需要快樂的,以便我可以在同一個控制器的indexAction()方法中訪問變量? –