这是我使用pdo ext连接数据库的db类。
class db
{
private $host;
private $dbname;
private $username;
private $password;
public function __construct($host,$db,$name,$pass)
{
$this->host=$host;
$this->dbname=$db;
$this->username=$name;
$this->password=$pass;
$dsn = 'mysql:'.$this->dbname.';'.$this->host;
try
{
$conn = new PDO($dsn, $this->username, $this->password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
echo 'ERROR: ' . $e->getMessage();
}
}
}
我在登录类中像这样调用db类…
$host='localhost';
$db='techy_issue_tracker';
$name='root';
$pass='';
$base= new db($host,$db,$name,$pass);
这里是问题,使一个pdo查询内登录类(扩展db类),如果我使用一行这…
$stmnt = $conn->prepare('SELECT id FROM users WHERE name :name OR email = :email');
生成两个错误,表示..注意:未定义变量:conn…和
在非对象上调用成员函数prepare()我可以通过简单地把所有的pdo的东西在登录类,但我仍然只是好奇…如何从另一个类调用对象(它是pdo类的实例?)
这个问题很有趣,但是我不太明白:/我没有经常练习OOP,所以如果有好的解释我会很感激!谢谢。
您需要将$conn
初始化为db
类的公共属性。
在db
类的私有属性之后,添加以下内容:
public $conn;
然后,在try catch中,将$conn
更改为$this->conn
:
$this->conn = new PDO($dsn, $this->username, $this->password);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
然后,假设您已经正确地扩展了db
类,您可以通过以下方式访问conn
:
$stmt = $db->conn->prepare('SELECT id FROM users WHERE name :name OR email = :email');
为什么不直接在db类中添加一个方法,该方法接受sql字符串并返回对象数组。在那个方法中做所有的语句。然后登录类可以调用这个方法来执行任何查询。它不需要知道如何实现数据库连接。这样,如果您将来想要更改底层实现。它只影响db类。不需要对登录类做太多更改,因为所有数据库访问都要通过db类。
WHERE子句错误:
WHERE name :name
你少了一个等号:
WHERE name = :name