【问题标题】:Working with PDO object - MySQL使用 PDO 对象 - MySQL
【发布时间】:2011-07-05 04:36:52
【问题描述】:

我是 PDO 的新手,我有一个非常简单的问题。我有一个连接数据库的简单函数:

function connectDB()
    {
        try {
            $dbh = new PDO('mysql:host='.Config::$db_server.';dbname='.Config::$db_name, Config::$db_login, Config::$db_password, array(
                PDO::ATTR_PERSISTENT => true
            ));
            $dbh->exec("SET CHARACTER SET utf8"); 
            $dbh = null;
        } catch (PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
    }

调用此函数后,我成功连接到 db。后来,当尝试使用 $dbh->query 发送查询时,我得到“调用非对象上的成员函数 query() ”。我明白这一点 - 我目前没有该类的实例。但是实现这一目标的唯一想法是再次使用 $dbh = new PDO("settings") ,这有点愚蠢不是吗?功能比没有意义。我试图在 connectDB 函数中返回 $dbh(在 NULL 语句之前),但它并没有真正起作用。

这应该如何正确完成?

【问题讨论】:

    标签: mysql pdo


    【解决方案1】:

    这取决于你的应用程序的架构,但我认为,你应该让数据库处理一个类变量,在构造函数中初始化它并稍后使用它。

    class DatabaseAccess{
        private $_db;
        public function __construct(){
            try {
                $this->_db = new PDO('mysql:host='.Config::$db_server.';dbname='.Config::$db_name, Config::$db_login, Config::$db_password, array(
                    PDO::ATTR_PERSISTENT => true
                ));
                $this->_db->exec("SET CHARACTER SET utf8"); 
                //notice I removed "= null" part
            } catch (PDOException $e) {
                print "Error!: " . $e->getMessage() . "<br/>";
                die();
            }
        }
    
        public function getSomething(){
            //run your query here:
            return $this->_db->query('');
        }
    }
    

    【讨论】:

    • 知道了!感谢您的宝贵时间。
    【解决方案2】:

    您需要删除函数中的$dbh = null; 语句。使用这句话,您将使用空值覆盖连接,因此以后您随时可以执行$dbh-&gt;query(),就像执行null-&gt;query(),因此会出现错误。

    此外,您需要保存处理程序,否则在您的代码退出该函数后它会丢失。在函数末尾添加return $dbh; 或将其包装在一个类中。

    【讨论】:

      猜你喜欢
      • 2013-02-24
      • 2011-08-20
      • 1970-01-01
      • 2011-03-09
      • 2012-04-24
      • 2023-04-09
      相关资源
      最近更新 更多