使用PDO在php中的两个对象之间的交互

时间:2011-12-12 00:02:40

标签: php oop pdo

我正在尝试将从Datamanager对象中的PDO收集的值传递给User对象。

  1. 初始调用用户对象,并请求检索具有ID的用户。
  2. 用户在构造中创建与datamanager的连接。
  3. datamanager构造调用PDO连接。
  4. 运行用户选择会创建要在数据库上执行的查询。
  5. 然后将查询传递给处理查询并返回结果的数据管理器。
  6. 此结果应传递/设置为用户对象。
  7. 我不确定步骤5或6是错误的。

    class Datamanager {
    public function __construct() {
        try {
            $this->dbh = new PDO("mysql:host=$this->hostName;dbname=$this->dbName", $this->dbUser, $this->dbPassword);
        } catch(PDOException $e) {
            echo $e->getMessage();
        }
    }
    public function runQuery($query, $obj){
        try {
            $STH = $this->dbh->query($query);
            $STH->setFetchMode(PDO::FETCH_INTO, $obj);
        } catch(PDOException $e) {
            echo $e->getMessage();
        }
        return($obj);
    }
    class User {
    public $user_id;
    public $user_name;
    public $user_password;
    public $session_id;
    private $dbc;
    
    public function __construct() {
        $this->dbc = new Datamanager();
    }
    
    function selectUser ($userID, $obj) {
        $query = 'SELECT user_id, user_name, user_password, session_id FROM users';
        $results = $this->dbc->runQuery($query, $this);
    }
    
    $userID = "1";
    
    $test = new User;
    
    $test->selectUser($userID, $test);
    

    我运行用户的初始设置,然后尝试使用datamanager中检索到的值加载它。我知道PDO本身就是一个对象,但我仍然试图创建一个通用的交互,因为这个代码将被扩展,以允许更多的用户对象访问数据库。

2 个答案:

答案 0 :(得分:2)

这是我的版本。

class Datamanager {

    public $hostName = 'localhost';
    public $dbName = 'stackoverflow';
    public $dbUser = 'xxx';
    public $dbPassword = 'xxx';

    public function __construct() {
        try {
            $this->dbh = new PDO("mysql:host=$this->hostName;dbname=$this->dbName", $this->dbUser, $this->dbPassword);
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }

    public function runQuery($query, $obj) {
        try {
            $STH = $this->dbh->prepare($query);
            $STH->bindParam(':id', $obj->user_id);

            $STH->setFetchMode(PDO::FETCH_INTO, $obj);
            $STH->execute();
            $STH->fetch();
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
        return $obj;
    }

}

class User {

    public $user_id;
    public $user_name;
    public $user_password;
    public $session_id;
    private $dbc;

    public function __construct() {
        $this->dbc = new Datamanager();
    }

    function selectUser($userID, $obj) {
        $this->user_id = $userID;
        $query = 'SELECT user_id, user_name, user_password, session_id FROM users WHERE user_id=:id';
        $results = $this->dbc->runQuery($query, $this);
    }

}

$userID = "1";
$test = new User;

$test->selectUser($userID, $test);

var_dump($test);

我在您的查询中添加了WHERE user_id=:id,并将pdo更改为使用prepare()

答案 1 :(得分:0)

你错过了几个关闭}。这只是一个复制和粘贴错误吗?

此外,不应该这一行:

$results = $this->dbc->runQuery($query, $this);

改为:

$results = $this->dbc->runQuery($query, $obj);