我想在php中使用PDO进行mysql连接。我需要拥有必须在多个文件上可用的PDO连接对象。数据库连接也必须是一个类。这里找到的许多答案都不令人满意。请解释实现它的正确方法。
我遵循的当前方法是: 文件名:connectClass.php
<?php
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting(-1);
class connect
{
public $db;
public $isConnected;
public function __construct()
{
$this->isConnected = true;
try {
$this->db=new PDO('mysql:host=localhost;dbname=dbname','root','rootpass');
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
catch(PDOException $e) {
$this->isConnected = false;
throw new Exception($e->getMessage());
}
}
}
$obj=new connect();
?>
访问连接对象 文件名:addContentClass.php
<?php
include_once 'class/connectClass.php';
class addContent extends connect
{
public function insertContent($title, $content, $page_title, $meta_tags) {
try {
$qry = $this->db->prepare("INSERT INTO tblPageContents (PageName, PageTitle, PageMeta, PageKeyWords, PageContents, PageFooter, PageShortName) VALUES (?, ?, ?, ?, ?, ?, ?)");
$data = array($title, $content, $page_title, $meta_tags);
$qry->execute($data);
echo "<div id=\"dialog-ci\" title=\"Content updation success\" style=\"color:green\">Content insertion success</div>";
}
catch(PDOException $e)
{
echo 'Query failed'.$e->getMessage();
}
}
}
?>
此代码的问题是我每次都需要使用扩展。
答案 0 :(得分:0)
单身方法可以像这样实现
<?php
class Connect {
public $db;
public $isConnected;
public static $instance = null;
public static function getInstance() {
if (self::$instance == null) self::$instance = new static();
return self::$instance;
}
private function __construct() {
$this->isConnected = true;
try {
$this->db = new PDO('mysql:host=localhost;dbname=dbname','root','rootpass');
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}catch(PDOException $e) {
$this->isConnected = false;
throw new Exception($e->getMessage());
}
}
}
class AddContent {
public function insertContent($title, $content, $page_title, $meta_tags) {
try {
$qry = Connect::getInstance()->db->prepare("INSERT INTO tblPageContents (PageName, PageTitle, PageMeta, PageKeyWords, PageContents, PageFooter, PageShortName) VALUES (?, ?, ?, ?, ?, ?, ?)");
$data = array($title, $content, $page_title, $meta_tags);
$qry->execute($data);
echo "<div id=\"dialog-ci\" title=\"Content updation success\" style=\"color:green\">Content insertion success</div>";
}
catch(PDOException $e)
{
echo 'Query failed'.$e->getMessage();
}
}
}
请注意,这不是最好的方法,因为它不是其他情况下的可转换解决方案。更好的方法是使用依赖注入并将connect
类的实例传递给其他类
interface DatabaseImplementation {
public function connect();
public function execute();
public function bar();
}
class Connect implements DatabaseImplementation {
public function connect() {
// Logic A...
// ex. Connect to mysql with PDO
}
public function execute() {
// logic A...
}
public function bar() {
return 'bar';
}
}
class AlternativeConnect implements DatabaseImplementation {
public function connect() {
// Logic B...
// ex. Connect to mongoDB
}
public function execute() {
// logic B...
}
public function bar() {
return 'foo';
}
}
class Controller {
public function __construct() {
$database_pdo = new Connect();
$database_json = new AlternativeConnect();
$pdo_content = new AddContent($database_pdo);
$json_content = new AddContent($database_json);
}
}
class AddContent {
private $db;
public function __construct(DatabaseImplementation $db) {
$this->db = $db;
$this->db->connect();
}
}
使用DI的优点是,无论是使用PDO还是使用MongoDB,类都不需要知道使用哪种实现来存储数据。它只需知道它可以使用哪些功能(例如connect / execute / ...)