【问题标题】:PDO __constructs expects at least 1 parameter, 0 givenPDO __constructs 至少需要 1 个参数,给定 0
【发布时间】:2013-11-11 19:12:04
【问题描述】:

我有数据库类和构造函数这个:

<?php
class Connection {
private $PDO;

function __construct() {
    $username = 'root';
    $password = 'password';

    $PDO = new PDO('mysql:dbname=PROOV;host=localhost', $username, $password);

    return $this->PDO;
}
}
?>

以及扩展它的另一个类:

<?php

//$query = 'SELECT part_description FROM SparePartRequests LIMIT 100';

include_once 'connection.php';

class Proov extends PDO {

    public function returnRows() {
        $sth = $this->prepare('SELECT part_description FROM SparePartRequests LIMIT 100');
        $sth->execute();

        $result = $sth->fetch();

        return $result;
    }

}
    $proov = new Proov(); // <- this is line nr 19...

?>

它会抛出异常: 警告:PDO::__construct() 至少需要 1 个参数,0 在 /var/www/proov/proov1.php 第 19 行给出

如何解决我的问题? 感谢您的帮助!

感谢您的帮助!

【问题讨论】:

  • 这不是您的问题(请参阅 h2ooooooo 的答案以解决您的错误),在 Connection 中,您从未设置 $this-&gt;PDO,您设置了一个局部变量 $pdo,但从不将其分配给对象变量。

标签: php pdo construct


【解决方案1】:

但是您正在扩展 PDO - 而不是 Connection (并且连接保留了 PDO 对象 - 它也没有扩展它)。您需要决定要使用这些方法中的哪一种。

也许这就是你想要的?

class Connection extends PDO {
    public function __construct() {
        $username = 'root';
        $password = 'password';

        parent::__construct('mysql:dbname=PROOV;host=localhost', $username, $password);
    }
}

class Proov extends Connection { //We extend Connection - not PDO
    public function returnRows() {
        $sth = $this->prepare('SELECT part_description FROM SparePartRequests LIMIT 100');
        $sth->execute();

        $result = $sth->fetch();

        return $result;
    }
}

【讨论】:

  • 我认为 $PDO 有连接是因为: $PDO = new PDO('mysql:dbname=PROOV;host=localhost', $username, $password);我只是扩展它...如何设置与 PDO 的连接?
  • @user2812532 但是您没有引用$PDO 甚至Connection,因为您创建了一个扩展PDO 的新Proov 类。它对您的Connection 课程一无所知。你所做的只是创建类——你从不引用它。 $PDOConnection 类中的一个变量。 PDO 本身就是一个类。这两个人没有任何关系。
【解决方案2】:

你从PDO派生你的类Proov,因此它也继承了它的构造函数,而它又需要至少1个参数。

这是构造函数ProovPDO 都有:

public PDO::__construct() ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )

也许您希望提供解决方案 h2o,但我不建议这样做。问自己一个问题:“Proov”是“连接”吗?不,可能不是,因此我建议使用依赖注入:

class Proov {
  private PDO $pdo;

  public function __constructor($pdo) {
    $this->pdo = $pdo;
  }

  public function returnRows() {
    $sth = $this->pdo->prepare('SELECT part_description FROM SparePartRequests LIMIT 100');
  }
}

这让生活变得更简单,尤其是在单元测试方面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2011-12-25
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多