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 从用户表中获取(我正在使用 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

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带有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
}

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

于 2012-09-30T15:22:29.387 回答