我创建了一个CMS,以便管理员用户无需编辑代码即可更轻松地对网站进行更改。
因此,基本上,管理员用户登录网站后,便应该能够添加,删除和编辑内容。我已经设法使添加和删除功能正常工作,但是我在编辑部分上很挣扎。
当用户决定编辑时,他们将被定向到显示存储在数据库中的每篇文章的页面,然后他们可以单击想要编辑的任何文章。数据通过功能$articles = $article->fetch_all();
从数据库中获取。在新页面上,脚本将使用$data = $article->fetch_data($id);
从mysql表中获取数据。这可以正常工作,并且可以按我想要的方式获取数据。但是,当我进行任何更改并单击“更新内容”按钮时,我仅被重定向到空白页,并且未保存任何更改。我试图查找错误,但未显示任何错误,也看不到我要去哪里。文章类是存储上述功能的地方。
我尝试了几种不同的更新方式,但实际上都没有,并且我看不到哪里出错了。
这是管理员决定进行编辑时首先看到的页面:
<?php
session_start();
include_once('../includes/connection.php');
include_once('../includes/article.php');
$article = new Article;
$articles = $article->fetch_all();
if (isset($_SESSION['logged_in'])) {
?>
<html>
<head>
<title>Select the content you want to edit</title>
<link rel="stylesheet" href="../assets/style.css"/>
</head>
<body>
<div class="container">
<a href="index.php" id="logo">CMS</a>
<br /><br />
<h4>Select the content you want to edit</h4>
<table>
<thead>
<tr>
<th>Article ID</th>
<th>Artilce Title</th>
<th>Article Content</th>
</tr>
</thead>
<tbody>
<?php foreach ($articles as $article) : ?>
<tr>
<td><?php echo ($article["article_id"]); ?></td>
<td><?php echo ($article["article_title"]); ?></td>
<td><?php echo ($article["article_content"]); ?></td>
<td><a href="update.php?id=<?php echo $article['article_id'];?>">Edit</a></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</html>
<a href="index.php">Back to home</a>
<?php
}else{
header('Location: index.php');
}
?>
一旦管理员单击一个进行编辑,他们将被定向到update.php
页面:
<?php
session_start();
include_once('../includes/connection.php');
include_once('../includes/article.php');
$article = new Article;
if (isset($_SESSION['logged_in'])) {
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 = :article_content
WHERE article_id = :article_id";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':article_title', $_POST['title'], PDO::PARAM_STR);
$stmt->bindParam(':article_content', nl2br($_POST['$content']), PDO::PARAM_STR);
$stmt->bindParam(':article_id', $_POST['article_id'], PDO::PARAM_INT);
$stmt->execute();
header('Location: index.php');
}
}
?>
<html>
<head>
<title>CMS Tutorial</title>
<link rel="stylesheet" href="../assets/style.css"/>
</head>
<body>
<div class="container">
<a href="index.php" id="logo">CMS</a>
<br />
<h4>Update Article</h4>
<?php if (isset($error)) { ?>
<small style="color:#aa0000"><?php echo $error; ?></small>
<br /><br />
<?php } ?>
<form action ="update.php" method="post" autocomplete="off">
<input type="text" value ="<?php echo $data['article_title']; ?>"name="title"/required><br /><br />
<textarea rows="15" cols="50" required name="content"> <?php echo $data['article_content']; ?></textarea><br /><br />
<input type="submit" value="Update Content"/>
</form>
</div>
</body>
<html>
<?php
}
}else{
header('Location: index.php');
}
?>
看着教程,看来我做得正确,但是每次我都被重定向到空白页面,而没有任何更新。
编辑:经过一番处理之后,问题似乎出在我提取数据的方式上:
if (isset($_GET['id'])) {
$id = $_GET['id'];
$data = $article->fetch_data($id);
我的fetch_data函数的工作方式:
公共函数fetch_data($ article_id){ 全球$ pdo;
$query = $pdo->prepare("SELECT * FROM articles WHERE article_id = ?");
$query->bindValue(1, $article_id);
$query->execute();
return $query->fetch();
}
我更改了添加的sql,因为我知道我可以使它工作,但是它做了同样的事情(在提交表单时进入空白页),直到我摆脱了获取数据的方式。所以我知道这一定与它有关,但我一生都无法弄清楚
我在哪里可能会出错?
答案 0 :(得分:1)
以前,我建议未定义$ pdo。您评论的情况并非如此,您说得对,因此我进行了详细介绍。
主要原因是,当您发布表单时,“ article_id”未提交。表格中仅有的两个字段是“标题”和“内容”。查询字符串中的“ id =”不会神奇地包含在您的表单中。因此,我们将ID作为隐藏输入添加到表单中:
<input type="hidden" name="id" value="<?php echo $data['article_id']; ?>">
我们还没有-因为只有在设置了$ _GET ['id']后才处理表单,但是这次我们使用POST。 $ _REQUEST ['id']将解决问题,它将处理$ _GET ['id']和$ _POST ['id'],因此请替换这两行:
if (isset($_REQUEST['id'])) {
$id = $_REQUEST['id'];
在您的PDO语句中,用id替换article_id,并且由于您已经分配了$ title和$ content,我们也要对其进行清理:
$stmt->bindParam(':article_title', $title, PDO::PARAM_STR);
$stmt->bindParam(':article_content', $content, PDO::PARAM_STR);
$stmt->bindParam(':article_id', $id, PDO::PARAM_INT);
答案 1 :(得分:1)
因此,在经过Jeroen Flamman和Jacques Barker提供的非常有帮助的答案之后(真的很感谢帮助!),在尝试了它之后,我设法通过以下方法使它最终起作用:
<?php
session_start();
include_once('../includes/connection.php');
include_once('../includes/article.php');
$article = new Article;
if (isset($_SESSION['logged_in'])) {
if (isset($_REQUEST['id'])) {
$id = $_REQUEST['id'];
$data = $article->fetch_data($id);
if (isset($_POST['title'], $_POST['content'])) {
$title = $_POST['title'];
$content = nl2br($_POST['content']);
//if form has been submitted process it
if(isset($_POST['submit'])){
//collect form data
extract($_POST);
if($title ==''){
$error[] = 'This post is missing a valid id!.';
}
if($content ==''){
$error[] = 'Please enter the title.';
}
if($id ==''){
$error[] = 'Please enter the content.';
}
if(!isset($error)){
try {
//insert into database
$stmt = $pdo->prepare('UPDATE articles SET article_title = :title, article_content = :content WHERE article_id = :id') ;
$stmt->execute(array(
':title' => $title,
':content' => $content,
':id' => $id
));
//redirect to index page
header('Location: index.php');
exit;
} catch(PDOException $e) {
echo $e->getMessage();
}
}
}
}
}
?>
<html>
<head>
<title>CMS Tutorial</title>
<link rel="stylesheet" href="../assets/style.css"/>
</head>
<body>
<div class="container">
<a href="index.php" id="logo">CMS</a>
<br />
<h4>Update Article</h4>
<?php if (isset($error)) { ?>
<small style="color:#aa0000"><?php echo $error; ?></small>
<br /><br />
<?php } ?>
<form action ="update.php" method="post" autocomplete="off">
<input type="text" value ="<?php echo $data['article_title']; ?>"name="title"/required><br /><br />
<textarea rows="15" cols="50" required name="content"> <?php echo $data['article_content']; ?></textarea><br /><br />
<input type="hidden" name="id" value="<?php echo $data['article_id']; ?>">
<input type="submit" name="submit" value="Update Content"/>
</form>
</div>
</body>
<html>
<?php
}else{
header('Location: index.php');
}
?>