Zend数据库处理


Zend Database Handling

我是Zend的新手,但对PHP和其他MVC框架非常熟悉。客户端要求Zend用于应用程序,而我在找到我喜欢的数据库方法时遇到了一点困难。我只连接到一个数据库(目前是MySQL,生产中是MSSQL),实际上只与一个表交互。话虽如此,我想找到一种很好的方法来打开该数据库的句柄并保持其打开状态,以便它在我的所有控制器中都可用,并允许我使用fetchAll、fetchOne等方法。

理想情况下,我希望能够从控制器中进行如下调用,并将结果传递给视图。

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

我遵循了Zend网站上的教程,但在使用Zend_Db_Table方法后,我找不到我想要的灵活性,因此希望这里的人能给我指明不同的方向。我似乎很难理解Zend数据库模型如何与Zend控制器交互,但我相信有很多SO用户可以提供一些可靠的输入。

提前感谢!

当您将此配置放入应用程序时。当您尝试查询数据库时,Zend将建立与数据库的连接(其中一些是可选的):

resources.db.adapter="pdo_mysql"resources.db.params.host="[host_address]"resources.db.params.username="[db_username]"resources.db.params.password="[db_password]"resources.db.params.dbname="[db_name]"resources.db.isDefaultTableAdapter=trueresources.db.params.charset="utf8"resources.db.params.driver_options.1002="设置名称utf-8"


要查询数据库,最好使用Zend模型,例如定义以下模型:

类Application_Model_Book扩展Zend_Db_Table_Abstract{公共函数getBookById($id){return$this->find($id);}}


然后在你的控制器中使用它,比如:

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



当然,这是一个微不足道的例子,很容易在控制器中实现。但对于更复杂的查询,它将对代码进行大量的组织和清理。阅读http://framework.zend.com/manual/1.11/en/zend.db.select.html并在模型中使用知识。

$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()对象,如我的示例代码中所示。
您可以使用Zend_Db_Expr来表示更复杂的表达式$select->where(new Zend_Db_Expr("FIND_IN_SET('$genre', genre)"));
并且不要忘记Zend_Db_Statement(我从未使用过,因此无法正确演示)。

如果需要,可以引用值和标识符
[EDIT]

正如前面所说的,您必须定义一个数据库适配器。我更喜欢在我的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"

我希望这至少能给你指引方向。祝你好运!

您应该记住,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的参数化进行查询,否则您将放弃DB层所有出色的安全性和安全性功能。