我是使用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');
}
}
}
答案 0 :(得分: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));
答案 1 :(得分: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消息等重新显示表单。