1

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

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

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

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

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

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

我倾向于第一个选项,因为我认为,在大多数情况下,它将满足我对这个网站所做的一切,同样,该网站已经编码但在程序上,这一直是一团糟,所以基本上我需要重新做的事情,但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);
}
}
4

0 回答 0