PHP通用数据库访问

PHP通用数据库访问,php,database,security,zend-framework,zend-db,Php,Database,Security,Zend Framework,Zend Db,我希望我的PHP Zend应用程序能够访问数据库 因为任务只有两种类型:从数据库获取和设置值,所以我考虑用通用方法简化它 它可能看起来像这个例子 namespace MyModule\Model; use Zend\Db\Table\AbstractTable; class MyTable extends AbstractTable { protected $_name = 'tablename'; public function getRow($selection)

我希望我的PHP Zend应用程序能够访问数据库

因为任务只有两种类型:从数据库获取和设置值,所以我考虑用通用方法简化它

它可能看起来像这个例子

namespace MyModule\Model;
use Zend\Db\Table\AbstractTable;

class MyTable extends AbstractTable
{
    protected $_name = 'tablename';

    public function getRow($selection)
    {
        $output = array();
        foreach($selection as $key => $value)
        {
            $row = $this->fetchRow($key ' = ' . $value);
            if (!$row) throw new Exception("error");
            array_merge($output, $row->toArray());
        }
        return $output;
    }

    public function addRow($values)
    {
        $this->insert($values);
    }

    public function updateRow($selection, $values)
    {
        foreach($selection as $key => $value)
        {
            $this->update($values, $key ' = ' . $value);
        }
    }

    public function deleteRow($selection)
    {
        foreach($selection as $key => $value)
        {
            $this->delete($key ' = ' . $value);
        }
    }
}
是否存在任何反对此方法的安全性或设计参数?我想让他们全球化,像这样访问数据库

 $row = database('mydatabase')->table('mytable')->getRow(array('id'=>'5'));

此解决方案将取代所有简单的数据库模型。

我想我将提供一个Zend_Db如何工作的简单示例,然后您可以演示您的意图,我不确定我是否完全理解。
模型

// /application/Models/DbTable/MyTable.php
<?php
class Application_Model_DbTable_MyTable extends Zend_Db_Table_Abstract {

    //actual name of database table
    protected $_name = 'My_Table';
    //name of primary key
    protected $_primary = 'id';

}
///application/Models/DbTable/MyTable.php

您基本上只是复制正在扩展的Zend/Db/Table/Abstract类。如果您正在编写抽象类,这将非常好。如果您真的想要一个通用的数据库访问模型,您不会扩展Zend/Db/Table/Abstract。您可以将其设计为能够从任何已经扩展了Db/Table/Abstract的Model/DbTable类中提取数据。这样,如果您曾经更改过数据库适配器,您所要做的就是更改DbTable类并继续。@RockyFord:这意味着默认的TableAbstract类已经可以这样做了?这就是抽象类所做的,它提供了一个接口,允许CRUD访问表。有一个类似的类来处理行或行集的相同函数。在我看来,您正在尝试在模型中抽象数据处理。这意味着您必须相当小心地处理控制器中的数据,如果参数数量错误,则可能会遇到sql错误。例如,如果您使用addRow($values)方法,并且数组()中的数字值错误,您将抛出一个sql错误。我可以改进上面的类,在插入/更新/删除之前检查数据。所以我不应该得到sql错误。有任何反对的安全论点吗?我怎样才能用抽象类从我的控制器中获得这些功能?我不知道安全问题,但我不是安全专家。好的,谢谢。我想要它做的是在不使用DbTable文件的情况下访问数据库。就像这样(从我的控制器):
$row=database('mydatabase')->table('mytable')->getRow(array('id'=>'5')(其中数组表示条件)您认为我的评论中的行吗?不,我不知道如何为此编写所需的函数。这就是我发布这个问题的原因。告诉你,看看这本免费的ZF开发者的书,在模型部分,他真的在抽象不需要的东西。一旦你了解Zend_Db是如何工作的,我想你就会明白为什么这个问题很难回答。谢谢,我会看看电子书。我将尝试编写一个提供基本数据库支持的操作助手。
// /application/controllers/MyController.php
<?php
class Mycontroller extends Zend_Controller_Action {

    public function init() {
}

    public function indexAction() {
        //instantiate DbTable Model and execute FetchAll returns Rowset object
        //call ->toArray() for array to be returned: $model->fetchAll()->toArray();
        $model = new Application_Model_DbTable_MyTable();
        $model->fetchAll();
}
// /application/Models/DbTable/Track.php
 public function deleteTrack($trackId) {

        $trackRowset = $this->find($trackId);
        $trackToGo = $trackRowset->current();

        $usedBy = $trackToGo->findDependentRowset('Application_Model_DbTable_Member');
        if (count($usedBy) == 0) {

            $where = $this->getAdapter()->quoteInto('trackid = ?', $trackId);

            $this->delete($where);
        } else {
            throw new Zend_Exception('Track is still assigned to member(s) and cannot be deleted.'
                . "<br />" . 'Members: ' . count($usedBy));
        }
    }