PDO数据库连接不能在其他类中使用,但其他类可以吗?

时间:2016-11-21 08:52:11

标签: php pdo

我一直在研究一个databaseHandler php类,它应该连接到数据库,然后可以在其他PHP文件中使用,至少这是计划。我遇到的问题是它不能在我的PHP类中使用任何与PDO相关的函数,我已经尝试检查它是否为null,或者根本没有设置(但它确实如此)并且我也尝试使用虚函数只是回想一下,如果这个类在其他人中没有被定义,那就是测试它。

<?php
class databaseHandler {

    private $db;
    private static $instance;

     function __construct() {
        $this->buildDatabaseConnection();
    }

    public static function getInstance() {
        if(!self::$instance) {
            self::$instance = new databaseHandler();
        }

        return self::$instance;
    }

    private function buildDatabaseConnection() {
        require 'dbconfig.php';
        try {
    $this->db = new PDO("mysql:host=" . HOST . ";dbname=" . DATABASE . ";charset=utf8", USER, PASSWORD);
    if(isset($this->db)) {
        if(!is_null($this->db)) {
            echo "isn't null";
        }
    }
    } catch(PDOException $e) {
        $e->getMessage();
    }
    }

    public function getConnection() {
        return $this->$db;
    }

    public function getSomeShit() {
        echo "some shit";
    }


}
?>

问题可能在于getConnection()php函数,它实际上是否在这里返回PDO对象?因为主要问题在于我在其他类中使用getConnection函数时出现此错误:

Notice: Undefined variable: database in     F:\Websites\DevProject\php\functions.php on line 69

Fatal error: Uncaught Error: Call to a member function prepare() on null in F:\Websites\DevProject\php\functions.php:69 Stack trace: #0 F:\Websites\DevProject\php\functions.php(51): register('qwe', 'sdasd', 'asdasd', 'asdas', '01-01-1970') #1 F:\Websites\DevProject\register.php(123): datelessRegister('qwe', 'sdasd', 'asdasd', 'asdas') #2 {main} thrown in F:\Websites\DevProject\php\functions.php on line 69

和第69行将是:

$stmnt = $database->prepare("SELECT $username, $email FROM " . USERTABLE);

$ database变量是类实例的地方:

$database = databaseHandler::getInstance();

如果我在注册php文件中尝试var_dump,它会告诉我:

object(databaseHandler)#1 (1) { ["db":"databaseHandler":private]=> object(PDO)#2 (0) { } }

然而,当我在我的函数中使用它时,它会说它是'NULL',为什么它在函数中为null但是全局定义?

所有错误都与对象有关,并且在那里它告诉我pdo是未定义的(我已经尝试检查它是否为null,但它不是!)

任何帮助都会很棒,提前谢谢。

3 个答案:

答案 0 :(得分:3)

getConnection方法的return语句中,你应该编写没有$的类变量:

return $this->db;

此外,您必须在PDO连接而不是数据库处理程序类上执行查询,因此$database = databaseHandler::getInstance();应该是

$database = databaseHandler::getInstance()->getConnection();

或者你可以简单地使用__call魔法来保持你现在的代码:

public function __call($method, $args)
{
    return call_user_func_array(array($this->db, $method), $args);
}

另外,为了阐明如何使用这个类,你应该在你需要使用数据库的每个方法中调用它,而不是只在文件的顶部调用一次,因为在那里定义它不会在你的方法中可用/ functions除非您不使用全局语句导入变量。但是,不鼓励使用全局变量,这被认为是一种不好的做法。有关如何使用数据库的示例如下:

public function doSomething()
{
    $db = databaseHandler::getInstance()->getConnection();
    $db->prepare(....);
}

public function doSomethingElse()
{
    $db = databaseHandler::getInstance()->getConnection();
    $db->prepare(....);
}

如果您知道类中有许多使用数据库的方法,那么您可以将其定义为类变量并在构造函数中设置db实例。

答案 1 :(得分:0)

问题似乎出现在getConnection()函数中。由于$ db是字段,你必须这样做。

[$ref]

然而,对于一个简单的问题,这是一个非常复杂的类结构。 您可以直接从PDO扩展您的课程

return $this->db;

每当你想进行数据库事务时,都要创建一个这样的对象。

class DatabaseHandler extends PDO {
    function __construct() {
        parent::__construct('mysql:host=host_name;dbname=db_name', 'user_name', 'password');
        parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
}

答案 2 :(得分:0)

您似乎遇到了范围问题。

$database = databaseHandler::getInstance();

function doSomething()
{
    // $database is not defined in this scope
    $database->getConnection()->prepare(/* ... */);
}

您必须将其声明为全局范围的一部分

function doSomething()
{
    global $database;
    $database->getConnection()->prepare(/* ... */);
}