2013-03-02 46 views
-1

上下面有我的代码来连接到数据库呼叫一个成员函数准备()非对象PHP

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); 

我的问题是为什么会收到调用一个成员函数准备()在非页面加载时发生对象错误?

+0

AIAIAI,在面向对象的代码... – 2013-03-02 22:14:43

+1

全局我可能是错的工作,而是一个函数中创建$ DBC,不知道外面这个功能,对吗? – michi 2013-03-02 22:16:00

+1

除了@ WouterJ的回答之外,请记住PDO仅绑定数据变量。即你可以绑定?到用户名,但不能绑定表名。如果你有一个变量$表,你应该通过字符串操作将它包含在查询中。但请务必清理它,如果它来自用户:http://stackoverflow.com/questions/13405392/pdo-bindparam-issue/13406590#13406590 – 2013-03-02 22:34:32

回答

3

你要明白,因为你传递给checkIfUserExists方法$dbc是不是在全球范围内可用,仅在创建它的范围(在这种情况下,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 variabele在createConnection功能,并传递到其他功能。

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

+0

+1的完整代码:( – 2013-03-02 22:25:28

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); 
+0

请注意,您还需要将返回值保存在一个名为'$ dbc'的var中 – 2013-03-02 22:26:13

+0

是的,当然,我在我的回答中已经澄清了它。 – michi 2013-03-02 22:27:41

相关问题