【问题标题】:Declaration of x::prepare() should be compatible with PDO::preparex::prepare() 的声明应该与 PDO::prepare 兼容
【发布时间】:2018-01-17 17:31:26
【问题描述】:

由于我与外部数据库建立连接,我需要一种方法,仅在必要时(如果有查询)完成与数据库的连接。

我在 StackOverflow 上找到了这个答案:Auto connecting to PDO only if needed

很完美,我采用这种方法。我认为这是一种干净的方式。但问题来了:

我几乎总是在查询中使用准备好的语句,例如:

$sth = $dbh->prepare("SELECT username FROM users WHERE username = :username");
$sth->bindParam(':username', $_POST['username'], PDO::PARAM_STR);
$sth->execute();

但是将准备好的语句与上述答案的类一起使用它给了我:

警告:PDO::prepare(): SQLSTATE[00000]: 无错误:未调用 PDO 构造函数

致命错误:在 null 上调用成员函数 bindParam()

所以我在课堂上添加了:

public function prepare($query)
{
    $this->checkConnection();
    return parent::prepare($query);
}

而且它有效。但它总是给我这个警告:

严格标准:DB::prepare() 的声明应与class_pdo.php 中第0 行的PDO::prepare($statement, $options = NULL) 兼容

有人知道为什么吗?

谢谢。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    因为PDO::prepare 可以接受第二个参数,就像它在错误消息中所说的那样。由于您的类是 PDO 的子类,因此它不能放弃对 PDO 基类所支持的东西的支持。

    谢天谢地,这很容易解决:

    public function prepare($query, $options = NULL) # <-- add the argument
    {
        $this->checkConnection();
        return parent::prepare($query, $options);    # <-- and pass it on
    }
    

    【讨论】:

    • 您好,感谢您的建议,我现在只注意到一件事。使用 NULL 它给了我PDO::prepare() expects parameter 2 to be array, null given。因此,我插入了一个空数组而不是 NULL,它可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2011-04-30
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多