【问题标题】:Using PDO with a class将 PDO 与类一起使用
【发布时间】:2013-01-07 10:44:17
【问题描述】:

我正在尝试在我的课程中使用 PDO 语句。我是 oop 的新手,我正试图弄清楚它应该如何完成。我查看了该站点上的一些示例,并使用了它们的逻辑,但它们似乎都不起作用。源代码中没有致命错误或警告,但从未执行 sql 语句。所以我觉得我只是错过了一件我还没有学到的小东西。

到目前为止,我了解到的是 PDO 连接必须在一个类中进行,并且应该通过构造函数方法调用。我从别人那里得到了数据库类的代码。

class Database
{
    protected static $Connection;

    public static function Connect()
    {
        if((self::$Connection instanceof PDO) === false)
        {
            $dbhost = 'host';
            $dbname = 'name';
            $dbuser = 'user';
            $dbpass = 'pass';

            self::$Connection = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
        }
        return self::$Connection;
    }
}

这只是类的一个函数中的构造函数和一个 PDO 语句示例

class blahJR extends blah
{       
    private $Database;

    function __construct ($sUser)
    {
        parent::__construct($sUser);

        //Updated below: $this->Database = Database::Connect();
        $this->Database = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass); //All the variables are given and the connection is definitely being made
    } //end __construct

public function foo($sString)
{
    try 
    {
         $Statement = $this->Database->prepare("INSERT INTO table (column) VALUES (?)");
         $Statement->execute(array($sString));
    }
    catch (PDOexception $e)
    {
         DatabaseError($e);
    }
}

任何帮助将不胜感激。感谢您的宝贵时间。

更新:我在 try 语句周围添加了函数以使其更清晰,它始终存在,只是在我提出问题时从未添加它。我希望能澄清它。它仍然没有报告任何错误。我不知道为什么这不起作用。

【问题讨论】:

    标签: php oop pdo


    【解决方案1】:

    没有理由创建一个单独的类来连接数据库。只需创建PDO 的实例并将其注入到需要它的类/方法中。

    另请注意,Database 类与 OOP 关系不大。

    class BlarJR extends blah
    {
        private $connection;
    
        public function __construct(\PDO $connection, $user)
        {
            parent::__construct($user);
    
            $this->connection = $connection;
        }
    
        public function foo($someValue)
        {
            $stmt = $this->connection->prepare("INSERT INTO table (column) VALUES (?)");
            $stmt->execute(array($someValue));
        }
    }
    
    $connection = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
    $connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $blarJR = new blahJR($connection, $user);
    
    try {
        $blarJR->foo('my value');
    } catch (\PDOexception $e) {
        echo $e->getMessage();
    }
    

    如您所见,我还在 PDO 连接和disabled emulated prepared statements 上启用了异常。您当前正在尝试捕获不会抛出的异常。 By default PDO uses PDO::ERRMODE_SILENT:

    这是默认模式。 PDO 将简单地设置错误代码供您使用语句和数据库对象上的 PDO::errorCode() 和 PDO::errorInfo() 方法进行检查;如果错误是由对语句对象的调用引起的,您将在该对象上调用 PDOStatement::errorCode() 或 PDOStatement::errorInfo() 方法。如果错误是由对数据库对象的调用引起的,您将改为在数据库对象上调用这些方法。

    你目前拥有的东西会产生错误,因为你的东西只是放在一个类中而不是在一个方法中。

    解析错误:语法错误,意外的“尝试”(T_TRY),期待函数(T_FUNCTION)在...

    【讨论】:

    • 我同意。看起来他也在尝试使用Database 类创建Singleton,但这对于连接池来说是不必要的。
    • 对不起,我应该更清楚,这是一种方法,我不只是把它留空。我会更新我的问题,向您展示它的真实样子。
    • @user1928545 正如我所说。在连接上启用异常以查看发生了什么或手动调用$stmt->errorInfo()。另外我不确定您是否正在尝试实现单例(看起来像),但是单例模式有no place in OOP
    • 我启用了例外,你是对的。该字符串未添加,因为它为空。我已经让它工作了。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多