2017-12-10 18 views
0

私はPHPでOOPをかなり新しくしています。私は親クラスのループによって生成された配列内の項目の値を更新しようとしています。私のコードでは、DatabaseObjectクラスは、すべてのテーブルフィールド名と値のペアを持つ属性配列を作成します。配列の内容は、データベースに書き込むSQLクエリを作成するために使用されます。私が解決しようとしている問題は、属性['hashed_pa​​ssword']アイテムを子Userクラスの暗号化されたパスワードで更新する必要があることです。どのようにして配列アイテムを更新して、ハッシュされたパスワードがフォーム提出の代わりにデータベースに送信されるようにするのか、私はよく分かりません。子クラスの親クラスから配列アイテムを更新する

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

setPass()メソッドについてはどうですか? – FatalError

答えて

0

私のために働いたソリューションは、ハッシュされたパスワードを持つ配列を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) 
} 
} 
} 

わかりませんそれを行う最も効率的な方法でしたが、効果がありました。

関連する問題