【问题标题】:Fatal error: Uncaught Error: Call to a member function close() on bool [duplicate]致命错误:未捕获的错误:在 bool 上调用成员函数 close() [重复]
【发布时间】:2022-01-21 02:48:35
【问题描述】:

在我用于更新功能的库存管理应用程序中,设置 sql 后,我正在执行 $stmt,如果它成功执行,我将前往主页。否则做一些其他的动作。在我准备sql命令并执行它的if语句中,我用$stmt->close()关闭$stmt。但这给我带来了上面的错误。我遵循了一些其他问题的答案,他们建议在 if 语句中移动 close() 行。但它没有用。

Update.php

    // Check input errors before inserting in database
    if(empty($itemname_err) && empty($itemnumber_err) && empty($cost_err)&& empty($details_err)){
        // Prepare an update statement
        $sql= "UPDATE inventory SET itemname=$itemname, itemnumber=$itemnumber, cost=$cost,details=$details, WHERE id = $id";
      
        if($stmt = $mysqli->prepare($sql)){
   
            // Set parameters
            $param_itemname = $itemname;
            $param_itemnumber = $itemnumber;
            $param_cost = $cost;
            $param_details = $details;
            $param_id = $id;
    
            //$stmt->bind_param("sssss", $param_itemname, $param_itemnumber, $param_cost, $param_details, $param_id);
            // Attempt to execute the prepared statement
            if($stmt->execute()){
                // Records updated successfully. Redirect to landing page
                header("location: index.php");
                exit();
            } else{
                echo "Oops! Something went wrong. Please try again later.";
            }
        }
        // Close statement
        $stmt->close(); // here's the problem line
    }
    // Close connection
    $mysqli->close(); 
    }else{
        ...
}

我尝试检查 sql,但对我来说似乎很好。那么有什么建议吗?

【问题讨论】:

  • 你实际上不需要关闭,当脚本终止时 PHP 会这样做
  • @RiggsFolly 我什至尝试删除该行..但它没有做任何事情,没有更新...没有事件将我带到主页
  • 您的准备​​很可能失败,但您没有对错误采取任何措施。
  • @NigelRen 我是这么认为的......不知何故它返回错误......不知道为什么
  • 在查询中details=$details, 之后还有一个尾随,

标签: php mysqli


【解决方案1】:

您使用的准备查询的概念都错了。这个想法是您准备一个带有占位符的查询,而不是实际数据。从查询编译阶段移除数据,移除将错误代码注入 SQL 的能力。

您得到的错误是因为准备失败,因此您的代码跳转到 IF 之后的行,您尝试向我们提供 $stmt 变量,该变量现在包含 FALSE,就好像它是一个对象一样,它会已经,如果查询成功的话。

所以试试这个

    // Check input errors before inserting in database
    if( empty($itemname_err) && empty($itemnumber_err) && 
        empty($cost_err) && empty($details_err))
    {
        // Prepare an update statement
        $sql= "UPDATE inventory SET itemname=?, itemnumber=?, 
                                    cost=?, details=? 
                                    WHERE id = ?";
      
        $stmt = $mysqli->prepare($sql);
    
        $stmt->bind_param("sidsi", $itemname, $itemnumber, 
                                    $cost, $details, $id);
        // Attempt to execute the prepared statement
        if($stmt->execute()){
            // Records updated successfully. Redirect to landing page
            header("location: index.php");
            // these 2 are unnecessary but if they go anywhere it 
            // should be before the exit statement
            $stmt->close();
            $mysqli->close(); 

            exit();
        } else{
            echo "Oops! Something went wrong. Please try again later.";
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多