访问另一个文件中的 PHP PDO 对象
Access the PHP PDO object in another file
我在 generic.php 中有一个名为 generic 的 class。我有一个 signup.php 文件,它必须执行 SQL 查询。但是,我无法访问存储在变量 $db.
中的 generic.php 中创建的 PDO 对象
通用 class 看起来像这样:
class Generic {
public $db;
public function connect_database() {
define('USER', 'user');
define('PASSWORD', 'password');
// Database connection
try {
$connection_string = 'mysql:host=localhost;dbname=mydb;charset=utf8';
$connection_array = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$db = new PDO($connection_string, USER, PASSWORD, $connection_array);
echo 'Database connection established';
}
catch(PDOException $e) {
$db = null;
}
}
}
我尝试访问 $db 变量(其中存储了 PDO 对象),但我收到一条错误消息 Call to a member function prepare() on a non-object in...
。这是我的 signup.php 文件当前的样子:
// Require needed classes
require_once('generic.php');
// Create needed objects
$generic = new Generic();
$datetime = date("Y-m-d H:i:s");
try {
$sql = "INSERT INTO user(
email,
name,
username,
password
)
VALUES(
:email,
:name,
:username,
:password
)";
$stmt = $db->prepare($sql);
$stmt->bindParam(':email', 'myemail@email.com', PDO::PARAM_STR);
$stmt->bindParam(':name', 'John Doe', PDO::PARAM_STR);
$stmt->bindParam(':username', 'johndow', PDO::PARAM_STR);
// use PARAM_STR although a number
$stmt->bindParam(':password', 'test123', PDO::PARAM_STR);
$stmt->execute();
}
catch(PDOException $e) {
echo $e;
}
我在 signup.php 文件中找不到通过数据库连接获取 $db 变量的方法,因此我可以执行查询。我试过 $db = $generic->db
,但这没有任何区别。
我是 OOP 的新手 PHP,正在尝试一些东西。我希望这个问题能解释我的问题。
首先,您没有调用 "connect_database" 函数,因此您的 $db 变量为空。
顺便说一下,我建议用描述性名称命名 class,例如 "DBHandler".
您将 "connect_database" 函数更改为私有函数,并在构造函数中简单地调用它。此外,将 $db 设为私有并设置一个 getter 函数以获得更易读的代码。
class DBHandler {
private $db;
function __construct() {
$this->connect_database();
}
public function getInstance() {
return $this->db;
}
private function connect_database() {
define('USER', 'user');
define('PASSWORD', 'password');
// Database connection
try {
$connection_string = 'mysql:host=localhost;dbname=mydb;charset=utf8';
$connection_array = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$this->db = new PDO($connection_string, USER, PASSWORD, $connection_array);
echo 'Database connection established';
}
catch(PDOException $e) {
$this->db = null;
}
}
}
现在您可以像这样使用您的代码(注意我已经更改了文件名和 class 名称):
// Require needed classes
require_once('dbhandler.php');
// Create needed objects
$dbh = new DBHandler();
// Check if database connection established successfully
if ($dbh->getInstance() === null) {
die("No database connection");
}
$datetime = date("Y-m-d H:i:s");
try {
$sql = "INSERT INTO user(
email,
name,
username,
password
)
VALUES(
:email,
:name,
:username,
:password
)";
$stmt = $dbh->getInstance()->prepare($sql);
$stmt->bindParam(':email', 'myemail@email.com', PDO::PARAM_STR);
$stmt->bindParam(':name', 'John Doe', PDO::PARAM_STR);
$stmt->bindParam(':username', 'johndow', PDO::PARAM_STR);
// use PARAM_STR although a number
$stmt->bindParam(':password', 'test123', PDO::PARAM_STR);
$stmt->execute();
}
catch(PDOException $e) {
echo $e;
}
更新:
更重要的是,除非您的值在 bindParam 和执行调用之间发生变化,否则您不需要使用 bindParam。
您可以简单地将数组中的值传递给执行:
$stmt->execute(array(':email' => 'email address', ':name' => 'Name', ':username' => 'User name', ':password' => 'Your password'));
有 2 个问题:您没有设置您的对象 属性 并且之后您没有正确处理它:
在您的 connect_database
函数中,您需要使用 $this->db
而不是 $db
。当你现在使用它时,你在函数的局部范围内设置了一个变量,一旦你退出该函数,它就会消失。
当你想像那样使用你的连接时,你需要$stmt = $generic->db->prepare($sql)
。
我在 generic.php 中有一个名为 generic 的 class。我有一个 signup.php 文件,它必须执行 SQL 查询。但是,我无法访问存储在变量 $db.
中的 generic.php 中创建的 PDO 对象通用 class 看起来像这样:
class Generic {
public $db;
public function connect_database() {
define('USER', 'user');
define('PASSWORD', 'password');
// Database connection
try {
$connection_string = 'mysql:host=localhost;dbname=mydb;charset=utf8';
$connection_array = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$db = new PDO($connection_string, USER, PASSWORD, $connection_array);
echo 'Database connection established';
}
catch(PDOException $e) {
$db = null;
}
}
}
我尝试访问 $db 变量(其中存储了 PDO 对象),但我收到一条错误消息 Call to a member function prepare() on a non-object in...
。这是我的 signup.php 文件当前的样子:
// Require needed classes
require_once('generic.php');
// Create needed objects
$generic = new Generic();
$datetime = date("Y-m-d H:i:s");
try {
$sql = "INSERT INTO user(
email,
name,
username,
password
)
VALUES(
:email,
:name,
:username,
:password
)";
$stmt = $db->prepare($sql);
$stmt->bindParam(':email', 'myemail@email.com', PDO::PARAM_STR);
$stmt->bindParam(':name', 'John Doe', PDO::PARAM_STR);
$stmt->bindParam(':username', 'johndow', PDO::PARAM_STR);
// use PARAM_STR although a number
$stmt->bindParam(':password', 'test123', PDO::PARAM_STR);
$stmt->execute();
}
catch(PDOException $e) {
echo $e;
}
我在 signup.php 文件中找不到通过数据库连接获取 $db 变量的方法,因此我可以执行查询。我试过 $db = $generic->db
,但这没有任何区别。
我是 OOP 的新手 PHP,正在尝试一些东西。我希望这个问题能解释我的问题。
首先,您没有调用 "connect_database" 函数,因此您的 $db 变量为空。 顺便说一下,我建议用描述性名称命名 class,例如 "DBHandler".
您将 "connect_database" 函数更改为私有函数,并在构造函数中简单地调用它。此外,将 $db 设为私有并设置一个 getter 函数以获得更易读的代码。
class DBHandler {
private $db;
function __construct() {
$this->connect_database();
}
public function getInstance() {
return $this->db;
}
private function connect_database() {
define('USER', 'user');
define('PASSWORD', 'password');
// Database connection
try {
$connection_string = 'mysql:host=localhost;dbname=mydb;charset=utf8';
$connection_array = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$this->db = new PDO($connection_string, USER, PASSWORD, $connection_array);
echo 'Database connection established';
}
catch(PDOException $e) {
$this->db = null;
}
}
}
现在您可以像这样使用您的代码(注意我已经更改了文件名和 class 名称):
// Require needed classes
require_once('dbhandler.php');
// Create needed objects
$dbh = new DBHandler();
// Check if database connection established successfully
if ($dbh->getInstance() === null) {
die("No database connection");
}
$datetime = date("Y-m-d H:i:s");
try {
$sql = "INSERT INTO user(
email,
name,
username,
password
)
VALUES(
:email,
:name,
:username,
:password
)";
$stmt = $dbh->getInstance()->prepare($sql);
$stmt->bindParam(':email', 'myemail@email.com', PDO::PARAM_STR);
$stmt->bindParam(':name', 'John Doe', PDO::PARAM_STR);
$stmt->bindParam(':username', 'johndow', PDO::PARAM_STR);
// use PARAM_STR although a number
$stmt->bindParam(':password', 'test123', PDO::PARAM_STR);
$stmt->execute();
}
catch(PDOException $e) {
echo $e;
}
更新:
更重要的是,除非您的值在 bindParam 和执行调用之间发生变化,否则您不需要使用 bindParam。
您可以简单地将数组中的值传递给执行:
$stmt->execute(array(':email' => 'email address', ':name' => 'Name', ':username' => 'User name', ':password' => 'Your password'));
有 2 个问题:您没有设置您的对象 属性 并且之后您没有正确处理它:
在您的
connect_database
函数中,您需要使用$this->db
而不是$db
。当你现在使用它时,你在函数的局部范围内设置了一个变量,一旦你退出该函数,它就会消失。当你想像那样使用你的连接时,你需要
$stmt = $generic->db->prepare($sql)
。