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