1
<?php

class User {

// properties

public $table = 'users';
public $id;
public $username ;
public $password ; 
public $first_name ;
public $last_name ;

上記 (id、username...、last_name) は、MySQL データベースのusersテーブルの列です。idを使用してusersテーブルから特定のレコードを取得した後(私はPDOを使用しています)、すべてのレコードをそれぞれのプロパティに動的に割り当てるにはどうすればよいですか(関数は、使用可能なすべてのプロパティを検索し、結果の連想配列でそれらのプロパティを検索するのに役立ちます次に、それらの特定の値をそれぞれのプロパティに割り当てます)?

// methods

public function set_user($id){
    global $dbh;
    // sql
    $sql = "SELECT * FROM $this->table WHERE id = {$id}";
    // return result array
    $result_arr = $dbh->pdo_query_fetch($sql);
}

$result_arrID、ユーザー名、パスワード、first_name、および last_name の連想配列が含まれます。

注 :pdo_query_fetch()これはユーザー定義関数です。

4

4 に答える 4

4

あなたはPDOを使用しています、それはそれを持っていますPDO::FETCH_INTO:

PDO::query ( string $statement , int $PDO::FETCH_INTO , object $object )

PDO::queryドキュメントを参照してください。

物事をカプセル化するのが早すぎたため、「独自の」データベースクラスがあなたを「所有」している可能性があります。これには、クラスに追加の関数を追加する必要がある場合$dbhや、リファクタリングを開始する必要がある場合があります。

于 2012-09-30T15:19:33.070 に答える
3

ユーザー クラスにメソッドを追加することをお勧めします。

public function Assign( $vars = array( ) )
{
    if( is_object( $vars )) {
      $this->Assign( get_object_vars( $vars ));
      return;
    }

    foreach ( $vars as $key => $value )
      if ( property_exists( $this, $key ) )
        $this->$key = $value;
}

このメソッドを使用すると、別のオブジェクトからプロパティを設定したり、配列を既存のオブジェクトに設定したりできます。

次のように使用できます。

myUser = new User();
myUser->Assign($result_arr);
于 2012-09-30T15:18:08.407 に答える
1

使用できますget_object_vars

$properties = get_object_vars($this);
foreach ($properties as $property => $property_value) {
  if (isset($result_arr[$property])) 
    $this->$property = $result_arr[$property];
}
于 2012-09-30T15:18:28.150 に答える
1

PDOStatement::fetchObjectdocs)またはフラグPDO::query付き( docs )を使用するのが最善ですが、何らかの理由でそれを行う方法がない場合:PDO::FETCH_INTO

foreach ($result_arr as $key => $value) {
    if (property_exists($user, $key)) {
       $user->$key = $value;
    }
}

また、 __set で User クラスを拡張することもできます:

public function __set($key, $value) {
    // do nothing
}

アクセスできないプロパティ呼び出し (プライベートまたは未定義) ごとに呼び出されます。

于 2012-09-30T15:22:29.387 に答える