0

我正在从 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');

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

4

1 回答 1

1

您没有对$sql = $link->prepare()通话进行任何错误检查。bind_params如果上一行失败并且$sql设置不正确,您将在该行上收到此错误。

PHP 手册

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

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

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

  2. 检查$sql未设置,这将告诉您发生了错误,然后$link->errorCode()在需要时用于查找有关错误的更多信息。

于 2013-09-06T09:09:35.517 回答