如何使用MySQL数据库中的记录动态分配类属性?

时间:2012-09-30 15:08:18

标签: php dynamic properties

<?php

class User {

// properties

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

Above(id,username ...,last_name)是MySQL数据库中 users 表的列。使用id从用户表中获取(我正在使用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_arr包含id,username,password,first_name和last_name的关联数组。

注意:此处pdo_query_fetch()是用户定义的函数。

4 个答案:

答案 0 :(得分:4)

您正在使用PDO,它与PDO::FETCH_INTO

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

请参阅PDO::queryDocs

可能是你的“自己的”数据库类“拥有”你,因为你开始过早地封装了东西。这可能需要您向$dbh类添加一个额外的函数和/或您可能想要开始重构。

答案 1 :(得分:2)

我建议在您的用户类中添加一个方法:

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);

答案 2 :(得分: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];
}

答案 3 :(得分:1)

最好使用PDOStatement::fetchObjectdocs)或PDO::query PDO::FETCH_INTO标记(docs),但如果无法做到这一点一些原因:

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

您也可以使用__set扩展User类:

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

将在每个不可访问的属性调用(私有或未定义)

上调用它