类方法与数据库交互的抽象不起作用,


Abstraction of class methods interaction with database not working,

我有一个名为user的类。我正在尝试将一些常用的数据库方法抽象化,这样我就可以将所有这些函数转换为数据库的"超级对象"。

    class User {
        protected static $table_name="users";
        protected static $db_fields = array('id', 'first_name');
        public $id;
        public $first_name;

    public function create() {
    global $database;
    $attributes = $this->sanitized_attributes();
    $sql = "INSERT INTO ".self::$table_name." (";
    $sql .= join(", ", array_keys($attributes));
    $sql .= ") VALUES ('";
    $sql .= join("', '", array_values($attributes));
    $sql .= "')";
    if($database->query($sql)) {
    $this->id = $database->insert_id();
    return true;
    } else {
    return false;
    }
   }
  }

这就是我对create方法所做的,使它与类无关。正如您所看到的,它非常简单——只有两个数据库字段,第一个是name和id。id设置为非NULL和autoincrement。我的问题是。。。。。。

$database->insert_id()方法只是通过这个连接提取数据库中创建的最后一个id。

如果我运行一个简单的创建,如下

 $user = new User();
 $user->first_name = "Paul";
 $user->create();

我明白。。。

 Database query failed: Incorrect integer value: '' for column 'id' at row 1
 Last SQL query: INSERT INTO test_user (id, first_name) VALUES ('', 'Paul')

就我所见,$sql语句是正确的。我知道问题是ID没有被设置,但如果它被设置为自动增量,这不应该被自动设置吗。。。。。

此外。。。我知道PDO是一条路,但现在(我正在逐步学习),有人能帮我吗。。。

自定义函数create。这将适用于上述场景。

public function create()  { 
    global $database;
    foreach($this->sanitized_attributes() as $key=>$attribute) {
        if ((is_null($attribute)) || empty($attribute)) {
            $attributes[$key] = "null";
        } else {
            $attributes[$key] = "'" . $attribute . "'";
        }
    } 
    $sql = "INSERT INTO ".self::$table_name." (";
    $sql .= join(", ", array_keys($attributes));
    $sql .= ") VALUES (";
    $sql .= join(", ", array_values($attributes));
    $sql .= ")";
    if($database->query($sql)) {
    $this->id = $database->insert_id();
    return true;
    } else {
    return false;
    }
}