PDO类范围调用未定义的方法

时间:2012-03-16 08:29:41

标签: php mysql class design-patterns pdo

我正在尝试根据我的数据库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);

1 个答案:

答案 0 :(得分:1)

类qu的函数getq应该用public access modifier标记。 否则,以下行将失败,因为getq是私有函数

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

第二个并在此代码中出现

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

当你从静态内容$中输入函数quconn时,这是不可用的。

改为使用self :: $ db。

对于类qu,遵循类db的相同结构,这是一个单例mnagament类。

我还建议澄清你自己和自我,静态比赛等之间的差异。

Php offiacial文档提供了大量关于

的内容

此外,我认为您不需要传递参考方法: 尝试重写quconn函数,如下所示:

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

}

顺便说一下,我没有把课程改编成“工程” 即使您纠正了传递引用问题,该指令也不起作用:

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

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

我建议:

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

这得到PDP实例并调用prapare方法....