1

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

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

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

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

提前致谢!

4

3 回答 3

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 = "设置名称 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并在模型中使用知识。

于 2012-08-23T07:23:12.627 回答
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() 对象。
您可以使用Zend_Db_Expr来表示更复杂的表达式$select->where(new Zend_Db_Expr("FIND_IN_SET('$genre', genre)"));
,不要忘记Zend_Db_Statement(我从未使用过,因此无法正确演示)。

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

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

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

于 2012-08-23T09:13:47.077 回答
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 的参数化进行查询,否则您将丢弃 DB 层的所有出色的安全性和安全性功能。

于 2012-08-23T02:14:18.157 回答