Php Zend数据库处理

Php Zend数据库处理,php,oop,zend-framework,Php,Oop,Zend Framework,我是Zend的新手,但对PHP和其他MVC框架非常熟悉。客户机要求Zend用于应用程序,而我在寻找我喜欢的数据库方法时遇到了一点困难。我只连接到一个数据库(现在是MySQL,生产中是MS SQL),实际上只与一个表进行交互。话虽如此,我还是想找到一个好方法来打开该数据库的句柄并保持它的打开状态,以便它在我的所有控制器中都可用,并允许我使用诸如fetchAll、fetchOne等方法 理想情况下,我希望能够从我的控制器中进行如下调用,并将结果传递给视图 $this->db->fetch

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

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

$this->db->fetchAll("SELECT * FROM TABLE"); 
我已经在Zend网站上学习了教程,但是在使用Zend_Db_表方法之后,我没有找到我想要的灵活性,因此我希望这里的人能给我指出一个不同的方向。我似乎很难理解Zend数据库模型如何与Zend控制器交互,但我确信有很多SO用户可以提供一些可靠的输入


提前谢谢

您应该记住,Zend模型完全不了解您的控制器。这是MVC模式思想的一部分

你似乎离你要找的东西很近。如果要使用SQL语句直接查询数据库,请参阅Zend_db->query()方法。我想这正是你想要的。

但实际上,这样做会丢掉Zend_DB的很多好处。如果您使用Zend_Select对象构建查询,您将获得表/字段前缀的自动插值、所有查询的参数化、连接等。如果您能够获得SQL->ORM学习曲线,它们真的很棒。


无论如何,一定要使用Zend的参数化进行查询,否则您将丢掉DB层的所有强大安全功能。

当您将此配置放入应用程序时。ini 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=true resources.db.params.charset=“utf8” resources.db.params.driver_options.1002=“设置名称utf-8”
要查询数据库,最好使用Zend模型,例如定义如下模型:

类应用程序\u模型\u书籍扩展了Zend\u Db\u表\u摘要{ 公共函数getBookById($id){ 返回$this->find($id); } }
然后在控制器中使用它,如:

$mBook = new Application_Model_Book(); $myBook = $mBook->getBookById(5); $mBook=新应用程序\模型\书本(); $myBook=$mBook->getBookById(5);

当然,这是一个简单的例子,很容易在控制器中实现。但是对于更复杂的查询,它将大量地组织和清理您的代码。阅读并使用模型中的知识。

$this->db->fetchAll(“从表中选择*)实际上相当容易实现

我假设您已经在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.

    }
}
我认为大多数人在第一次使用时遇到的最大问题是弄清楚哪种方法是最好的。有很多方法可以使用这个组件,我们大多数人都会找到一个我们喜欢的组件,并将其用于所有事情

例如,一个简单的sql查询可以表示为一个字符串
$sql=“SELECT*fromtable”

如我的示例代码中所示。
您可以使用来表示更复杂的表达式
$select->where(新的Zend_Db_Expr(“FIND_IN_SET(“$genre”,genre)”)

不要忘记(我从未使用过,因此无法正确演示)

如果需要,可以使用。
[编辑]

如前所述,您必须定义一个。我更喜欢在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"

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

强烈推荐阅读这篇文章。洛基:谢谢你的回复!当我将db连接内容放入init()方法中时,我无法在indexAction()中访问它,它返回为未定义。是否需要满足某些条件,以便在同一控制器中访问indexAction()方法中的变量?
//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.

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