【问题标题】:Call to a member function bindParam() on boolean in PHP prepared statements [duplicate]在 PHP 准备好的语句中调用布尔值上的成员函数 bindParam() [重复]
【发布时间】:2017-07-12 07:54:51
【问题描述】:

所以在参考 w3schools 后,我正在 PDO 尝试一个项目,但我不断收到此错误

在布尔值上调用成员函数 bindParam()

这是我的代码。我不知道是什么原因造成的

if (isset($data->title) && isset($data->content) && isset($data->lang) && isset($data->show_on_site)) {
    $response = array();
    try {
        $sql = 'INSERT INTO newsposts
            (heading, content, author, language,show_on_page)
             VALUES (:title, :content,:author,:lang,:show_on_site)';

        $stmt = $db->prepare($sql);
        $stmt->bindParam(':title', $db->real_escape_string($data->title), PDO::PARAM_STR);
        $stmt->bindParam(':content', $db->real_escape_string($data->content), PDO::PARAM_STR);
        $stmt->bindParam(':author', $_SESSION['user_session'], PDO::PARAM_STR);
        $stmt->bindParam(':lang', $db->real_escape_string($data->lang), PDO::PARAM_STR);
        $stmt->bindParam(':show_on_site', $db->real_escape_string($data->show_on_site), PDO::PARAM_BOOL);

        if ($stmt->execute()) {
            header_status(200);
            $response['status'] = 'Success';
            $response['message'] = 'Post Inserted';
        } else {
            header_status(400);
            $response['status'] = 'Error';
            $response['message'] = 'Something went wrong';
        }
        echo json_encode($response);
    } catch (exception $e) {
        header_status(503);
        $response['status'] = 'Error';
        $response['message'] = $e->getMessage();
        echo json_encode($response);
    }

【问题讨论】:

  • 如果prepare() 失败,它可能会返回FALSE。我认为这是原因,但不明白为什么会失败......
  • 尝试将$stmt->bindParam(':show_on_site', $db->real_escape_string($data->show_on_site), PDO::PARAM_BOOL);更改为$stmt->bindParam(':show_on_site', $db->real_escape_string($data->show_on_site), PDO::PARAM_STR);
  • 你在哪里定义 $db 和在准备之前你有没有像 if($db instanceof PDO) 这样的支票?
  • 错误与$db 有关。未与数据库建立连接,因此连接函数返回false。这就是导致错误的原因。
  • @UsagiMiyamoto 是的,你是对的,$db->prepare($sql) 部分返回 false。但为什么会这样呢?

标签: php mysql pdo prepared-statement


【解决方案1】:

作为documentation states:

如果数据库服务器无法成功准备语句, PDO::prepare() 返回 FALSE 或发出 PDOException(取决于 error handling)。

所以尝试将$db 对象中的“错误模式”设置为“异常”

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

并将prepare() 调用包装在“try-catch”块中以找出问题所在,像这样

try {
    $stmt = $db->prepare($sql);
} catch (PDOException $e) {
    echo $e->getMessage();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 2011-11-10
    • 2016-05-10
    • 2016-05-26
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多