好吧,我看到了一些类似的问题,但他们的例子都使用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('...');
}