PHP通用数据库访问

时间:2012-01-24 19:58:30

标签: 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)
    {
        $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'));

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

1 个答案:

答案 0 :(得分:0)

我想我会提供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/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();
}

只需这个简单的模型,您的模型和控制器就可以使用所有CRUD功能。
我们创建新方法或覆盖现有方法,以提供对业务逻辑的更多控制。
我们大多数人都需要更多简单的CRUD功能。
例如,我有一个删除功能,需要检查其他数据是否成功:

// /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));
        }
    }

我希望这为我们的讨论增添了一些清晰度。