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

Php PDO致命错误:对非对象调用成员函数prepare(),php,pdo,Php,Pdo,请容忍我,因为我只是在学习PDO。不管怎样,我一直都会发现错误: 致命错误:对非对象调用成员函数prepare() 代码如下,我做错什么了吗?函数本身正在另一个文件上调用,如下所示: $result = $database->confirmIPAddress($this->ip); 功能代码: function confirmIPAddress($value) { $stmt = $db->prepare("SELECT attempts, (CASE when la

请容忍我,因为我只是在学习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;  
  }

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

function confirmIPAddress($value) {
    global $db;
    $stmt = $db->prepare(...);
    ...
}
如果存在任何解析错误,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");

可能该函数中不知道
$db
?您没有将
$db
设置为任何值。已修复:),谢谢。我不断收到致命错误:未捕获异常“PDOException”和消息“SQLSTATE[42000]:语法错误或访问冲突:1064,现在有任何修复方法吗?请参阅我的答案,了解语法错误的修复方法。有没有其他解决方法,因为即使我有全局变量,我也会遇到相同的问题谢谢您,先生。您的解决方案成功了,只是好奇这样做是否正确。TBL\U尝试。
?或者“.TBL_尝试次数”是否也可以接受?如果需要对TBL_尝试次数进行分隔,即如果表名包含特殊字符、空格或SQL保留字,则可以使用反勾号。