首页 > 解决方案 > 未捕获的错误:调用成员函数 prepare() (PDO, php)

问题描述

我正在尝试使用 PHP 中的公共函数从表中获取数据,但出现此错误:

未捕获的错误:调用成员函数 prepare() (PDO, php)

我正在寻找 2、3 个小时......但没有类似的结果,或者我不明白。

<?php

class Config {

    public static $SQL;

    private function __construct() {
        $host_name = "localhost";
        $base_user = "root";
        $base_pass = "";
        $base_name = "home_page";

        try {
            self::$SQL = new PDO("mysql:host=$host_name;dbname=$base_name", $base_user, $base_pass);
            self::$SQL->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            echo "Connected successfully";
        } catch(PDOException $e) {
            die("Something went wrong, database connection closed. Reason: ". $e->getMessage());
        }
    }

    public static function GetData($table, $data, $id) {
        $wc = Config::$SQL->prepare('SELECT `'.$data.'` FROM `'.$table.'` WHERE `ID` = ?');
        $wc->execute(array($id));
        $r_data = $wc->fetch();
        return $r_data[$data];
    }

}

?>

我在我的基本文件中使用它:

<h1><?php echo Config::GetData("page_details", "Moto", 1) ?></h1>

错误来自这一行:

$wc = self::$SQL->prepare('SELECT `'.$data.'` FROM `'.$table.'` WHERE `ID` = ?');

标签: phphtml

解决方案


有什么特别的原因要在任何STATIC地方使用吗?常见的方法是使用公共的、动态的方法和属性。我在 PHPs OOP 中使用建议的命名约定重写了您的示例,它可以工作:

<?php

class Config
{

    /** @var PDO $conn */
    private $conn = null;

    public function __construct()
    {
        $host_name = "localhost";
        $base_user = "root";
        $base_pass = "";
        $base_name = "home_page";

        try {
            $this->conn = new PDO("mysql:host=$host_name;dbname=$base_name", $base_user, $base_pass);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            echo "Connected successfully"; // <- this is unnnesesary
        } catch (PDOException $e) {
            die("Something went wrong, database connection closed. Reason: " . $e->getMessage());
        }
    }

    public function findById($table, $data, $id)
    {
        $stmt = $this->conn->prepare('SELECT `' . $data . '` FROM `' . $table . '` WHERE `uid` = ?');
        $stmt->execute(array($id));

        return  $stmt->fetch(PDO::FETCH_ASSOC);
    }

}

// just for test
$cfg = new Config();
print_r($cfg->findById('foo', '*', 1));

或者在你的情况下

<?php echo $cfg->findById("page_details", "Moto", 1)['Moto'] ?>

推荐阅读