Можно ли поддерживать соединения PDO между классами? - PullRequest
6 голосов
/ 27 января 2012

Я пытаюсь создать простую библиотеку запросов и использую PDO для доступа к базе данных.

Допустим, у меня есть два следующих класса:

class FirstClass {
    var $dbh;

    function __construct($host,$dbname,$user,$pw) {
        $this->dbh = new PDO ("mysql:host=$host;dbname=$dbname",$user,$pw);
    }

    function use_second($foo) {
        return new SecondClass ($foo,$this->dbh);
    }
}

class SecondClass {
    function __construct($foo, $dbh) {
        $sth = $dbh->prepare('SELECT * FROM atable WHERE bar = :foo');
        $sth = $sth->execute(array('foo'=>$foo));
        // do something with the query
    }
}

Это правильный способ использовать одно и то же соединение PDO между классами? - Поскольку у меня, кажется, есть некоторые проблемы с этим, например, если я var_dump подключусь ко второму классу, я получу:

object(PDO)#2 (0) { }

Конечно, это не так?

Также, если я запускаю запрос на выборку, а затем выкидываю переменную $sth, я просто получаю:

bool(true)

Это потому, что я неправильно обрабатываю соединение? - Если так, как я могу правильно использовать одну и ту же связь между классами?

Ответы [ 3 ]

3 голосов
/ 27 января 2012

Это происходит, потому что вы перезаписали $sth, который был вашим утверждением, но теперь является логическим:

class SecondClass {
    function __construct($foo, $dbh) {
        // returns PDOStatement:
        $sth = $dbh->prepare('SELECT * FROM atable WHERE bar = :foo');
        // returns boolean:
        $sth = $sth->execute(array('foo'=>$foo));
        // do something with the query
    }
}

Чтобы исправить это, просто не перезаписывайте $sth, чтобы вы могли получить из него результаты:

class SecondClass {
    function __construct($foo, $dbh) {
        // returns PDOStatement:
        $sth = $dbh->prepare('SELECT * FROM atable WHERE bar = :foo');
        // returns boolean:
        $success = $sth->execute(array('foo'=>$foo));
        // do something with the query
        if ($success) {
            // do something with $sth->fetchAll() or $sth->fetch(), or anything
            $all_the_results = $sth->fetchAll();
        };
    }
}
0 голосов
/ 27 января 2012

В вашем случае я бы просто попросил (спрашивая, я имею в виду, заданы ли предварительные требования) готовый объект PDO.

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

Таким образом, вы получаете более четкий подход к тому, что нужно вашему объекту (для этого не требуется имя пользователя / пароль и т. Д., Требуется подключение к базе данных!)

Это также устраняет необходимость в классе абстракции (FirstClass), так как вы можете перейти непосредственно ко второму классу.

0 голосов
/ 27 января 2012

Ознакомьтесь с документацией для PDOStatement :: execute . Возвращает логическое значение. Тот факт, что sth заканчивается на true, означает, что запрос выполнен успешно.

Ваш дизайн немного шаткий, потому что вы создаете объекты не заводскими методами для других объектов, что может сбивать с толку. В идеале, все ваши объекты будут созданы в начале выполнения контроллера и добавлены в другие объекты, которые в них нуждаются (например, объект PDO будет создан за пределами FirstClass::__construct, и вы получите что-то вроде __construct(PDO $db) вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...