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

标签 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);

最佳答案

类 qu 的函数 getq 应该使用 public 访问修饰符进行标记。 否则下一行将失败,因为 getq 是私有(private)函数

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

此代码中的第二个问题

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

当您从静态内容输入函数 quconn 时,$this 不可用。

使用 self::$db 代替。

对于 qu 类,遵循与 db 类相同的结构,它是一个单例管理类。

我还建议您澄清 $this 和 self、静态竞赛等之间的差异。

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

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

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

}

顺便说一句,我不认为 qu 类是精心“设计”的 即使您纠正了按引用传递问题,此指令也不起作用:

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

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

我建议:

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

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

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

相关文章:

c++ - 我想重载运算符 '=' 但在重载之后运算符没有将正确的信息传递给对象

php - 如何在循环中使用 woocommerce 数据属性

PHP MYSQL - 动态访问数组值

java - jpa 2.1 和新的 Date APi : YearMonth to Date Converter, MySQL 异常

PHP Dropdown mySQL 两张表

Python - 如何正确设置类的层次结构?

php - Zend 框架事务 (Zend_db_adapter)

php mysql select 有我行的数据

mysql - 如何将 LIMIT 与 INNER JOINS 一起使用?

javascript - 如何使用 Javascript getElementsByClass() 函数在类或标签中选择类?