我有一个成功连接到我的localhost和我的数据库的数据库类,我想选择我的用户数据库中的所有用户,但是当我调用我的数据库时,我认为这将更加困难。
我收到很多错误,例如:
Notice: Undefined variable: host in E:\xampp\htdocs\attendance\class.Register.php on line 10
Notice: Undefined variable: dbname in E:\xampp\htdocs\attendance\class.Register.php on line 10
Notice: Undefined variable: user in E:\xampp\htdocs\attendance\class.Register.php on line 10
Notice: Undefined variable: pass in E:\xampp\htdocs\attendance\class.Register.php on line 10
Fatal error: Call to undefined method Database::prepare() in E:\xampp\htdocs\attendance\class.Register.php on line 17
但是我已经在我的数据库类中定义了这些并告诉我的寄存器类需要连接文件。我究竟做错了什么?我似乎无法弄清楚如何在我的寄存器类中调用我的数据库连接?有人有什么想法吗?
class.Connect.php
<?php
// Database connection PDO
class Database {
public function __construct() {
// Connection information
$host = 'localhost';
$dbname = 'imanage';
$user = 'root';
$pass = '';
// Attempt DB connection
try
{
$this->pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//echo 'Successfully connected to the database!';
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
public function __destruct()
{
// Disconnect from DB
$this->pdo = null;
//echo 'Successfully disconnected from the database!';
}
}
?>
class.Register.php
<?php
require 'class.Connect.php';
class Register {
public function __construct()
{
$this->pdo = new Database($host, $dbname, $user, $pass); //ofcourse you can get the db connections details and database name from a config file
}
public function viewall() {
$sql = "SELECT * FROM users";
$stmt = $this->pdo->prepare($sql);
$stmt->execute();
// here you go:
$users = $stmt->fetchAll();
foreach ($users as $row) {
print $row["firstname"] . "-" . $row["lastname"] ."<br/>";
}
}
}
$run = new Register();
$run->viewall();
?>
答案 0 :(得分:2)
您正在使用$this->pdo
来定义数据库连接,但忘记为类定义属性。
定义类属性如下。
class Register
{
private $pdo;
public function __construct()
{
$this->pdo = new Database();
}
你的Database
类构造函数不接受任何参数,因此在创建Database
类的对象期间避免传递参数。
答案 1 :(得分:1)
我建议您按照以下方式重新修改课程。
class.Connect.php
<?php
// Database connection PDO
class Database {
public function __construct($host, $dbname, $user, $pass) {
// Attempt DB connection
try
{
$this->pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
class.Register.php
<?php
require 'class.Connect.php';
class Register {
private $pdo; // This variable will only be accessible from inside this class
public function __construct($database)
{
$this->pdo = $database; //ofcourse you can get the db connections details and database name from a config file
然后像这样使用这些类。
// Connection information
$host = 'localhost';
$dbname = 'imanage';
$user = 'root';
$pass = '';
$database = new Database($host, $dbname, $user, $pass);
$register = new Register($database);
这使得这些类更具可移植性,并使它们更容易测试。
答案 2 :(得分:0)
在您的代码中,您添加的评论是:
class Register {
public function __construct()
{
$this->pdo = new Database($host, $dbname, $user, $pass);
// ofcourse you can get the db connections details and database
// name from a config file
}
但这是一个对象,所以不,你实际上不能。除非你特别说明,否则一个物体基本上都不知道外面的世界。
所以,除非你想使用全局变量或其他一些丑陋的东西,否则你需要修改你创建新对象的方式:
$this->pdo = new Database();
您可以这样做,因为您的数据库类已经包含其中的详细信息(其次,您的Register对象不了解它们,或者您必须在Register对象中声明它们并修改数据库的构造函数接受输入的课程。
答案 3 :(得分:0)
您的数据库类没有“准备”方法。
因此,此代码:$stmt = $this->pdo->prepare($sql);
将导致您获得的致命错误。
$this->pdo
仅包含Database类的实例。
Fatal error: Call to undefined method Database::prepare() in E:\xampp\htdocs\attendance\class.Register.php on line 17
您可以在Register课程中执行$stmt = $this->pdo->pdo->prepare($sql);
。这将消除您的错误。 $this->pdo
将是您的Database类的实例,然后该类中的属性pdo包含您的pdo类的实例。