0

データベースから各ユーザーをクラス属性として割り当てて表示する方法がわかりません。見てください。たとえば、データベースに次のテーブルがあります。

+----+----------+------------+-----------+
| id | username | first_name | last_name |
+----+----------+------------+-----------+
|  1 | guu      |  Guu       | GuuShtein |
|  3 | user1    |  Allan     | Last      |
|  4 | Donny    |  Name      | Last Name |
+----+----------+------------+-----------+

そして、ここにクラスがあります:

class users {

public $db;
private $id;
private $username;
private $first_name;
private $last_name;

public function __construct($db) {
    $this->db=$db;
}

private function find_by_id($id) {
   $record = $this->db->query('SELECT * FROM users WHERE id=' . $id .' LIMIT 1')->fetch(PDO::FETCH_ASSOC);     
   foreach ($record as $atribute => $value) {
       $this->$atribute = $value;
   } 
}

public function user_nfo($id){
    $this->find_by_id($id);

    $user_nfo = "User id: " . $this->id . "<br />";
    $user_nfo .= "Username: " . $this->username . "<br />";
    $user_nfo .= "User full name: " . $this->first_name . " " . $this->last_name . "<br />";       
    return $user_nfo;
}
}

$users = new mysql_a($db);
echo $users->user_nfo(1);

私の質問は、すべてのユーザーを 1 人ずつ表示するメソッドの書き方です。私の user_nfo 関数のようなものを意味しますが、すべてのレコードについてですか? PDOfetchAll で "foreach" ループを試しましたが、属性をオーバーライドして最後のレコードのみを表示するだけです。

4

2 に答える 2

2

必要なのは、以下のように、必要なすべてのプロパティを持つ user という新しいオブジェクトです。

<?php

try {
    $db = new PDO('mysql:host=localhost;dbname=sub_db;charset=UTF-8', DB_USER, DB_PASS);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
} catch (PDOException $ex) {
    echo "error";
}

class users {

    public $db;

    public function __construct($db) {
        $this->db=$db;
    }

    /**
     * Fetch all users and return an array of their mapped objects
     *
     * @author Daniel Noel-Davies
     *
     * @return array
     */
    public function getAllUsers () {
        $users   = array();

        // Grab an array of each user
        $users = $this->db->query('SELECT * FROM users')->fetch(PDO::FETCH_ASSOC);

        // Loop through the users
        foreach( $users as $index => $user ) {
            // Replace each row with an object of that user (keeps memory down)
            $users[$index] = new User($user);
        }

        // return our array containing an object of each user
        return $users;
    }

    public function count_row(){
        $count = $this->db->query('SELECT COUNT(*) FROM users')->fetch(PDO::FETCH_ASSOC);
        return $count['COUNT(*)'];
    }

    public function find_by_id($row) { 
       $record = $this->db->query('SELECT * FROM users LIMIT 1 OFFSET ' . $row)->fetch(PDO::FETCH_ASSOC);
       return $record;
    }   
 }


class user {

    public $id;
    public $username;
    public $first_name;
    public $last_name;

    public function __construct($record){    
           foreach ($record as $atribute => $value) {
               $this->$atribute = $value;
           }
    }
}

// Initiate our users class
$objUsers = new Users;

// Fetch all the users
$users = $objUsers->getAllUsers();

// Loop through them all
foreach ($users as $user) {
    // Using Printf keeps things neater, means you're template is tidier.
    printf(
        '%s<br />
        %s<br />
        %s<br />
        %s<br />',

        $user->id,
        $user->username,
        $user->first_name,
        $user->last_name
    );
}
?>

これは役に立ちますか?

于 2012-10-19T09:33:02.523 に答える
0

「NoelDavies」の回答のおかげで、これは私がうまく機能させることができた完全なコードです。誰かが同じ問題を抱えている場合:

<?php

try {
$db = new PDO('mysql:host=localhost;dbname=sub_db;charset=UTF-8', DB_USER, DB_PASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
} catch (PDOException $ex) {
    echo "error";
}

class mysql_a {

    public $db;

    public function __construct($db) {
        $this->db=$db;
    }

    public function count_row(){
        $count = $this->db->query('SELECT COUNT(*) FROM users')->fetch(PDO::FETCH_ASSOC);
        return $count['COUNT(*)'];
    }

    public function find_by_id($row) { 
       $record = $this->db->query('SELECT * FROM users LIMIT 1 OFFSET ' . $row)->fetch(PDO::FETCH_ASSOC);
       return $record;
    }   
 }


class user {

    public $id;
    public $username;
    public $first_name;
    public $last_name;

    public function __construct($record){    
           foreach ($record as $atribute => $value) {
               $this->$atribute = $value;
           }
    }
}


$users = new mysql_a($db);

for ($i = 0; $i < $users->count_row(); $i++) {
    $user = new user($users->find_by_id($i));
    echo $user->id         . "<br />";
    echo $user->username   . "<br />";
    echo $user->first_name . "<br />";
    echo $user->last_name  . "<hr />";
}
?>

db の行をカウントし、それらを 1 つずつ引き出して出力します。もっと短くてエレガントな方法があると確信していますが、今はうまくいきます;] 再び「NoelDavies」に感謝します。

于 2012-10-19T21:18:05.837 に答える