PDO类不工作 - 调用成员函数prepare

时间:2012-10-24 21:47:44

标签: php pdo

我对我的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);
         }
    }
}?>

2 个答案:

答案 0 :(得分:2)

必须使用static::访问静态成员。您应该使用$db时直接访问代码中的$this->db,并错误地使用static::$db。您还需要将GetAccess声明为public static function

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

您可以在此处详细了解单身人士:http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html

答案 1 :(得分: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);
         }
    }
}?>