【问题标题】:PHP pdo class getadresses warning and Call to a member function prepare() on a non-objectPHP pdo 类 getadresses 警告并调用非对象上的成员函数 prepare()
【发布时间】:2016-02-09 16:01:35
【问题描述】:

我遵循了有关创建 PDO 类的教程,以便更好地理解类和 PDO。

我已按照规定的步骤操作,但最终结果给了我 1 个警告和一个致命错误。

这是错误日志:

警告:PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known on line 24

致命错误:在第 32 行调用非对象上的成员函数 prepare()

我不是 100% 确定这个错误的原因是什么,教程上的 cmets 似乎表明它适用于他们,所以我一定在某个地方犯了错误。

这是我的类函数(查看代码注释以查看错误在哪一行)

class DB {
    private $host   = DB_HOST;
    private $user   = DB_USER;
    private $pass   = DB_PASS;
    private $dbname = DB_NAME;

    private $stmt;

    private $dbh;
    private $error;

    public function __construct(){
        // Set DSN
        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;

        // Set options
        $options = array(
            PDO::ATTR_PERSISTENT => true, 
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );      
        // Create a new PDO instanace
        try {
            // WARNING occurs here [line 24]
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        }// Catch any errors
        catch (PDOException $e) {
            $this->error = $e->getMessage();
        }
    }

    public function query($query){
        // FATAL ERROR [line 34]
        $this->stmt = $this->dbh->prepare($query);
    }   

    public function bind($param, $value, $type = null){
        if (is_null($type)) {
          switch (true) {
            case is_int($value):
              $type = PDO::PARAM_INT;
              break;
            case is_bool($value):
              $type = PDO::PARAM_BOOL;
              break;
            case is_null($value):
              $type = PDO::PARAM_NULL;
              break;
            default:
              $type = PDO::PARAM_STR;
          }
        }
        $this->stmt->bindValue($param, $value, $type);
    }

    public function execute(){
        return $this->stmt->execute();
    }

    public function single(){
        $this->execute();
        return $this->stmt->fetch(PDO::FETCH_ASSOC);
    }

}
// Instantiate database.
$database = new DB();
define("DB_HOST", "secret");
define("DB_USER", "secret");
define("DB_PASS", "secret");
define("DB_NAME", "secret");

这也是我为测试新创建的类所做的选择查询示例:

$database->query('SELECT name FROM users WHERE uid > :id');
$database->bind(':id', 0);
$row = $database->single(); //get the first row selected
echo "<pre>";
print_r($row);
echo "</pre>";

所以我不清楚我的致命错误是什么。希望有人能解释我犯了什么错误,以便我更好地理解。

【问题讨论】:

  • 您为构造函数提供适当凭据的部分在哪里?你还没有设置那些必要的属性
  • 你的意思是主机名、用户名、密码和数据库名吗?如果是这样 - 它位于脚本的底部。
  • 你确实安装了mysql,对吧?
  • @ElefantPhace 是的。一段时间以来,我一直在使用没有课程的 PDO。但是厌倦了尝试捕获每个查询,所以想要一个类来简化我的代码。
  • 回显 $dsn 并发布您可以通过 xxx 输出的信息,如果这会让您感觉更好

标签: php mysql pdo


【解决方案1】:

尝试在实例化类之前放置定义,如下所示:

    define("DB_HOST", "secret");
    define("DB_USER", "secret");
    define("DB_PASS", "secret");
    define("DB_NAME", "secret");

    // Instantiate database.
    $database = new DB();

并将定义的值分配给“__construct”方法中的属性,在任何代码之前:

    $this->host   = DB_HOST;
    $this->user   = DB_USER;
    $this->pass   = DB_PASS;
    $this->dbname = DB_NAME;

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2014-09-04
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多