访问另一个文件中的 PHP PDO 对象

ero*_*msr 0 php mysql oop pdo

我在 generic.php 中有一个名为 generic 的类。我有一个 signup.php 文件,它必须执行 SQL 查询。但是,我无法访问在 generic.php 中创建的 PDO 对象,该对象存储在变量 $db 中。

泛型类如下所示:

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;
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

我尝试访问 $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;
}
Run Code Online (Sandbox Code Playgroud)

我在我的 signup.php 文件中找不到通过数据库连接获取 $db 变量的方法,因此我可以执行查询。我试过了$db = $generic->db,但这没有任何区别。

我是 OOP PHP 的新手并尝试了一些东西。我希望这个问题可以解释我的问题。

Ron*_*don 5

首先,您没有调用“connect_database”函数,因此您的 $db 变量为空。顺便说一句,我建议使用描述性名称命名类,例如“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;
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

现在你可以像这样使用你的代码(注意我已经改变了文件名和类名):

// 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;
}
Run Code Online (Sandbox Code Playgroud)

更新:

更重要的是,除非您的值在 bindParam 和执行调用之间发生变化,否则您不需要用户 bindParam。

您可以简单地将数组中的值传递给执行:

$stmt->execute(array(':email' => 'email address', ':name' => 'Name', ':username' => 'User name', ':password' => 'Your password'));
Run Code Online (Sandbox Code Playgroud)