如何解决此错误:致命错误:在第53行的C:\xampp2\htdocs\digikalamvc\core\model.php中的字符串上调用成员函数prepare()

如何解决此错误:致命错误:在第53行的C:\xampp2\htdocs\digikalamvc\core\model.php中的字符串上调用成员函数prepare(),php,Php,如果静态调用方法,它不会调用类构造函数 你得到这个错误是因为你有这个 <?php class Model { public static $conn = ''; public $totalMenu = array(); function __construct() { $servername = 'localhost'; $username = 'root'; $password = '';

如果静态调用方法,它不会调用类构造函数

你得到这个错误是因为你有这个

<?php

class Model
{

    public static $conn = '';
    public $totalMenu = array();

    function __construct()
    {
        $servername = 'localhost';
        $username = 'root';
        $password = '';
        $dbname = 'digi_mvc';
        $attr = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
        self::$conn = new PDO('mysql:host=' . $servername . ';dbname=' . $dbname, $username, $password, $attr);
        self::$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        if (function_exists('jdate') == false) {
            require('public/jdf/jdf.php');
        }

    }


    public static function getoption()
    {

        $sql = "select * from tbl_option";
        $stmt = self::$conn->prepare($sql);
?>
作为默认值,它是一个字符串,因此当您调用它时,您显然会得到您得到的错误

如何修复它,那么这个类的结构基本上是toast

因此,您需要首先调用construct,或者最好将连接设为静态并进行检查

因此,与其构造,不如将其更改为

 public static $conn = '';
然后用另一种方法,

public static $conn; //change this to null, it will be a touch easier to check

public static function connect() ///__construct()
{
    $servername = 'localhost';
    $username = 'root';
    $password = '';
    $dbname = 'digi_mvc';
    $attr = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
    self::$conn = new PDO('mysql:host=' . $servername . ';dbname=' . $dbname, $username, $password, $attr);
    self::$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    if (function_exists('jdate') == false) {
        require('public/jdf/jdf.php');
    }
}
差不多吧

这样,当您调用
getoption
时,它将检查
$conn
是否为false,如果为false,它将调用connect,如果不是,则我们已从以前的调用调用connect

作为补充,您缺少最后两个
}
一个关闭
getoption
一个关闭类,但我认为这只是问题中的一个输入错误

我要说的最后一件事是,混合和匹配静态和非静态方法通常不是一个好主意,在某些情况下,这是可行的。但总的来说,他们彼此并不友好。您将陷入一种失去对象状态的情况


您可以使用的另一种模式称为“Singleton”,IMO(有些人不同意)在数据库类中可以很好地使用它。但是我不会在这里深入讨论它,因为如果需要更多信息,您可以在谷歌上搜索该模式。

您是否在调用
getoption()
而不生成
Model
的新对象?因为在这种情况下,
$conn=''
不是您的PDO
public static function getoption()
{
    if(!self::$conn) self::connect();
  //.... rest of code...