PDO对象不在函数范围内

时间:2013-05-02 15:34:34

标签: php pdo mysqli

好的,我看到了一些类似的问题,但是他们的例子都使用PHP类...我的不是。也许那就是问题?我不应该上课,因为我的网站目前非常简单。

无论如何,我正在尝试使用PDO连接到MySQL数据库。我在名为config.php的文件中连接到db fine,并将此文件包含在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作为参数传递给我的函数,并且瞧。

3 个答案:

答案 0 :(得分: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成功了。)

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

因为$pdo已在函数authenticate之外声明,所以它在其中不可用。您需要在

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

或在函数内声明它是全局的,以便能够访问它

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