0

我是使用 PDO 的新手,我可以使用所有这些来添加和删除条目,但我无法让它更新数据。我不确定我的 sql 语句是否关闭,或者我只是在这里遗漏了一些东西。

if (isset($_GET['id'])) {
    $id = $_GET['id'];
    $data = $article->fetch_data($id);

    if(isset($_POST['title'], $_POST['content'])) {
        $title = $_POST['title'];
        $content = nl2br($_POST['content']);

        if (empty($title) or empty($content)) {
            $error = 'All fields are required!';
        } else {
            $query = $pdo->prepare('UPDATE articles SET article_title = ?, article_content = ?, article_timestamp = ? WHERE article_id = $id');

            $query->bindValue(1, $title);
            $query->bindValue(2, $content);
            $query->bindValue(3, time());

            $query->execute();

            header('Location: index.php');
        }
    }
}
4

2 回答 2

2

您需要双引号查询以插入 $id 变量。如果您使用单引号,您的变量将被解释为 $id。

$query = $pdo->prepare("UPDATE articles SET article_title = ?, article_content = ?, article_timestamp = ? WHERE article_id = $id");

正如其他人所说,这可能导致 SQL 注入。

相反,您还应该绑定 $id 变量:如果您使用 int 作为您的 id,您可能还想使用PDO::PARAM_INT. 例子$query->bindValue(4, $id, PDO::PARAM_INT);

$query = $pdo->prepare("UPDATE articles SET article_title = ?, article_content = ?, 

article_timestamp = ? WHERE article_id = ?");
$query->execute(array($title, $content, time(), $id));
于 2013-06-16T02:15:01.810 回答
1

我个人会这样写:

if (isset($_GET['id'])) {
    $id = $_GET['id'];
    $data = $article->fetch_data($id);

    if(isset($_POST['title'], $_POST['content'])) {
    $title = $_POST['title'];
    $content = nl2br($_POST['content']);

    if (empty($title) or empty($content)) {
        $error = 'All fields are required!';
    } else {
        $sql = "UPDATE articles SET article_title = :title, article_content = :content, article_timestamp = :timestamp WHERE article_id = :id";
        $query = $pdo->prepare($sql);

        $query->bindValue(":title", $title);
        $query->bindValue(":content", $content);
        $query->bindValue(":timestamp", time());
        $query->bindValue(":id", $id);


        try {
          $result = $query->execute();
        } catch(PDOException $e) {
          echo $e->getCode() . " - " . $e->getMessage();
        }

        if($result) {
          header('Location: index.php');
        }
    }
}

}

这只是我的首选方式。如果您正在接受用户输入(我假设您来自$_GET['id']),那么您也应该传递 ID 的绑定,以帮助您进一步防止 SQL 注入。此外,我学习 PDO 的方法是将我的变量与“:”绑定。不能说我真的见过有人用吗?在处理 PDO 时,但我又更像是一个单独的开发人员。

无论如何,这应该给你你所需要的。

编辑:还有一件事我忘了提。添加$result = $query->execute();因为 PDO 如果语句成功则返回 true,否则返回 false。因此,您可以重定向到不同的页面或使用 Flash 消息等重新显示表单。

于 2013-06-16T02:25:06.207 回答