Php PDO致命错误:对非对象调用成员函数prepare()
请容忍我,因为我只是在学习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
$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保留字,则可以使用反勾号。