【问题标题】:I keep getting Fatal error: Call to a member function bind_param() on a non-object posting with sqli query我不断收到致命错误:使用 sqli 查询在非对象发布上调用成员函数 bind_param()
【发布时间】:2013-09-06 08:57:34
【问题描述】:

我正在 phpMyAdmin 中从 MySQL 数据库中获取数据。然后,我将该数据加载到表单上的多个文本框中。用户可以编辑此数据,然后按Save Changes 按钮,这是我表单上的submit 按钮。当提交按钮运行时,它应该运行$app->post('/admin-edit-stack'下面的函数并更新数据库中的数据,但我得到了错误消息。

我查看了文档和其他示例,但我看不出我做错了什么来输出这个错误!

完整的错误信息是:

Fatal error: Call to a member function bind_param() on a non-object in index.php on line 117

这是完整的更新功能:

$app->post('/admin-edit-stack', isAuthenticated($app),function () use($app,$data, $stacks, $link){
    $id = $_POST['stack-id'];
    $name = $_POST['stack-name'];
    $slug = $_POST['stack-slug'];
    $icon = $_POST['stack-icon'];
    $sql = $link->prepare("UPDATE stacks WHERE ID=? SET Name=?, Slug=?, Icon = ?");
>>> $sql->bind_param("isss", $id, $name, $slug, $icon);  <<<ERROR HERE
    $sql->execute();
    $sql->close();
    $app->view()->appendData(array("username" => getUsername($app)));
    $app->redirect($app->urlFor('admin'));
})->name('admin-edit-stack');

这是在提交时运行函数的 html 表单代码:

<form class="forms" method="POST" action="/admin-edit-stack">
    <input type="hidden" name="stack-id" value="{{data.ID}}">
    <label>Name: </label>
    <input type="text" class="input-block-level" placeholder="Name" name="stack-name" value="{{data.Name}}"></br>
    <label>Slug: </label>
    <input type="text" class="input-block-level" placeholder="Slug" name="stack-slug" value="{{data.Slug}}"></br>
    <label>Icon: </label>
    <input type="text" class="input-block-level" placeholder="Icon" name="stack-icon" value="{{data.Icon}}"></br>
    <button class="btn btn-success" type="submit"><i class="icon-check"></i> Save Changes</button>
    <a class="btn btn-danger" href="/admin"><i class="icon-remove-circle"></i> Cancel</a>
</form>

这是表格的图片:

我刚刚意识到 SET 和 WHERE 部分是错误的。这是新功能:

$app->post('/admin-edit-stack', isAuthenticated($app),function () use($app,$data, $stacks, $link){
$id = $_POST['stack-id'];
$name = $_POST['stack-name'];
$slug = $_POST['stack-slug'];
$icon = $_POST['stack-icon'];
if ($sql = $link->prepare("UPDATE stacks SET Name=?, Slug=?, Icon = ? WHERE ID=?")){
$sql->bind_param("isss", $id, $name, $slug, $icon);
$sql->execute();
        $sql->close();
}
else {
    //Error
    printf("Prep statment failed: %s\n", $link->error);
}
$app->view()->appendData(array("username" => getUsername($app)));
$app->redirect($app->urlFor('admin'));
})->name('admin-edit-stack');

这现在不输出错误消息,但仍然不更新数据库。有什么想法吗?

【问题讨论】:

    标签: php forms mysqli slim


    【解决方案1】:

    您没有对$sql = $link-&gt;prepare() 调用进行任何错误检查。如果上一行失败,您将在 bind_params 行上收到此错误,因此 $sql 设置不正确。

    来自PHP manual

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

    您可以通过两种方式进行错误处理:

    1. 开启 PDO 异常,并使用try ... catch 错误处理。

    2. 检查$sql 是否未设置,它会告诉您发生了错误,如果需要,请使用$link-&gt;errorCode() 查找有关错误的更多信息。

    【讨论】:

    • 干杯@Spudley,这帮助我找到了问题..但它似乎仍然没有更新数据库。我已经把编辑好的代码放在上面了,有什么想法吗?
    • 啊,我刚刚发现你正在使用 mysqli... 我在想 PDO,因为我已经习惯了。相同的基本内容适用,但我对 mysqli 有点生疏。
    • 建议:尝试将所有表格和字段名称包含在反引号中。 --UPDATE `stacks` SET `Name`=?, `Slug`=?, `Icon` = ? WHERE `ID`=?。如果您使用的是 mySQL 保留字的字段名,这将避免出现问题(我认为您不是,但无论如何这是一个好习惯)。还要检查您的大小写;例如,您的字段名称实际上是否有大写字段字母? mySQL 对这些东西很敏感。
    • 我现在可以正常工作了,我的 if ($sql = $link-&gt;prepare("UPDATE stacks SET Name=?, Slug=?, Icon = ? WHERE ID=?")){ $sql-&gt;bind_param("isss", $id, $name, $slug, $icon); 不匹配。所以我正在用 ID 等更新名称。现在全部排序,感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多