好的,我看到了一些类似的问题,但是他们的例子都使用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
,这显然已经贬值并且气馁。
解决方案:好的,显然问题是我需要在我的 process.php 文件中添加require_once('config.php')
。不确定原因(当 index.php 首先运行时,是否已经包含它?)。然后我能够成功地将$pdo
作为参数传递给我的函数,并且瞧。
答案 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
之外声明,所以它在其中不可用。您需要在
function authenticate($u, $p, $pdo) {
$que = $pdo->query('...');
}
或在函数内声明它是全局的,以便能够访问它
function authenticate($u, $p) {
global $pdo;
$que = $pdo->query('...');
}