Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
[PHP/PDO类]致命错误:调用布尔值上的成员函数fetch()_Php_Mysql_Class_Pdo - Fatal编程技术网

[PHP/PDO类]致命错误:调用布尔值上的成员函数fetch()

[PHP/PDO类]致命错误:调用布尔值上的成员函数fetch(),php,mysql,class,pdo,Php,Mysql,Class,Pdo,每当我尝试使用我的PDO数据库包装器从我的数据库中获取某些内容时,我都会收到此错误: 致命错误:调用第17行C:\xampp\htdocs\index.php中布尔值上的成员函数fetch() index.php require_once 'class.db.php'; $mysql = [ 'hostname' => '127.0.0.1', 'database' => 'lucidcms', 'username' => 'root',

每当我尝试使用我的PDO数据库包装器从我的数据库中获取某些内容时,我都会收到此错误:
致命错误:调用第17行C:\xampp\htdocs\index.php中布尔值上的成员函数fetch()
index.php

require_once 'class.db.php';
$mysql = [
    'hostname'  => '127.0.0.1',
    'database'  => 'lucidcms',
    'username'  => 'root',
    'password'  => 'test',
    'charset'   => 'utf8',
];
$db = new Database($mysql);

$u = "Sentinel";

$result = $db->prepare("SELECT `id` FROM `users` WHERE `username` = :u LIMIT 1")
             ->execute([':u' => $u])
             ->fetch();
echo $result;
<?php
class Database {

    private static $stmt, $pdo;

    public function __construct(array $mysql) {
        if(is_null(self::$pdo)) {
            try {
                self::$pdo = new \PDO(
                    'mysql:dbname='.$mysql['database'].';host='.$mysql['hostname'].';charset='.$mysql['charset'], 
                    $mysql['username'], 
                    $mysql['password'],
                    [\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::ATTR_PERSISTENT => true]
                );
            } catch(PDOException $e) {
                die('An error occurred when trying to communicate with the database.');
                //die($e->getMessage());
            }
        } else {
            return new self;
        }
    }

    public function __destruct() {
        // Destruct the connection to DB once finished
        try {
            self::$pdo = null;
        } catch(PDOException $e) {
            die('An error occurred when trying to close the connection with the database.');
            //die($e->getMessage());
        }
    }

    public static function prepare($sql) {
        self::$stmt = self::$pdo->prepare($sql);
        return self::$stmt;
    }

    public static function execute($data = []) {
        return self::$stmt->execute(isset($data) ? $data : null);
    }

    public static function count() {
        return self::$stmt->rowCount();
    }

    public static function fetch() {
        return self::$stmt->fetchColumn();
    }

    public static function fetchAll($type = \PDO::FETCH_ASSOC) {
        return self::$stmt->fetch($type);
    }

    public static function lastId() {
        return self::$pdo->lastInsertId();
    }

}
class.db.php

require_once 'class.db.php';
$mysql = [
    'hostname'  => '127.0.0.1',
    'database'  => 'lucidcms',
    'username'  => 'root',
    'password'  => 'test',
    'charset'   => 'utf8',
];
$db = new Database($mysql);

$u = "Sentinel";

$result = $db->prepare("SELECT `id` FROM `users` WHERE `username` = :u LIMIT 1")
             ->execute([':u' => $u])
             ->fetch();
echo $result;
<?php
class Database {

    private static $stmt, $pdo;

    public function __construct(array $mysql) {
        if(is_null(self::$pdo)) {
            try {
                self::$pdo = new \PDO(
                    'mysql:dbname='.$mysql['database'].';host='.$mysql['hostname'].';charset='.$mysql['charset'], 
                    $mysql['username'], 
                    $mysql['password'],
                    [\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::ATTR_PERSISTENT => true]
                );
            } catch(PDOException $e) {
                die('An error occurred when trying to communicate with the database.');
                //die($e->getMessage());
            }
        } else {
            return new self;
        }
    }

    public function __destruct() {
        // Destruct the connection to DB once finished
        try {
            self::$pdo = null;
        } catch(PDOException $e) {
            die('An error occurred when trying to close the connection with the database.');
            //die($e->getMessage());
        }
    }

    public static function prepare($sql) {
        self::$stmt = self::$pdo->prepare($sql);
        return self::$stmt;
    }

    public static function execute($data = []) {
        return self::$stmt->execute(isset($data) ? $data : null);
    }

    public static function count() {
        return self::$stmt->rowCount();
    }

    public static function fetch() {
        return self::$stmt->fetchColumn();
    }

    public static function fetchAll($type = \PDO::FETCH_ASSOC) {
        return self::$stmt->fetch($type);
    }

    public static function lastId() {
        return self::$pdo->lastInsertId();
    }

}

您做了很多错事,(仅完全更改了方法名称!)但是您得到的错误消息很清楚:如果您想使用方法链接,您应该像编写prepare()一样编写每个方法,以使其返回语句

然而,这个类无法挽救,因为它会导致严重的生产错误,这是由于它的错误。让我建议另一种解决方案,它更轻量级,更不容易出错,而不是这种麻烦的混乱局面

class MyPDO extends PDO
{
    public function run($sql, $args = NULL)
    {
        $stmt = $this->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}
有了这个简单的扩展,您将能够在SELECT查询中使用方法链接,而不会有弄乱代码的风险

$result = $db->run("SELECT `id` FROM `users` WHERE `username` = :u LIMIT 1", [':u' => $u])
             ->fetch();

它不像您当前的方法那样整洁,但同样-它没有承受其可怕的缺点。

谢谢,我会检查它。那太糟糕了。Ikr,但我不是真的要使用它,它只是用于测试目的。哦,让我看看这个。