Можно ли поддерживать соединения 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), так как вы можете перейти непосредственно ко второму классу.