这是我使用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);
问题是,如果我使用这一行,在登录类(扩展db类)中进行pdo查询...
$stmnt = $conn->prepare('SELECT id FROM users WHERE name :name OR email = :email');
它产生两个错误,说.. 注意:未定义的变量:conn ...和 致命错误:在非对象上调用成员函数prepare()...
我可以通过简单地将所有pdo内容放在登录类中来解决这个问题,但我仍然只是好奇......你们如何从另一个类中调用一个对象(这是一个pdo类的实例?)。
PHP Class Based User System With PDO - Call to a member function prepare() on a non-object这个问题很有意思,但不太了解:/
没有多少练习OOP所以一些好的解释将不胜感激!谢谢。
答案 0 :(得分:3)
您需要将$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');
答案 1 :(得分:0)
为什么不直接向db类添加一个方法,该方法接收一个sql字符串并返回一个object数组。只需在该方法中执行所有声明即可。然后登录类可以调用此方法来执行任何查询。它不需要知道如何实现数据库连接。这样,如果您希望将来更改底层实现。它只影响db类。由于所有数据库访问都通过db类,因此对登录类的更改不会太多。
答案 2 :(得分:0)
您的WHERE子句中出现错误:
WHERE name :name
你错过了一个等号:
WHERE name = :name