请耐心等待我,因为我正在学习PDO。无论如何,我一直收到错误:
致命错误:在非对象上调用成员函数prepare()
代码如下,我做错了什么?函数本身正在另一个文件中调用,如下所示:
$result = $database->confirmIPAddress($this->ip);
功能代码:
function confirmIPAddress($value) {
$stmt = $db->prepare("SELECT attempts, (CASE when lastlogin is not NULL and DATE_ADD(LastLogin, INTERVAL `.TIME_PERIOD.` MINUTE)>NOW() then 1 else 0 end) as Denied `.
` FROM `.TBL_ATTEMPTS.` WHERE ip = :ip");
$stmt->execute(array(':ip' => $value));
$data = $stmt->fetch(PDO::FETCH_ASSOC);
//Verify that at least one login attempt is in database
if (!$data) {
return 0;
}
if ($data["attempts"] >= ATTEMPTS_NUMBER)
{
if($data["Denied"] == 1)
{
return 1;
}
else
{
$this->clearLoginAttempts($value);
return 0;
}
}
return 0;
}
答案 0 :(得分:2)
这是一个变量范围问题,与PDO无关。在您的函数中,您使用变量$db
。我假设这是您在脚本主代码中设置的全局变量。在调用函数之前。在PHP中,全局变量在函数内部不会自动显示。您必须将变量作为参数传递,或使用global
声明:
function confirmIPAddress($value) {
global $db;
$stmt = $db->prepare(...);
...
}
答案 1 :(得分:0)
prepare()将返回 false ,否则如果您已将PDO配置为使用该错误模式,则会引发异常。
您的陈述存在一些语法问题。您似乎为表名和时间段嵌入了PHP常量,但是您使用了反向标记来分隔字符串。在这种情况下,您需要使用双引号。
当前声明:
$stmt = $db->prepare("SELECT attempts, (CASE when lastlogin is not NULL and
DATE_ADD(LastLogin, INTERVAL `.TIME_PERIOD.` MINUTE)>NOW() then 1 else 0 end)
as Denied `.
` FROM `.TBL_ATTEMPTS.` WHERE ip = :ip");
应该是:
$stmt = $db->prepare("SELECT attempts, (CASE when lastlogin is not NULL and
DATE_ADD(LastLogin, INTERVAL ".TIME_PERIOD." MINUTE)>NOW() then 1 else 0 end)
as Denied
FROM `".TBL_ATTEMPTS."` WHERE ip = :ip");