2011-09-16 12 views
1

私はget_object_varsがphp.netでどのように動作するかを見ました。OOP PHP - get_object_vars

私のOOPスクリプトではうまくいかないことがあります。

DatabaseObjectを拡張user.phpファイルがあります:作成()関数は、ユーザーが公共のvars内部に格納された値を取る必要があります

<?php 
require_once('database.php'); 

class DatabaseObject { 


    public static function findAll(){ 
     global $database; 
     $calledClass = get_called_class();  
     return self::findBySQL("SELECT * FROM ".static::$tableName.""); 
    } 

    public static function findByID($id){ 
     global $database; 
     $calledClass = get_called_class();  
     $result_array = self::findBySQL("SELECT * FROM ".static::$tableName." WHERE ".static::$tableID." = {$id}"); 
     return !empty($result_array) ? array_shift($result_array) : false; 
    } 

    public static function findBySQL($sql){ 
     global $database; 
     $result_set = $database->query($sql); 
     $object_array = array(); 
     while ($row = $database->fetchArray($result_set)) { 
      $object_array[] = self::instantiate($row); 
     } 
     return $object_array;  
    } 

    private static function instantiate($record){ 
     $calledClass = get_called_class();  
     $object = new $calledClass; 
     foreach($record as $attribute=>$value){ 
      if($object->has_attribute($attribute)) { 
      $object->$attribute = $value; 
      } 
     } 
     return $object; 
    } 

    private function has_attribute($attribute) { 
     $object_vars = $this->attributes(); 
     return array_key_exists($attribute, $object_vars); 
    } 

    public function attributes(){ 
     return get_object_vars($this); 
    } 

    protected function cleanAttributes(){ 
     global $database; 
     $cleanAttributes = array(); 
     foreach($this->attributes() as $key => $value) { 
      $cleanAttributes[$key] = $database->escapeValue($value); 
     } 
     return $cleanAttributes; 
    } 

    public function save() { 
     return(isset($this->id)) ? $this->update() : $this->create(); 
    } 

    protected function create() { 
     global $database; 
     //$calledClass = get_called_class(); 
     //$class = new $calledClass; 
     $attributes = $this->cleanAttributes();  
     $sql = "INSERT INTO ".static::$tableName." ("; 
     $sql .= join(", ", array_keys($attributes)); 
     $sql .= ") VALUES ('"; 
     $sql .= join("', '", array_keys($attributes)); 
     $sql .= "')"; 
     if($database->query($sql)) { 
      $this->id = $database->insert_id(); 
      return true; 
     }else { 
      return false; 
     } 
    } 
} 

<?php 
require_once('database.php'); 

class User extends DatabaseObject { 

    protected static $tableName = 'users'; 
    protected static $tableID = 'id'; 

    public $id; 
    public $username; 
    public $password; 
    public $firstname; 
    public $lastname; 



} 

?> 

、ここではdatabaseobject.phpそのものだが、 .phpを作成してDBに格納します。今私の価値の価値として、私は値usernameを持っている$ usernameのように属性自体を得ています。

どこが間違っていますか?私はOOP PHPに初心者です...:P

+0

あなたの助けを借りて今日私の問題を解決し、私が間違っていた場所を理解することができました。おそらくこの時間に私を救うことができます... – mrGott

+1

あなたの他の投稿と同様にひどいデザインに見えます。重複を作成せず、静的変数とインスタンス変数について学んでください。 – Macmade

+1

ひどい質問のタイトルも。 –

答えて

1

問題は、クエリにある:あなたのフィールド名自分の価値観の両方としてarray_keys()を使用している

$sql = "INSERT INTO ".static::$tableName." ("; 
    $sql .= join(", ", array_keys($attributes)); 
    $sql .= ") VALUES ('"; 
    $sql .= join("', '", array_keys($attributes)); 
    $sql .= "')"; 

注意。代わりにarray_values()を値として使用してください。