【发布时间】:2013-08-21 16:54:38
【问题描述】:
使用 PDO 选择通过 AJAX 调用发送的数据时,我的 PHP 中出现 Call to a member function prepare() on a non-object 错误。
在 StackOverflow 上四处搜索,我找到了很多关于这个错误的答案,但没有一个可以解决我的问题。
奇怪的是,其他 PHP 文件使用相同的 PDO 调用并成功运行,但这个只给了我非对象错误。
请注意,PDO 连接与其工作的其他页面相同,所以我知道这不会导致问题。
另外,我已经测试了发送的 AJAX 数据正在被接收,并且也可以正常工作。
PHP 代码
$mysql_user = "NotTelling";
$mysql_password = "DefinatelyNotThis";
try
{
$dbh = new PDO("mysql:host=somehost;dbname=somename", $mysql_user, $mysql_password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$username = $_POST['username'];
$inPword = $_POST['password'];
$lat = $_POST['lat'];
$lon = $_POST['lon'];
$loggedin = "";
$password_hash = "";
$loggedinstatus = "";
$pts = "";
function getLoginInfo()
{
$sth = $dbh -> prepare('SELECT pword, loggedin, points FROM login WHERE uname = :uname');
$sth->bindParam(':uname', $username, PDO::PARAM_STR);
while($row = $sth->fetch(PDO::FETCH_ASSOC))
{
echo $row['pword'];
echo $row['loggedin'];
echo $row['points'];
}
$password_hash = $fetch['pword'];
$loggedinstatus = $fetch['loggedin'];
$pts = $fetch["points"];
if($password_hash === null || $loggedinstatus === null || $pts === null)
{
die(json_encode(array("message" => "none")));
}
else
{
return "more";
}
}
function checkLoginCreds()
{
if(crypt($inPword, $password_hash) === $password_hash)
{
switch($loggedinstatus)
{
case "no":
$sel = $dbh->prepare("UPDATE login SET loggedin='yes' WHERE uname = ?");
$sel->execute(array($username));
return "AllGood";
break;
defaut:
return "alreadyin";
break;
}
}
else
{
return "BadLogin";
}
}
if(getLoginInfo() === "more")
{
echo json_encode(array("message" => checkLoginCreds()));
}
getLoginInfo();
}
catch(PDOException $e)
{
echo $e->getMessage();
file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}
最后,这是我var_dump() PDO 连接时的输出。
object(PDO)#1 (0) {}
【问题讨论】:
-
$dbh未在您的函数中定义。 -
修正了@andrewsi 的格式
-
你应该在一个类中定义整个东西,或者在每个需要数据库连接的函数中连接到数据库..
-
@copilot0910 - 仍然不能解决问题。
$dbh超出范围 - 要么将其作为参数传递给函数,要么将其声明为全局。 -
@blo 我已经看到了类方法,但不知道该怎么做。另外,为什么它在这个文件中不起作用,而在所有其他文件中都起作用?
标签: php mysql database pdo prepared-statement