Можно ли поддерживать соединения PDO между классами?

Я пытаюсь сделать простую библиотеку запросов, и я использую 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) { }

конечно, это неправильно?

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

bool(true)

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

3 ответов


это происходит, потому что вы перезаписываете $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();
        };
    }
}

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

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


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

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

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

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