【发布时间】:2013-04-26 20:41:44
【问题描述】:
好的,我看到了一些与我类似的问题,但他们的示例都使用 PHP 类......我的没有。也许这就是问题所在?我不应该需要课程,因为我的网站目前非常简单。
无论如何,我正在尝试使用 PDO 连接到 MySQL 数据库。我在一个名为config.php 的文件中很好地连接到数据库,并将这个文件包含在index.php 和require_once() 中。
我可以从另一个名为process.php 的文件中成功查询数据库,但问题出在该文件中的函数内;看来我的 DBO 对象超出了该函数的范围。
以下是相关代码sn-ps:
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 作为参数传递给我的函数,瞧。
【问题讨论】:
-
在您的身份验证功能中,
$pdo超出范围。将其作为参数传入,或将其声明为全局。 -
如果你真的必须,在你的函数中将它声明为
global $pdo;。不过,你最好通过它或将authenticate放在一个类中。 -
使用正确的类和对象,然后使用依赖注入。