php 在课堂上使用 PDO
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2047264/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Use of PDO in classes
提问by axsuul
I have a few classes that perform some MySQL queries and prepared statements. However, I am lost in how to incorporate my PDO object within those classes. For example, I want to do something like this:
我有几个类可以执行一些 MySQL 查询和准备好的语句。但是,我不知道如何将我的 PDO 对象合并到这些类中。例如,我想做这样的事情:
<?php
$dbh = new PDO(...);
class Foo extends PDO {
public $dbh;
public function bar() {
$this->dbh->prepare('SELECT * FROM table');
$this->dbh->execute();
}
}
?>
Unfortunately, it doesn't work. Can anyone suggest an elegant way to do this? Thanks for your time. Sorry I'm new to this, please leave any comments if you are unclear about anything and I'll do my best to respond!
不幸的是,它不起作用。谁能建议一种优雅的方式来做到这一点?谢谢你的时间。抱歉,我是新手,如果您有任何不清楚的地方,请留下任何评论,我会尽力回复!
回答by Guillaume Boschini
You can instantiate your connection to the database in a class that implement the singleton pattern. The connection will be done once and this class will be easily accessible by all of your other objects / scripts.
您可以在实现单例模式的类中实例化与数据库的连接。连接将完成一次,您的所有其他对象/脚本都可以轻松访问此类。
i use a class called "Core" in the following example;
我在下面的例子中使用了一个名为“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
}
this class take parameters from a static class called "Config" where you can store your configuration:
此类从名为“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');
in all your scripts / objects you just have to get the instance of Core and then query the DB
在所有脚本/对象中,您只需要获取 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....
If you need more information about singleton look at the PHP doc http://php.net/manual/en/language.oop5.patterns.php
如果您需要有关单身人士的更多信息,请查看 PHP 文档http://php.net/manual/en/language.oop5.patterns.php
回答by BradChesney79
Here is a mostly complete working cut & paste example of Guillaume Boschini's answer above.
这是上面Guillaume Boschini回答的一个几乎完整的工作剪切和粘贴示例。
A populated DB table (MySQL):
填充的数据库表 (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;
In /DBLibrary/pdocore.php:
在 /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
}
?>
In /objectsLibrary/SYS_UserAddress.php:
在 /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>';
}
?>
The post above really helped me. This post I am making now would have gotten me to where I wanted to be faster. That is all. If anything isn't right, I'll be around to fix it.
上面的帖子真的帮助了我。我现在正在做的这篇文章会让我达到我想要更快的地方。就这些。如果有什么不对的,我会在附近修复它。
回答by Alix Axel
$dbhisn't within the scope of Foo, do this instead:
$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();
}
}
Also, Foodoesn't need to extend PDO.
此外,Foo不需要扩展PDO.
回答by ulas korpe
i found a better solution : when you have a PDO connection outside of your class and cant use that connection inside the class , send that PDO object to the constructor as a parameter
我找到了一个更好的解决方案:当您在类外有 PDO 连接并且不能在类内使用该连接时,将该 PDO 对象作为参数发送到构造函数
///thats my pdo connection
///那是我的 pdo 连接
$pdo_object = new PDO('mysql:host=localhost;dbname=blabla','user','pw');
/// im creating the instance of that class as an obj
/// 我正在创建该类的实例作为 obj
$dataObj=new class_name($pdo_obj);
///// inside the class :::simplified
///// 在类中 :::simplified
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

