我在PHP中对OOP相当新。我正在尝试更新由其父类中的循环生成的数组中的项的值。在我的代码中,类DatabaseObject创建一个包含所有表字段名称和值对的属性数组。数组的内容用于创建SQL查询以写入数据库。我试图解决的问题是我需要使用子User类中的加密密码更新属性['hashed_password']项。我不太确定如何更新该数组项,以便将散列密码提交到数据库,而不是通过表单提交。
class DatabaseObject {
public function create(){
global $db;
static::$attributes = [];
foreach (static::$db_fields as $field) {
if(property_exists($this, $field)){
$attributes[$field] = $this->$field;
}
}
$sql = "INSERT INTO " . static::$table_name . " (";
$sql .= join(", ", array_keys($attributes));
$sql .= ") VALUES ('";
$sql .= join("', '", array_values($attributes));
$sql .= "')";
$result = mysqli_query($db, $sql)
}
}
class User extends DatabaseObject {
protected static $table_name="users";
protected static $db_fields = array("user_id", "username", "hashed_password", "email");
public $user_id;
public $username;
public $hashed_password;
public $email;
self::attributes['hashed_password'] = password_hash($this->attributes['hashed_password'], PASSWORD_BCRYPT);
}
任何帮助都将不胜感激。
答案 0 :(得分:0)
对我有用的解决方案只是覆盖User对象中的create函数并使用散列密码手动更新数组,因此新的User对象变为:
class User extends DatabaseObject {
public function create(){
global $db;
static::$attributes = [];
foreach (static::$db_fields as $field) {
if(property_exists($this, $field)){
$attributes[$field] = $this->$field;
}
}
$attributes['hashed_password'] = password_hash($attributes['hashed_password'], PASSWORD_BCRYPT);
$sql = "INSERT INTO " . static::$table_name . " (";
$sql .= join(", ", array_keys($attributes));
$sql .= ") VALUES ('";
$sql .= join("', '", array_values($attributes));
$sql .= "')";
$result = mysqli_query($db, $sql)
}
}
}
不确定这是否是最有效的方法,但它确实有效。