-1

这是我连接到数据库的代码

function createConnection($DB_USER, $DB_PASSWORD){

    $dbc = new PDO('mysql:host=****', $DB_USER, $DB_PASSWORD);

}

和下面是被调用函数的代码

function checkIfUserExists($dbc, $username, $table){

    global $dbc;

    $stmt = $dbc->prepare("SELECT * FROM ? WHERE username = ?");
    $stmt = bindParam(1, $table);
    $stmt = bindParam(2, $username);
    $stmt->execute();

}

下面是我用来调用它们的代码

$connect = new databaseOperations;
$connect->createConnection($DB_USER, $DB_PASSWORD);
$connect->checkIfUserExists($dbc, login, Username);

我的问题是为什么我在页面加载时在非对象错误上调用成员函数 prepare()?

4

2 回答 2

3

您会得到它,因为$dbc您传递给该checkIfUserExists方法的方法在全局范围内不可用,只能在创建它的范围内(在本例中为 的范围createConnection)。

解决方案很简单:永远不要在您的代码中使用全局变量,并且您应该使用全局变量的最后一个代码是在 OOP 代码中。

使用这样的东西:

class DatabaseOperations
{
    private $dbc;

    public function createConnection(...)
    {
        $this->dbc = new PDO(...);
    }

    public function checkIfUserExists(...)
    {
        $this->dbc->prepare(...);
        // ...
    }
}

$db = new DatabaseOperations();
$db->createConnection(...);
$db->checkIfUserExists(...);

或者返回函数$dbc中的createConnection变量并将其传递给其他函数。

重要的旁注:这肯定不是你应该使用类的方式。阅读有关 OOP 和类似程序的内容。在这种情况下,您通常在User(Active Record) 或UserMapper(DataMapper) 对象上有一个方法来检查它是否存在。

于 2013-03-02T22:20:15.707 回答
0
function createConnection($DB_USER, $DB_PASSWORD){

    $dbc = new PDO('mysql:host=****', $DB_USER, $DB_PASSWORD);
    return $dbc; // <---- add this...

}

function checkIfUserExists($dbc, $username, $table){

// ---> no need to use global, because you pass $dbc as an argument

打电话...

$dbc = $connect->createConnection($DB_USER, $DB_PASSWORD);
于 2013-03-02T22:20:34.597 回答