PDO课程的最佳实践?

时间:2010-08-25 13:20:58

标签: 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;
    }

}

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

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

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

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

3 个答案:

答案 0 :(得分: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);
    }
}

在任何功能中,您只需:

$db = MyPDODB::loadDB();
$db->prepare($sql);
$db->execute();

简单,是吗?

答案 1 :(得分: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);
    }
}

用法:

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

答案 2 :(得分:4)

单例和静态类都可以正常工作。我不能想到它会产生影响的情况。

确保如果有可能使用多个连接,则可以从一开始就使用Singleton / Static类多连接(使用连接数组或对象属性......)

可以被认为,所有这些方法创造了某种“上帝对象”,只不过是一种荣耀的global,违背了真正的OOP原则。我曾经a question about this提出了很多很好的反馈意见。