【问题标题】:Zend Database HandlingZend 数据库处理
【发布时间】:2012-08-23 00:12:23
【问题描述】:

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

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

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

我已按照 Zend 站点上的教程进行操作,但在使用 Zend_Db_Table 方法后,我无法找到我想要的灵活性,因此希望这里的人可以为我指明不同的方向。我似乎很难理解 Zend 数据库模型如何与 Zend 控制器交互,但我确信有很多 SO 用户可以提供一些可靠的输入。

提前致谢!

【问题讨论】:

标签: php oop zend-framework


【解决方案1】:

当您将此配置放入 application.ini 时,Zend 将在您尝试查询时建立与数据库的连接(其中一些是可选的):

resources.db.adapter = "pdo_mysql"
resources.db.params.host = "[主机地址]"
resources.db.params.username = "[db_username]"
resources.db.params.password = "[db_password]"
资源.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 模型,例如定义如下模型:

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


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

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



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

【讨论】:

    【解决方案2】:

    $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"
    

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

    【讨论】:

    • 洛基:感谢您的回复!当我将数据库连接的东西放在 init() 方法中时,我无法在 indexAction() 中访问它,它以未定义的形式返回。有什么需要高兴的,以便我可以在同一个控制器中访问 indexAction() 方法中的变量吗?
    【解决方案3】:

    您应该记住,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 层的所有出色的安全性和安全性功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多