就在最近,我开始自己重写以前程序编写的网站,我之所以选择PDO作为包装,因为我也习惯了OOP的做事方式。我想对这些类的结构提出一些建议。
主要是一切都是数据库驱动的,比如添加类别和子类别,产品品牌,产品,用户等等。我想每个都可以是一个类,因为我需要对所有这些操作进行CRUD操作,我需要一个通用的在MySql数据库中插入,更新,删除记录的方法。问题不在于代码,我想(并且已经)根据我的需要自己编写了一些CRUD操作,真正的问题是结构以及如何正确地分发和扩展这些类。 / p>
现在我编写了3种不同的方法:
一个名为'Operations'的类,它将被所有其他需要CRUD函数的类扩展,这个类包含非常通用的属性,如$ id,$ atributes,$ fields和$ table,当然还有插入,更新,删除的通用方法。这样我可以创建,让我的Product对象包含一些参数(名称,类别,价格),并立即将Product-> insert()放入数据库,而不将任何参数传递给insert函数。此类中的CRUD函数不接受参数,它们取决于创建的对象的属性。
与上面相同,但CRUD函数接受参数,使它们(我猜)更通用,以防我只是需要插入一些东西而不创建以前无用属性的对象。
'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);
}
}