在其他PHP类中使用PDO数据库类
我有一个使用PDO的数据库类。下面是一个部分示例:在其他PHP类中使用PDO数据库类,php,Php,我有一个使用PDO的数据库类。下面是一个部分示例: class db { private $host; private $username; private $password; private $con; private $pdo; public function __construct( $database = "dnname" ) { $this->host = "localhost"; $this->username = "username";
class db {
private $host;
private $username;
private $password;
private $con;
private $pdo;
public function __construct( $database = "dnname" )
{
$this->host = "localhost";
$this->username = "username";
$this->password = "pass";
$conStr = "host={$this->host};dbname={$database}";
try {
$this->pdo = new PDO( "mysql:$conStr", $this->username, $this->password );
$this->pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
catch( PDOException $e ) {
echo "error ". $e->getMessage();
}
}
public function fetch_single_row($sql, $data)
{
if( $data !== null )
$data = array_values( $data ); // Incase it's an associative array
$sel = $this->pdo->prepare( $sql );
$sel->execute( $data );
$sel->setFetchMode( PDO::FETCH_OBJ );
$obj = $sel->fetch();
return $obj;
}
我想使用这个类及其函数,它比我在其他类中包含的要多
我已经尝试了很多不同的方法,但到目前为止唯一有效的方法是在每个新类中启动一个新的db实例,我认为这是一个糟糕的做法。例如:
class cms {
function cms(){
$this->db = new db();
}
function is_admin($id) {
if($this->db->fetch_single_row("SELECT id FROM user WHERE id = ? LIMIT 1", array($id))){
return true;
} else {
return false;
}
}
在我的index.php中,我包含并使用了以下类:
include("db.class.php");
include("cms.class.php");
$cms = new cms();
if($cms->is_admin($id)){
//code here
}
实现这一点的正确方法是什么?看看Singleton设计模式,它对DB类非常有用 我曾经用过一段时间这样的课
abstract class DB
{
protected static $instance;
protected $db;
protected static $host = 'host';
protected static $user = 'user';
protected static $pass = 'pass';
protected static $database;
public static function getInstance()
{
if (!isset(self::$instance)) self::$instance = new static();
return self::$instance;
}
protected function __construct()
{
$this->db = new PDO(sprintf('mysql:host=%s;dbname=%s', static::$host, static::$database), static::$user, static::$pass);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
public static function db()
{
return static::getInstance()->db;
}
public function fetch_single_row($sql, $data)
{
if( $data !== null )
$data = array_values( $data ); // Incase it's an associative array
$sel = self::db()->prepare( $sql );
$sel->execute( $data );
$sel->setFetchMode( PDO::FETCH_OBJ );
$obj = $sel->fetch();
return $obj;
}
}
然后,我将为需要连接到的每个不同数据库扩展该类
class Main extends DB
{
protected static $database = 'db';
}
然后可以像这样使用这个类
$db = Main::getInstance();
$obj = $db->fetch_single_row($sql, $data);
看看Singleton设计模式,它非常适合DB类 我曾经用过一段时间这样的课
abstract class DB
{
protected static $instance;
protected $db;
protected static $host = 'host';
protected static $user = 'user';
protected static $pass = 'pass';
protected static $database;
public static function getInstance()
{
if (!isset(self::$instance)) self::$instance = new static();
return self::$instance;
}
protected function __construct()
{
$this->db = new PDO(sprintf('mysql:host=%s;dbname=%s', static::$host, static::$database), static::$user, static::$pass);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
public static function db()
{
return static::getInstance()->db;
}
public function fetch_single_row($sql, $data)
{
if( $data !== null )
$data = array_values( $data ); // Incase it's an associative array
$sel = self::db()->prepare( $sql );
$sel->execute( $data );
$sel->setFetchMode( PDO::FETCH_OBJ );
$obj = $sel->fetch();
return $obj;
}
}
然后,我将为需要连接到的每个不同数据库扩展该类
class Main extends DB
{
protected static $database = 'db';
}
然后可以像这样使用这个类
$db = Main::getInstance();
$obj = $db->fetch_single_row($sql, $data);
db类的变量应该是静态的吗?它将缓解大多数(如果不是全部的话)与多个实例化相关的性能问题。事实上,您可以不实例化db类的新实例,而是使用类的静态函数。因此,在定义类之后显式调用伪构造函数将为您完成这项工作。但我同意,构造不是静态的。很抱歉,我不确定你的意思。您的意思是将我的db类中的所有函数都更改为静态的,除了_构造之外?您的db类的变量应该是静态的吗?它将缓解大多数(如果不是全部的话)与多个实例化相关的性能问题。事实上,您可以不实例化db类的新实例,而是使用类的静态函数。因此,在定义类之后显式调用伪构造函数将为您完成这项工作。但我同意,构造不是静态的。很抱歉,我不确定你的意思。您的意思是将my db类中的所有函数都更改为static,除了_构造吗?每当您需要应用程序中的数据库连接实例时,只需调用$db=Main::getInstance;继续使用$db执行查询这行代码似乎有问题:if!issetself::$instance self::$instance=new static;我得到一个致命错误:当试图调用$this->db=db::getInstance时,从上下文“cms”调用受保护的方法db::getInstance;在我的cms类中,您使用的是哪个版本的PHP?static关键字是后期静态绑定,在PHP5.3+中可用。因此,如果您使用的是较旧的版本,那么快速修复方法是不将其指定为抽象类抱歉,将getInstance函数公开。每当您需要应用程序中的数据库连接实例时,只要调用$db=Main::getInstance,我就会更新代码;继续使用$db执行查询这行代码似乎有问题:if!issetself::$instance self::$instance=new static;我得到一个致命错误:当试图调用$this->db=db::getInstance时,从上下文“cms”调用受保护的方法db::getInstance;在我的cms类中,您使用的是哪个版本的PHP?static关键字是后期静态绑定,在PHP5.3+中可用。因此,如果您使用的是较旧的版本,那么快速修复方法是不将其指定为抽象类抱歉,将getInstance函数公开。我已经更新了我的代码