0

为子模型将继承的父模型编写通用插入函数是否常见和/或明智?我在一个非常简单的 CRUD 应用程序上使用 CodeIgniter\PHP,但这个问题确实与语言\框架无关。继承读取(选择)一个值的读取函数效果很好并且感觉正确:父模型

public function read($columnSelect,$columnCondition,$value) {
    $query = "SELECT $columnSelect FROM $tableName WHERE $columConditionn=?";
    $res = $this->db->query($query,$columnName);
    if ($res->result()->num_rows()>0)
        return $res->result();
    else 
        return false;

这可以让您检索用户 ID、电子邮件、检查某些列的存在等,我认为这在我的大多数或所有模型中肯定会有用,因此在父模型中编写该函数是个好主意。所有更复杂的读取函数显然都特定于每个模型(例如,读取多个值的查询等) 现在插入呢?除了编写插入一个值、两个值等的函数或编写一个“丑陋”函数来获取参数数组并根据数组构建插入查询之外,我想不出任何通用插入,例如:

        public function genericInsert($columnList,$valueList) {

              $query = " INSERT INTO $tableName(
                        //now code that parses columnList and adds ','
                       //and then code that adds VALUES(..) in the same manner

这对我来说绝对不是一种“模式”,而且感觉不对。我忽略了什么吗?你们为您的插入做了什么,它是特定于每个模型的,还是您试图找到一种从父模型继承的方法?此外,如果您愿意,您会发现自己在父模型中添加了哪些功能?(更新、删除等)?

到目前为止,这是我的父模型的样子:

class MY_Model extends CI_Model {
    public $tableName;

    public function __construct($tableName) {
        parent::__construct();
        $this->tableName = $tableName;

    }

    public function read($columnSelect,$columnCondition,$value) {
        $query = "SELECT $columnSelect FROM $tableName WHERE $columConditionn=?";
        $res = $this->db->query($query,$columnName);
        if ($res->result()->num_rows()>0)
            return $res->result();
        else 
            return false;
    }
}
4

3 回答 3

0

只是一些建议,在创建这样的查询时要非常小心。我没有看到您的代码中发生任何转义,从而使您的代码为 SQL 注入打开。

例如,如果 $columnSelect 变为;

"x'; DROP TABLE members; --"

您的查询变为:

"SELECT 'x'; DROP TABLE members; -- FROM $tableName WHERE $columConditionn=?";
于 2013-01-26T21:05:34.967 回答
0

讨厌回答我自己的问题,但这就是我正在寻找的 http://thephpcode.com/blog/codeigniter/a-smart-codeigniter-model

于 2013-01-26T19:50:10.750 回答
0

为什么要重新发明轮子?Codeigniter 的标准 db 类已经可以完成您想要创建的父模型所做的一切。如果您正在编写自己的数据库包装类而不使用 CI,那将是有意义的但 CI 已经提供了这些功能,并且可以根据需要进行自定义/扩展。

于 2013-01-25T21:47:47.257 回答