我试图基于我的数据库PDO类创建一个简单的类,我可以说“获取此ID”,它将打印信息。我正在尝试在“ qu”中执行此操作,但收到以下错误:“调用未定义的方法qu :: get()”。

问题可能混合存在,因此这里的任何帮助都会很棒。非常感谢!!

class db {

   protected static $conn;
   private function __construct(){}

   public static function connect() {

      if (!isset(self::$conn)) {
           self::$conn = new PDO('mysql:host=localhost;dbname=database', DB_USER, DB_PASSWORD);
      }

      return self::$conn;
   }

}

    class qu {

    private $db;
    function quconn (&$db){
        $this->db = &$db;
    }

    private static function getq($id){

        $sql="SELECT * FROM table WHERE id=:id";
        $stmt = self::quconn()->prepare($sql);
        $stmt->execute(array(':id'=> $id));
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $result;

    }

}

//$data = db::connect()->query("SELECT * FROM table")->fetchAll(); // this works

$data = qu::getq("22"); //can i use something like this? this causes the error
print_r($data);

最佳答案

qu类的功能getq应标记为public access修饰符。
否则,由于getq是私有函数,因此下一行将失败

 $data = qu::getq("22");


其次,此代码中的问题

 function quconn (&$db){
    $this->db = &$db;
}


当您从静态内容$ qu输入函数quconn时,此功能不可用。

使用self :: $ db代替。

对于qu类,遵循db类的相同结构,这是单例管理类。

我还建议您自己澄清$ this与自我,静态竞赛等之间的区别。

PHP官方文档提供了很多有关

我也不认为你需要引用传递方法:
尝试如下重写quconn函数:

 function quconn ($db){
   self::$db = $db;


}

顺便说一句,我不认为Qu类是经过精心设计的
即使您更正了按引用传递问题,该指令也将不起作用:

$stmt = self::quconn()->prepare($sql);


您正在根据对quconn的调用结果调用prepare函数,该函数不会返回任何内容...

我建议:

 $stmt = db::connect()->prepare($sql);


这将获取PDP实例并调用prapare方法。

关于php - PDO类作用域对未定义方法的调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9734029/

10-11 06:34