在课堂上使用PDO

我有几个类执行一些MySQL查询和准备语句。 但是,我迷失在如何将PDO对象包含在这些类中。 例如,我想要做这样的事情:

<?php $dbh = new PDO(...); class Foo extends PDO { public $dbh; public function bar() { $this->dbh->prepare('SELECT * FROM table'); $this->dbh->execute(); } } ?> 

不幸的是,这是行不通的。 任何人都可以build议一个优雅的方式做到这一点 谢谢你的时间。 抱歉,我是新手,如果您对任何事情不清楚,请留下您的意见,我会尽我所能来回应!

您可以在实现单例模式的类中实例化与数据库的连接。 连接将被完成一次,这个类将可以很容易地被所有其他的对象/脚本访问。

在下面的例子中,我使用了一个名为“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”的静态类获取参数,你可以在其中存储你的configuration:

 <?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.... 

如果你需要更多关于singleton的信息,请看PHP文档http://php.net/manual/en/language.oop5.patterns.php

下面是Guillaume Boschini上面答案的一个大体完整的工作剪切和粘贴示例。

填充的数据库表(MySQL):

 CREATE TABLE `useraddress` ( `addressid` int(10) unsigned NOT NULL AUTO_INCREMENT, `userid` int(10) unsigned NOT NULL, `addresstitle` char(100) NOT NULL, `streetaddressa` char(100) NOT NULL, `streetaddressb` char(100) DEFAULT NULL, `unit` char(50) DEFAULT NULL, `city` char(50) NOT NULL, `state` char(2) NOT NULL, `zip` int(5) NOT NULL, `zipplusfour` int(4) DEFAULT NULL, PRIMARY KEY (`addressid`), KEY `userid` (`userid`), CONSTRAINT `useraddress_fk_1` FOREIGN KEY (`userid`) REFERENCES `user` (`userid`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

在/DBLibrary/pdocore.php中:

 <?php Config::write('db.host', 'localhost'); Config::write('db.port', '3306'); Config::write('db.basename', 'DBName'); Config::write('db.user', 'DBUser'); Config::write('db.password', 'DBPassword'); class Config { static $confArray; public static function read($name) { return self::$confArray[$name]; } public static function write($name, $value) { self::$confArray[$name] = $value; } } class Core { public $dbh; // handle of the db connection private static $instance; private function __construct() { // building data source name from config $dsn = 'mysql: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); $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } public static function getInstance() { if (!isset(self::$instance)) { $object = __CLASS__; self::$instance = new $object; } return self::$instance; } // others global functions } ?> 

在/objectsLibrary/SYS_UserAddress.php中:

 <?php define('k_uaddress_addressid','addressid'); define('k_uaddress_userid','userid'); define('k_uaddress_addresstitle','addresstitle'); define('k_uaddress_addressa','streetaddressa'); define('k_uaddress_addressb','streetaddressb'); define('k_uaddress_unit','unit'); define('k_uaddress_city','city'); define('k_uaddress_state','state'); define('k_uaddress_zip','zip'); define('k_uaddress_zipplusfour','zipplusfour'); require_once '../DBLibrary/pdocore.php'; class SYS_UserAddress { public $addressid; public $userid; public $addresstitle; public $addressa; public $addressb; public $unit; public $city; public $state; public $zip; public $zipplusfour; public function SYS_UserAddressByAddressId($_addressid) { $returnValue=FALSE; $query='select * from useraddress where ' . k_uaddress_addressid . '=:addressid'; try { $pdoCore = Core::getInstance(); $pdoObject = $pdoCore->dbh->prepare($query); $queryArray = array(':addressid'=>$_addressid); if ($pdoObject->execute($queryArray)) { $pdoObject->setFetchMode(PDO::FETCH_ASSOC);; while ($addressrow = $pdoObject->fetch()) { $this->addressid=$addressrow[k_uaddress_addressid]; $this->userid=$addressrow[k_uaddress_userid]; $this->addresstitle=$addressrow[k_uaddress_addresstitle]; $this->addressa=$addressrow[k_uaddress_addressa]; $this->addressb=$addressrow[k_uaddress_addressb]; $this->unit=$addressrow[k_uaddress_unit]; $this->city=$addressrow[k_uaddress_city]; $this->zip=$addressrow[k_uaddress_zip]; $this->zipplusfour=$addressrow[k_uaddress_zipplusfour]; } $returnValue=TRUE; } } catch(PDOException $pe) { trigger_error('Could not connect to MySQL database. ' . $pe->getMessage() , E_USER_ERROR); } return $returnValue; } } $test=1; $testAddressId=2; if($test>0) { $testAddress = new SYS_UserAddress(); $testAddress->SYS_UserAddressByAddressId($testAddressId); echo '<pre>'; echo print_r($testAddress); echo '</pre>'; } ?> 

上面的post真的帮了我。 现在我正在做的这个职位会让我到我想要更快的地方。 就这些。 如果有什么不对,我会解决它。

$dbh不在Foo的范围内,请这样做:

 class Foo /*extends PDO*/ { public $dbh; public function __construct() { $dbh = new PDO(/*...*/); } public function bar() { $this->dbh->prepare('SELECT * FROM table'); return $this->dbh->execute(); } } 

另外, Foo不需要扩展PDO

我发现了一个更好的解决scheme:当你有一个PDO连接在你的类之外,并且不能在类中使用这个连接时,把这个PDO对象作为参数发送给构造函数

///那是我的pdo连接

 $pdo_object = new PDO('mysql:host=localhost;dbname=blabla','user','pw'); 

///即时通讯创build该类的实例作为一个obj

 $dataObj=new class_name($pdo_obj); 

/////在课堂内:::简化

 class class_name{ private $handler;//// this is what i use for PDO connection inside the class public function __construct($connection_name){ if(!empty($connection_name)){ $this->handler=$connection_name; ///its a great thing that holy php doesnt care much about variant types. any variant is able to carry any object (like PDO obj) }else{ throw new Exception("cant connect bla bla..."); } }/////contruct fx ////how i use that pdo connection which is implamented to a local var called handler with any sql query is : $dataSet= $this->handler->query("SELECT * FROM users WHERE ...."); }////endof class