我有一些类可以执行一些MySQL查询和准备好的语句。但是,我不知道如何在这些类中合并我的PDO对象。例如,我想做这样的事情:
<?php $dbh = new PDO(...); class Foo extends PDO { public $dbh; public function bar() { $this->dbh->prepare('SELECT * FROM table'); $this->dbh->execute(); } } ?>
不幸的是,它不起作用。有人可以建议一种优雅的方法吗?谢谢你的时间。抱歉,我是新手,如果您不清楚任何事情,请留下任何评论,我会尽力答复!
您可以在实现单例模式的类中实例化与数据库的连接。连接将完成一次,所有其他对象/脚本都可以轻松访问该类。
在下面的示例中,我使用称为“ Core”的类;
class Core { public $dbh; // handle of the db connexion private static $instance; private function __construct() { // building data source name from config $dsn = 'pgsql:host=' . Config::read('db.host') . ';dbname=' . Config::read('db.basename') . ';port=' . Config::read('db.port') . ';connect_timeout=15'; // getting DB user from config $user = Config::read('db.user'); // getting DB password from config $password = Config::read('db.password'); $this->dbh = new PDO($dsn, $user, $password); } public static function getInstance() { if (!isset(self::$instance)) { $object = __CLASS__; self::$instance = new $object; } return self::$instance; } // others global functions }
该类从名为“ Config”的静态类中获取参数,您可以在其中存储配置:
<?php class Config { static $confArray; public static function read($name) { return self::$confArray[$name]; } public static function write($name, $value) { self::$confArray[$name] = $value; } } // db Config::write('db.host', '127.0.0.1'); Config::write('db.port', '5432'); Config::write('db.basename', 'mydb'); Config::write('db.user', 'myuser'); Config::write('db.password', 'mypassword');
在所有脚本/对象中,您只需要获取Core的实例,然后查询数据库
$sql = "select login, email from users where id = :id"; try { $core = Core::getInstance(); $stmt = $core->dbh->prepare($sql); $stmt->bindParam(':id', $this->id, PDO::PARAM_INT); if ($stmt->execute()) { $o = $stmt->fetch(PDO::FETCH_OBJ); // blablabla....
如果您需要有关单例的更多信息,请查看PHP文档http://php.net/manual/en/language.oop5.patterns.php