我想要insert/edit/delete
来自database
的{{1}}记录的自定义功能
必须为每个页面编写单个查询。
我原本想过这样做:
//page.php:
$datainput = new DataInputAbstraction();
$datainput->setTableName = 'portal';
$datainput->setAllowedFields = array('name'=>'defaultvalue','text'=>'','desc'=>'');
$datainput->run();
// DataInputAbstraction.class.php:
class DataInputAbstraction{
//> attr
public function run(){
if (isset($_POST['action']) && $_POST['action']=='insert') {
$filteredData = array_intersect_key($this->allowedFields,$_POST);
//> Do a mysql query to insert $filteredData to $this->table
}
//> Do other stuff if $_POST['action'] == 'edit' | 'del'
}
}
基本上方法run()基于$ _POST ['action']执行正确的操作。
使用allowedFileds属性对intersect_key执行过滤后出现的不需要的变量,然后将查询构建到
INSERT INTO $this->tableName (array_keys($field)) VALUES (array_values($field))
(伪代码)
你认为这是一个很好的方法吗?有更好的方法或php提供类似的内置功能吗?
由于
答案 0 :(得分:1)
在我看来,如果你不想使用已经存在的东西(RedBean是一个非常好的选择BTW),那么你可以继续这样做。
我总是喜欢尽可能多的抽象,因为它让你无法对使用什么服务做出艰难的决定。例如,如果稍后更改数据库提供程序,您将创建一个数据抽象层来处理所有数据事务,只需要重新编码就是数据抽象类。
所以,我认为这是一个好主意。我唯一的建议是确保你遵守DRY原则,并保持你的抽象层非常模块化。使用抽象层的代码不应该知道它是如何工作的,只是它提供了所需的数据。
希望有所帮助。
答案 1 :(得分:0)
它永远不会真正起作用,因为您必须为插入和更新设置不同的字段集。
然而,这个想法本身已经足够好了并且以
的形式出现$datainput = new DataInputAbstraction();
$datainput->setTableName = 'portal';
if ($action=='insert'){
$datainput->setAllowedFields = array('name','text','desc','timestamp');
} elseif ($action=='update'){
$datainput->setAllowedFields = array('name','text','desc');
$datainput->setWhereConditions = array('id' => $_POST['id']);
}
$datainput->run($action);
没关系。
但是,我自己更喜欢普通的SQL而不是某些抽象