2013-05-02 95 views
2

好的,我看到一些类似的问题,但他们的例子都使用PHP类...我的不是。也许这就是问题所在?我不应该需要上课,因为我的网站在这个时候非常简单。PDO对象不在函数范围内

无论如何,我正在尝试使用PDO连接到MySQL数据库。我在一个名为config.php的文件中连接到数据库,并在index.php中使用require_once()包含此文件。

我可以成功地从另一个名为process.php的文件查询数据库,但问题在该文件中的函数内;看起来我的DBO对象超出了该功能的范围。

下面是相关的代码片段:

的index.php

require_once('./lib/config.php'); 

的config.php

// tested and connects fine  
$pdo = new PDO('mysql:host=' . $hostname . ';dbname=' . $dbname, $username, $password, array(
    PDO::ATTR_PERSISTENT => true 
)); 

process.php

<?php 
... 
// can call $pdo fine in this file outside of functions 
... 

function authenticate($u, $p) { 
    // can't call $pdo in here, error says $pdo is non-object 
    $que = $pdo->query('select user_id, user_pass from users where user_name = \'' . $u . '\' limit 1'); 
    ... 
} 

?> 

顺便说一下,我使用的是PDO,因为我有类似的问题mysqli,并试图摆脱mysql,这显然是贬值和泄气。

编辑:我应该基于的回答,我在这个问题上得到了数首先澄清:我曾尝试通$ PDO作为一个参数去功能,随着错误消息没有运气或改变。

解决方法:好的,显然问题是我需要在我的process.php文件中添加require_once('config.php')。不知道为什么(当index.php首先运行时,是不是已经包含它了?)。然后,我成功地将$pdo作为参数传递给我的功能,并且瞧。

+0

在您的身份验证功能,'$ pdo'超出范围。将其作为参数传入,或将其声明为全局。 – andrewsi 2013-05-02 15:36:15

+0

如果你确实需要,在你的函数内声明它为'global $ pdo;'。你最好通过它,或者把'authenticate'放在课堂上。 – Aleph 2013-05-02 15:36:28

+0

使用适当的类和对象,然后使用依赖注入。 – 2013-05-02 15:36:54

回答

3

那就是pretty basic PHP stuff。除非使用关键字global加载它们,否则函数内部的变量是局部变量。我想您是这样的:

function authenticate(PDO $pdo, $u, $p) { 
    $que = $pdo->query('select user_id, user_pass from users where user_name = \'' . $u . '\' limit 1'); 
    //... 
} 

编辑:如果PHP声称$pdo不是一个对象,它不是一个对象,因此它并不真正的问题它是如何传递给函数。检查变量的权利,你叫authenticate()前:

var_dump($pdo); 

没有相关的代码有没有办法说为什么。 (假设这是真的,new PDO成功。)

+0

是的。我会在这里回应将PDO对象传递给函数的方法(这被称为依赖注入)。它比在函数中使用'global'更清洁。 – 2013-05-02 15:39:48

+0

是的,请看我的编辑,对不起。首先应该澄清的是,传递'$ pdo'作为参数是我尝试的第一件事,但没有成功。 – hannebaumsaway 2013-05-02 15:45:32

+0

感谢Alvaro,请参阅我的解决方案编辑。当本地需要(再次)config.php文件时,参数传递正如您所说的那样工作。不知道为什么我不得不要求config.php两次,但无论如何。 – hannebaumsaway 2013-05-02 16:01:16

0

你需要传递PDO对象作为参数传递给authenticate()功能:

function authenticate(PDO $pdo, $u, $p) { 
    // ..as in the question.. 
} 

哦,你应该使用一个占位符在查询用户名,而不是容易发生SQL注入攻击的字符串连接。

+0

谢谢。你看到的查询是为了这个目的而被取消的,而不是我将在我的代码中运行的实际查询:)。别担心,所有的东西都会在运行时被正确地转义。 – hannebaumsaway 2013-05-02 15:46:40

0

因为$pdo已被声明在函数authenticate之外,所以它不在其中。你需要为pass $ PDO在

function authenticate($u, $p, $pdo) { 
    $que = $pdo->query('...'); 
} 

或声明它作为函数内全球将能够访问它

function authenticate($u, $p) { 
    global $pdo; 
    $que = $pdo->query('...'); 
} 
+0

对不起,请参阅我的编辑。我曾尝试将'$ pdo'作为参数传入,但没有成功。 – hannebaumsaway 2013-05-02 15:45:56

+0

你不能仅仅通过'function authenticate($ u,$ p,$ pdo)'来传递它,你也必须在调用函数的时候这么做。 '$ result = authenticate($ u,$ p,$ pdo)' – RMcLeod 2013-05-02 15:57:34

+0

我知道,我做了两件。看到我的新编辑。问题在于缺少另一个'require_once()'调用来获取数据库连接。然后param传递工作。 – hannebaumsaway 2013-05-02 15:59:21

相关问题