0

我正在尝试在我的课程中使用 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 语句周围添加了该函数以使其更清晰,它始终存在,只是在我提出问题时从未添加它。我希望能澄清它。它仍然没有报告任何错误。我不知道为什么这不起作用。

4

1 回答 1

2

没有理由创建一个单独的类来连接数据库。只需创建一个实例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 连接上启用了异常,并禁用了模拟的准备好的语句。您当前正在尝试捕获不会抛出的异常。默认情况下,PDO 使用PDO::ERRMODE_SILENT

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

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

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

于 2013-01-23T20:15:52.503 回答