我有一个名为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;
}
}