0

请多多包涵,因为我只是在学习 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;  
  }
4

2 回答 2

2

这是一个变量范围问题,与 PDO 无关。在您的函数中,您使用变量$db. 我假设这是您在脚本的主代码中设置的全局变量。在调用函数之前。在 PHP 中,全局变量在函数内部不会自动可见。您必须将变量作为参数传入,或使用global声明:

function confirmIPAddress($value) {
    global $db;
    $stmt = $db->prepare(...);
    ...
}
于 2013-08-16T00:28:37.593 回答
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");
于 2013-08-16T00:32:05.087 回答