class connector {
private static $db;
function __construct() {
$this->db = null;
$this->connect();
}
private function connect() {
$this->db = new PDO('mysql:host=localhost;dbname=database;charset=utf8','user','pass');
}
public static function getDB() {
if (!isset(self::$db)) {
self::$db = new connector();
}
return self::$db;
}
EDITED
// this was my original function, I had reduced it for less space. my deepest regrets, I won't do it again.
public function getValue($sql,$val='') {
if ($val != '') {
$data = $this->db->prepare($sql);
$data->execute($val);
return $data->fetch(PDO::FETCH_COLUMN);
}
else {
return $this->db->query($sql)->fetch(PDO::FETCH_COLUMN);
}
使用这个类我可以使用自定义函数轻松地从任何地方使用pdo数据库对象。
$db = connector::getDB();
// var_dump()
db:object(connector)#1 (1) {
["db":"connector":private]=>
object(PDO)#2 (0) {
}
}
$db->getValue('SELECT foo FROM bar'); //succeeds
$db->query('SELECT foo FROM bar'));
// throws
// Fatal error: Call to undefined method connector::query()
如果我返回实际的对象参数而不是整个对象:
return self::$db->db;
db:object(PDO)#2 (0) {
}
查询交换角色
$db->getValue('SELECT foo FROM bar');
// throws
// Fatal error: Call to undefined method connector::getValue()
$db->query('SELECT foo FROM bar')); //succeeds
如何同时使用同一个对象,在同一个脚本中有效地使用$db->query()
和$db->getValue()
。
答案 0 :(得分:2)
首先,您的getValue()
方法缺少一项基本功能 - 支持预备语句。如果没有能力运行动态查询,它的价值几乎为零。
其次,如果你还在使用单例 - 那么就不需要额外的方法来获取实例 - 现在单身人士可以自己完成它。
What about this one?我写这篇文章是为了让PDO的使用不那么冗长,利用整齐的方法链接。 DB
静态类已经一个PDO实例,无需使用额外调用实例化它。因此,您可以在任何地方运行任何PDO命令:
DB::query('SELECT foo FROM bar LIMIT 1')->fetchColumn();
它比您的空间少得多,但至少它可以让您访问完整的PDO语法,包括对预准备语句的支持
DB::prepare('SELECT foo FROM bar WHERE id=?')->execite([$id])->fetchColumn();
以及所有其他获取方法
DB::query('SELECT foo FROM bar')->fetchAll(PDO::FETCH_COLUMN);
答案 1 :(得分:1)
对$db
单例的静态实例和私有connector
成员变量重用变量PDO
会让人感到困惑。不要回避你的单例方法,也许尝试使用一些更好的变量名,例如
class connector {
private static $instance = null;
private $db;
private function __construct() {
$this->db = new PDO('mysql:host=localhost;dbname=database;charset=utf8','user','pass', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
}
private function __clone() {} // because singletons should not be cloneable
public static function getInstance() {
if (self::$instance == null) {
self::$instance = new self();
}
return self::$instance;
}
/**
* @return PDO
*/
public function getDb() {
return $this->db;
}
public function getValue($sql) {
// as is
}
}
现在,如果您必须运行PDO::query
,则可以通过getDb
方法执行此操作...
$db = connector::getInstance();
$db->getValue('SELECT foo FROM bar');
$db->getDb()->query('SELECT foo FROM bar');