【问题标题】:Call to a member function on a non object error in mysql prepared statement在mysql准备好的语句中调用非对象错误的成员函数
【发布时间】:2016-05-21 09:26:59
【问题描述】:

我正在向我的页面添加关注个人资料功能。

我有一个关注按钮,如果数据库中有一行包含个人资料 ID 和会话 ID,则该按钮会更改为取消关注。如果此人点击取消关注,我会收到一条错误消息:

致命错误:在 blah blah 第 20 行中对非对象调用成员函数 execute()

这是我正在运行的代码:

function isFollow($mysqli){
if(isset($_POST['isFollow']))
    {
        $fed_id = filter_input(INPUT_POST, 'fed_id', FILTER_SANITIZE_NUMBER_INT);
        $fing_id = filter_input(INPUT_POST, 'fing_id', FILTER_SANITIZE_NUMBER_INT);
        $isFollow = filter_input(INPUT_POST, 'isFollow', FILTER_SANITIZE_NUMBER_INT);
        if($isFollow==0)
        {
            $fing_time=date("Y-m-d H:i:s");
            $insert_stmt = $mysqli->prepare("INSERT INTO follower (fed_user, fing_user, date_time) VALUES (?, ?, ?)");
            $insert_stmt->bind_param('iii', $fed_id, $fing_id, $fing_time);
            if($insert_stmt->execute())
            {
                header("Location:../?profile=".$fed_id."");
            }
        }elseif($isFollow==1)
        {
            $delete_stmt = $mysqli->prepare("DELETE FROM follower WHERE fed_id = ? AND fing_id = ?");
            $delete_stmt->bind_param('ii', $fed_id, $fing_id);
            if($delete_stmt->execute())
            {
                header("Location:../?profile=".$fed_id."");
            }
        }
}else
{
    die("Error!");
}
}

代码的第一部分有效。它在mysql中添加。它只是不会从中删除。

第 20 行是

$delete_stmt = $mysqli->prepare("DELETE FROM follower WHERE fed_id = ? AND fing_id = ?");

请注意,在这部分之前一切正常:

elseif($isFollow==1)
    {
        $delete_stmt = $mysqli->prepare("DELETE FROM follower WHERE fed_id = ? AND fing_id = ?");
        $delete_stmt->bind_param('ii', $fed_id, $fing_id);
        if($delete_stmt->execute())
        {
            header("Location:../?profile=".$fed_id."");
        }
    }

【问题讨论】:

  • 从文档中,它们不允许用于标识符(例如表或列名),在选择列表中命名要由 SELECT 语句返回的列,或者指定两个操作数二元运算符,例如 = 等号。后一种限制是必要的,因为不可能确定参数类型。不允许将标记与 NULL 进行比较?也为空。一般来说,参数仅在数据操作语言 (DML) 语句中是合法的,在数据​​定义语言 (DDL) 语句中是不合法的。

标签: php mysql


【解决方案1】:

这很可能是由于准备失败。尝试使用

打印错误
trigger_error( $mysqli->error, E_USER_ERROR );

在第 20 行之后检查出了什么问题。

您可能还想检查 $delete_stmt 正在使用什么类型和值

print_r( $delete_stmt );

或类似的。

【讨论】:

  • 谢谢! trigger_error 返回它无法识别其中一个 ID,因为它被设置为用户而不是 ID。
猜你喜欢
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多