在非对象PHP上调用成员函数prepare()

时间:2013-03-02 22:13:41

标签: php mysql pdo

继承我的代码以连接数据库

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()进行调用?

2 个答案:

答案 0 :(得分:3)

您得到的是因为传递给$dbc方法的checkIfUserExists在全局范围内不可用,只在创建它的范围内(在这种情况下,{{1}的范围}})。

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

使用类似的东西:

createConnection

或者返回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变量并将其传递给其他函数。

  

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

答案 1 :(得分: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);