PDO致命错误:在非对象上调用成员函数prepare()

时间:2013-08-16 00:24:48

标签: php pdo

请耐心等待我,因为我正在学习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;  
  }

2 个答案:

答案 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");