开始用PHP创建登录系统。这是DB.php文件和RegisterController.php文件的片段。
db.php中
class DB {
public $username = 'root',
$password = '',
$host = '127.0.0.1',
$dbname = 'php',
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
public function connect() {
try {
$db = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->dbname . ';charset=utf8', $this->username, $this->password, $this->options);
} catch(PDOException $e) {
die('Failed to connect to the database' . $e->getMessage());
}
}
}
RegisterController.php
<?php
require 'DB.php';
class RegisterController {
public function Regiser() {
try {
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
} catch(PDOException $e) {
die('Failed to run query: ' .$e->getMessage());
}
}
}
我的问题是如何将DB.php中的$ db变量调用到寄存器文件中?我得到的错误是未定义的变量$ db&#39;,如果尝试通过执行链接
$db = new DB();
然后它开始说&#39;在课程DB()&#39;中找不到prepare()这是来自PHP的PDO。 我知道必须有一个简单的方法来做到这一点,但是,我觉得我在这里错过了大局。
答案 0 :(得分:0)
你的意思是connect()
返回 PDO对象吗?像这样:
public function connect() {
try {
return new PDO('mysql:host=' . $this->host . ';dbname=' . $this->dbname . ';charset=utf8', $this->username, $this->password, $this->options);
} catch(PDOException $e) {
die('Failed to connect to the database' . $e->getMessage());
}
}
然后,您的消费代码将创建DB
的实例并调用connect()
来获取该PDO对象。像这样:
$db = new DB();
$pdo = $db->connect();
$stmt = $pdo->prepare($query);
// etc.
面向对象的设计并非真正,这实际上只是为了将连接封装到方法中而创建一个DB
对象。另一种选择是connect()
可能是一个静态方法吗?或者DB
包装所有数据库操作?
您可以查看各种模式。但这里最重要的是你不会像你想的那样“在一个类中访问一个变量”。该变量封装在该方法中,并且仅存在于该方法中。为了从该方法中获取值(在本例中为PDO对象),该方法将返回该值并且消耗代码将对该返回值进行操作。被引用的对象在这里是关键,而不是在任何给定时间恰好指向该对象的任何给定变量。