1

我对我的 PDO 课程有疑问。它不起作用并创建此错误:“注意:未定义的变量:第 21 行的 classes.php 中的 db 致命错误:在第 32 行的 classes.php 中对非对象调用成员函数 prepare()。我试图修复这段代码运行了几个小时,但我没有找到错误。您的帮助将不胜感激!

先感谢您。

<?
// classes.php

class Connection{

    public static $db;

    function __construct() 
    {
        try {
            $this->$db = new PDO('mysql:host=localhost;dbname=vnm', '--', '--', array(PDO::ATTR_PERSISTENT => true));
            $this->$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            echo 'Connection failed: ' . $e->getMessage();
        }   
    }

    public function GetAccess()
    {
        return $db;
    }

}

class Page
{
    public function show_page($s_p1)
    {
         $db = Connection::GetAccess();
         $id = "1";
         $stmt = $db->prepare('SELECT * FROM users WHERE id = :id');
         $stmt->execute();
         while($row = $stmt->fetch())
         {
             print_r($row);
         }
    }
}?>
4

2 回答 2

2

静态成员必须使用static::. 您直接$db在您的代码中访问,并$this->db在您应该使用static::$db. 您还需要声明GetAccesspublic static function.

此外,调用Connection::GetAccess实际上并不实例化该类,因此static::$db可能为空,除非您在其他地方创建单例实例。

您可以在此处阅读有关单例的更多信息:http ://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html

于 2012-10-24T21:52:45.590 回答
0

尝试这个。我删除了所有静态方法。

    <?
// classes.php

class Connection{

    public $db;

    function __construct() 
    {
        try {
            $this->$db = new PDO('mysql:host=localhost;dbname=vnm', '--', '--', array(PDO::ATTR_PERSISTENT => true));
            $this->$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            echo 'Connection failed: ' . $e->getMessage();
        }   
    }

    public function GetAccess()
    {
        return $this->$db;
    }

}

class Page
{
    public function show_page($s_p1)
    {
         $con = new Connection();
         $db = $con->GetAccess();
         $id = "1";
         $stmt = $db->prepare('SELECT * FROM users WHERE id = :id');
         $stmt->execute();
         while($row = $stmt->fetch())
         {
             print_r($row);
         }
    }
}?>
于 2012-10-25T09:49:44.953 回答