PDO对象不在函数的范围内


PDO object not in scope of a function

好吧,我看到了一些类似的问题,但他们的例子都使用PHP类。。。我的没有。也许这就是问题所在?我不需要上课,因为我的网站在这个时候非常简单。

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

我可以成功地从另一个名为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作为参数传递给我的函数,瞧。

这是非常基本的PHP内容。函数中的变量是局部变量,除非使用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成功是真的。(

您需要将PDO对象作为参数传递给authenticate()函数:

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

哦,您应该在查询中使用该用户名的占位符,而不是容易受到SQL注入攻击的字符串串联。

因为$pdo是在函数authenticate外部声明的,所以它在函数内部不可用。您需要在中传递$pdo

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

或者在函数内部声明为全局,以便能够访问

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