使用基本CRUD功能扩展PDO的建议

时间:2012-09-05 04:00:40

标签: php class pdo crud extend

就在最近,我开始自己重写以前程序编写的网站,我之所以选择PDO作为包装,因为我也习惯了OOP的做事方式。我想对这些类的结构提出一些建议。

主要是一切都是数据库驱动的,比如添加类别和子类别,产品品牌,产品,用户等等。我想每个都可以是一个类,因为我需要对所有这些操作进行CRUD操作,我需要一个通用的在MySql数据库中插入,更新,删除记录的方法。问题不在于代码,我想(并且已经)根据我的需要自己编写了一些CRUD操作,真正的问题是结构以及如何正确地分发和扩展这些类。 / p>

现在我编写了3种不同的方法:

  1. 一个名为'Operations'的类,它将被所有其他需要CRUD函数的类扩展,这个类包含非常通用的属性,如$ id,$ atributes,$ fields和$ table,当然还有插入,更新,删除的通用方法。这样我可以创建,让我的Product对象包含一些参数(名称,类别,价格),并立即将Product-> insert()放入数据库,而不将任何参数传递给insert函数。此类中的CRUD函数不接受参数,它们取决于创建的对象的属性。

  2. 与上面相同,但CRUD函数接受参数,使它们(我猜)更通用,以防我只是需要插入一些东西而不创建以前无用属性的对象。

  3. 'Operations'类扩展了PDO,工作方式类似于2,但现在可以在创建数据库连接时直接访问它们,而不是依赖于其他对象。

  4. 我倾向于第一种选择,因为我认为,在大多数情况下,它将满足我对这个网站所做的一切,再次网站已经编码但程序性,这是一个混乱的维护,所以基本上我需要重新做一些事情,但是OO。

    CMS或已经编码的包装器(这样做的目的是学习PDO并习惯OOP),这是最好的方法吗?不限于我提到的选项。

    这是迄今为止我设法编写的“操作”类,我一直在做类沙盒测试,不介意西班牙语变量名。关于代码的建议也是受欢迎的。

    class Operaciones {     
    private $database;
    
    protected $id;
    protected $atributos;
    
    protected $tabla;
    protected $campos;
    
    public function __construct($link) {
        $this->database = $link;
    }
    
    public function insertar() {
        if (!$this->verificarCamposNulos($this->atributos, $this->campos))
            echo 'Campos nulos<br />';
        else {
            $this->prepararCampos();
            $placeholders = $this->generarPlaceholders();           
    
            $stmt = $this->database->prepare("INSERT INTO {$this->tabla} ({$this->campos}) VALUES ({$placeholders})");
    
            $valores = array_values($this->atributos);
            $stmt->execute($valores);
    
            $stmt = NULL;           
            echo 'Se ha insertado exitosamente';
        }
    }
    
    public function modificar() {
        if (!$this->verificarCamposNulos() || empty($this->id))
            echo 'Campos nulos<br />';
        else {
            $this->prepararCampos('=?');                        
    
            $stmt = $this->database->prepare("UPDATE {$this->tabla} SET {$this->campos} WHERE id = {$this->id}");
    
            $valores = array_values($this->atributos);
            $stmt->execute($valores);
    
            $stmt = NULL;           
            echo 'Se ha modificado exitosamente';           
        }
    }
    
    private function generarPlaceholders() {
        for($i=0;$i<count($this->atributos);$i++) 
            $qmarks[$i] = '?';
    
        return implode(',', $qmarks);
    }
    
    // Check if the values to be inserted are NULL, depending on the field format given
    private function verificarCamposNulos() {
        $n_campos = explode(',', $this->campos);
    
        $valores = array_values($this->atributos);
    
        foreach($n_campos as $i => $result) {       
            if (strstr($result, '@'))           
                if (empty($valores[$i]))
                    return false;
        }
    
        return true;
    }   
    
    // Removes the '@' from each field, used to check which fields are NOT NULL in mysql
    private function prepararCampos($sufijo = NULL) {
        $n_campos = explode(',', $this->campos);
    
        foreach($n_campos as $i => $result)         
            $n_campos[$i] = str_replace('@', '', $result) . $sufijo;
    
        $this->campos = implode(',', $n_campos);
    }
    }
    

0 个答案:

没有答案