2012-08-23 74 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()方法中访问变量? –