有一个小 pdo 问题,我已经研究了一段时间。由于我不知道这里出了什么问题,所以我想把它放到这个列表中。也许你们中的一些人知道更多...
我有一个带有登录名的网站,可以根据 mysql 驱动的数据库检查用户和密码。当在同一个文件中建立 pdo 连接时,一切正常,可以登录,没有任何问题。就像它应该工作一样......
但是,当将数据库连接部分移动到我从另一个文件中包含的单独函数时,pdo 对我失败,并给了我:
SQLSTATE [28000] [1045] 用户'...'@'...'的访问被拒绝(使用密码:否)致命错误:在/.../中的非对象上调用成员函数prepare() .../...在第 41 行
为了清楚起见,这里是代码:
版本 1:
这有效:
<?php
require "./vars_and_functions.php";
/* open database connection */
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
/* query */
$query = "SELECT uname, passw FROM members WHERE uname = ? AND passw = ?";
$q = $pdo->prepare($query);
$q->execute(array($u_name, $p_word_md5));
$result = $q->rowCount();
if($result == 1) { /* we have a match */
/* close the database connection */
$pdo = null;
/* and redirect */
header("...");
} /* if */
else { /* wrong credentials */
/* close the database connection */
$pdo = null;
/* and go back to the login page */
header("...");
} /* else */
} /* try */
catch(PDOException $e) {
echo $e->getMessage();
} /* catch */
?>
这里是版本 2
这不起作用:
<?php
require "./vars_and_functions.php";
/* open database connection */
$pdo = database_connection();
/* query */
$query = "SELECT uname, passw FROM members WHERE uname = ? AND passw = ?";
$q = $pdo->prepare($query);
$q->execute(array($u_name, $p_word_md5));
$result = $q->rowCount();
if($result == 1) { /* we have a match */
/* close the database connection */
$pdo = null;
/* and redirect */
header("...");
} /* if */
else { /* wrong credentials */
/* close the database connection */
$pdo = null;
/* and go back to the login page */
header("...");
} /* else */
} /* try */
catch(PDOException $e) {
echo $e->getMessage();
} /* catch */
?>
我的包含文件 vars_and_functions.php 如下所示:
$db_host = "...";
$db_name = "...";
$db_user = "...";
$db_pass = "...";
function database_connection() {
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
}
catch(PDOException $e) {
echo $e->getMessage();
}
return $pdo;
}
在我看来,唯一真正的区别是,在这里,pdo 连接是通过函数调用建立的,而函数位于包含文件 vars_and_functions.php 中。
这里有什么问题?