2013-02-22 64 views
1

我的数据库类完美地工作,我把它叫做这个$db = new Database('user', 'pass', 'db', 'host');。我在我的脚本的顶部我定义了这个数据库,但后来在脚本中,我尝试使用函数内部的连接,但似乎$db不是全局的,所以我的函数无法访问它。我有可能在脚本中的每个函数内创建一个新的数据库类连接,但我真的想要访问$db作为全局访问点。从一个函数内部的php访问数据库类

下面是一些代码:

require_once('database_class.php'); 

$db = new Database('user', 'pass', 'db', 'host'); 



// I can reach the $db here and make the $db->PDO->'statement'(); 



function userExists($user) { 

    $bool = false; 

    // But in here I can't access $db... 
    $query = $db->PDO->query('SELECT * FROM login WHERE username = "$user"'); 

    $result = $query->fetch(); 

    if ($result) { 

     // User exists 
     $bool = true; 

    } 

    return $bool; 

} 
+1

研究约Singleton模式。它主要用于诸如你的目的。 – 2013-02-22 15:17:05

+0

不是真正的“答案”,但我主要做的是让类方法(函数)打开连接,执行查询,关闭连接,然后处理并返回数据。可能有些专家认为最好断开连接,但是我从来没有注意到这样做会对性能造成影响:) – 2013-02-22 15:50:28

回答

1

把全球$ DB在函数的开始,像这样:

function userExists($user) { 
     global $db; 

    // Rest of code here 

功能中的变量默认情况下只在PHP本地存在。要使用在函数外部声明的变量(不作为参数传递)(例如$ user),您需要使用如上所示的全局变量。

+0

但是,当变量在函数外部定义时,它是否自动地'全局',或者如何? – Dimser 2013-02-22 15:14:54

+0

要么将​​其作为函数参数传递,要么将该变量声明为全局变量。 – 2013-02-22 15:18:13

+2

@PhilipJensBramsted它在全局函数之外定义,但范围在函数内部是不同的。通过添加关键字'global',您可以将该变量添加到您的函数范围中。 – Mahdi 2013-02-22 15:23:02

1

你或许可以修改你的函数来把$ db var作为参数。例如:

function userExists($user, $db) { 
    ... 
} 

对象由默认引用传递(见here),这样你就不会被无意中使各调用$ db对象的副本。

+0

这将有很长的路要走,因为这个函数被一个被函数调用的函数调用了......但是,这其实可能是一种方法。 – Dimser 2013-02-22 15:27:05

0

我也使用类来进行连接和查询。但是这有助于你在类中定义连接所需的变量,所以你不必在每一页代码中都重复它们。 也许这个?使用数据库作为参数。

功能userExists($用户,$分贝){// codecodecode}