Взаимодействие двух объектов в php с использованием PDO - PullRequest
2 голосов
/ 12 декабря 2011

Я пытаюсь передать значения, собранные из PDO в объекте Datamanager, в объект User.

  1. Пользовательский объект изначально вызывается с запросом на получение пользователя с идентификатором.
  2. Пользователь создает соединение с менеджером данных в конструкции.
  3. Конструкция datamanager вызывает соединение PDO.
  4. Запуск пользовательского выбора создает запрос к преформе в базе данных.
  5. Затем запрос передается менеджеру данных, который обрабатывает запрос и возвращает результаты.
  6. Этот результат должен быть передан / установлен для объекта пользователя.

Я не уверен, что это неправильный шаг 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);

Я запускаю первоначальную настройку пользователя, затем пытаюсь загрузить ее со значениями, полученными в диспетчере данных. Я понимаю, что PDO - это сам объект, но я все еще пытаюсь создать общее взаимодействие, потому что этот код будет расширен, чтобы позволить более чем пользовательскому объекту получать доступ к базе данных.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Вот моя версия.

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().

0 голосов
/ 12 декабря 2011

Вам не хватает пары закрывающих}. Это просто ошибка копирования и вставки?

Кроме того, не должна ли эта строка:

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

быть изменено на:

$results = $this->dbc->runQuery($query, $obj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...