PDO课程的最佳实践?

JD *_*cks 0 php pdo

我想创建一个PDO类来处理数据库连接.

这是我有的:

require('php/packages/store/store_db_settings.php');

class store_pdo
{
    private $DBH; // Data Base Handler

    function __construct() 
    {
        $DBH = new PDO(DB_DSN,DB_USER,DB_PASSWORD);
    }

    public function getHandler()
    {
        return $DBH;
    }

}
Run Code Online (Sandbox Code Playgroud)

我认为这似乎没问题,但是我习惯于只使用类似的东西,mysql_query而且不确定将来会遇到什么问题.所以我认为这里的经验可以提供指导.

我有足够的东西吗?我应该使我的类Singleton,还是使用静态函数?有最好的做法吗?

我不想这样做,然后我有几个其他类使用它,发现我应该用不同的方式写它.

PS我只是注意到best-practices标签不再被允许......这是否意味着现在也不鼓励这样的问题?

The*_*ith 7

当您第一次需要连接到两个不同的数据库时,Singleton会咬你,无论是复制还是两个不同的数据库.然后你的代码搞砸了.

而是使用单个静态函数轻松加载上次使用的配置:

class MyPDODB extends PDO
{
    // Prevent unconfigured PDO instances!
    private function __construct($config)
    {
        $dsn = sprintf('mysql:dbname=%s;host=%s;port=%d;', $config['database'], $config['hostname'], $config['port']);
        parent::__construct($dsn, $config['username'], $config['password']);        
    }

    public static function loadDB($config_in = null)
    {
        static $last_config = null;

        if (!is_null($config_in))
        {
            self::validateConfig($config_in);
            $config = $config_in;
            if (!isset($config['isTemp']) || $config['isTemp'] !== true)
            {
                $last_config = $config;
            }
        }
        else
        {
            if (!is_null($last_config)) { $config = $last_config; }
            else throw new MyDBException("No config provided');
        }

        return new MyPDODB($config);
    }
}
Run Code Online (Sandbox Code Playgroud)

在任何功能中,您只需:

$db = MyPDODB::loadDB();
$db->prepare($sql);
$db->execute();
Run Code Online (Sandbox Code Playgroud)

好吗,对吧?


Rob*_*itt 6

扩展PDO以使您更好地控制它.

class Database Extends PDO
{
    static $instance; //singleton
    static function Singleton($params = false)
    {
       if(!isset(self::$instance))
       {
           self::$instance = new self($params); //tomh
           self::$instance->init();
       }
       return self::$instance;
    }
    private function __construct(){}; //not allowed with singleton.

    public function init($params) //Override PDO::__construct()
    {
       parent::__construct($params);
    }

    public function query($query)
    {
        //Catch,Custom Query Object maybe. W.e
        return parent::query($modified_query);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

$Database = Database::Singleton(array('user' => 'root')); //....
$Database->query('Helooooooo Sexy MySql, Send me my Shizzle');
Run Code Online (Sandbox Code Playgroud)