首先,这是我在这里的第一个问题,而且altohugh我搜索了网站,没有找到解决我当前问题的答案。
我是一名PHP新手,目前正致力于一门课程的最终项目。目标是建立一个基本的博客,用户可以发布,删除和编辑他们的新闻,管理员可以编辑或删除所有内容等。我一般都很好,但是编辑功能有点麻烦。
以下代码显示所有博客帖子,作者和发布日期。如果当前登录的人是帖子或管理员的作者,他们可以选择删除或编辑每个帖子。将出现一个包含标题和帖子文本的小表单。当用户在单击编辑按钮时键入其他内容时,应将数据库中的值更改为用户指定的新值。问题是每当我点击当前设置中的编辑按钮时,没有任何反应。如果我将if语句移到另一个if语句之外,则帖子会更新,但在数据库中变为空白。
在事实显示它构建的数组具有正确的名称和更新的值之后运行print_r($ _ POST),但它们仍未在数据库中更新。这是代码,相关部分从最后一个if语句开始(我知道,它不是注入证明,一旦它工作就会到达):
$query = "SELECT id, title, body, pub_date, user_id FROM posts ORDER BY id desc";
$query_fetch = mysql_query($query);
while ($blog_post = mysql_fetch_assoc($query_fetch)) {
$author_id = $blog_post["user_id"];
$post_id = $blog_post["id"];
$post_id2 = $blog_post["id"] . 2;
$title = $blog_post['title'];
$body = $blog_post['body'];
$query = "SELECT username FROM users WHERE id = '$author_id'";
$query_run = mysql_query($query);
$author = mysql_fetch_assoc($query_run);
echo "<h2>" . censor($blog_post["title"]) . "</h2>" . "<br> <p> Autor: " . $author["username"] . "</p><br><p>Objavljeno: " . $blog_post["pub_date"];
if ($_SESSION['admin'] == 1 or $_SESSION['username'] == $author["username"]) {
echo "<form action='' method='POST'><input type='submit' name= '$post_id' value= 'Obriši objavu'></form>";
echo "<form action='' method='POST'><input type='submit' name= '$post_id2' value= 'Uredi objavu'></form>";
}
echo "<p>" . censor($blog_post["body"]) . "</p>";
if (isset($_POST["$post_id"])) {
$del_post = "DELETE FROM posts WHERE id = '$post_id'";
mysql_query($del_post);
}
if (isset($_POST["$post_id2"])) {
echo "<form action='' method= 'POST'>New title<input type='text' value = '$title' name='title'>New text<textarea name='body' id='' cols='30' rows='10'>$body</textarea><input type='submit' name='edit' value='edit'></form>";
if (isset($_POST['edit'])) {
$edit_title = $_POST['title'];
$edit_body = $_POST['body'];
$query = "UPDATE posts SET title= '$edit_title', body= '$edit_body' WHERE id= '$post_id'";
mysql_query($query);
}
}
}
任何帮助都将不胜感激。
答案 0 :(得分:0)
首先检查您的查询是否正确。然后尝试对您的查询进行硬编码。同时在phpMyAdmin
中测试您的查询。此外,您可以尝试从每个查询的''
变量中删除number
。
拜托,你能告诉我们你的错误吗?
您的数据库也有可能已更新。所以仔细检查一下。
答案 1 :(得分:0)
这就是我经常调试的方式。 echo
查询。在PHPmyadmin中运行它,看到错误。
所以,在你的情况下。
echo "UPDATE posts SET title= '$edit_title', body= '$edit_body' WHERE id= '$post_id'";
echo
并且您将获得脚本将尝试运行的查询。
尝试在phpmyadmin中运行它并检查错误是什么。
答案 2 :(得分:0)
最后一段代码
if (isset($_POST["$post_id2"])) {
echo "<form action='' method= 'POST'>New title<input type='text' value = '$title' name='title'>New text<textarea name='body' id='' cols='30' rows='10'>$body</textarea><input type='submit' name='edit' value='edit'></form>";
if (isset($_POST['edit'])) {
$edit_title = $_POST['title'];
$edit_body = $_POST['body'];
$query = "UPDATE posts SET title= '$edit_title', body= '$edit_body' WHERE id= '$post_id'";
mysql_query($query);
}
}
发送post_id2时会激活,但会生成一个不再包含post_id2的表单。因此,当您提交该表格时,不会输入IF。
您可以像这样修改它:
if (isset($_POST["$post_id2"])) {
echo "<form action='' method= 'POST'>New title<input type='text' value = '$title' name='title'>New text<textarea name='body' id='' cols='30' rows='10'>$body</textarea><input type='submit' name='edit' value='edit'></form>";
}
if (isset($_POST['edit'])) {
$edit_title = $_POST['title'];
$edit_body = $_POST['body'];
$query = "UPDATE posts SET title= '$edit_title', body= '$edit_body' WHERE id= '$post_id'";
mysql_query($query);
}
一般来说,我认为您会发现使用不同的表单更容易,特别是使用某种操作标记:
input type="hidden" name="command" value="edit"
input type="hidden" name="post" value="{$post_id}"
这样您就可以立即运行一个查询,而无需浏览循环中的所有帖子。
另一个有用的可能性是在不同的PHP文件之间拆分代码,并将公共代码保存在一个包含:
<?php // this is delete.php
include "common.php";
$post_id = my_get_var('post_id');
my_sql_command("DELETE FROM posts WHERE...");
使用
<form action="delete.php" method="post" ...>
正如您所看到的,这允许以不同的方式检索post_id(在common.php中的单个函数my_get_var中集中定义)和SQL函数的集中定义。然后可以更新如何这个函数与MySQL的接口,特别是从mysql_函数(已弃用,很快将不再可用)传递到例如PDO。
它还允许您通过在浏览器中直接输入delete.php来独立测试单个命令(您需要my_get_var接受POST和GET变量才能执行此操作)。
您想要检查和/或修改帖子集合。然后,您最初需要至少执行以下操作:列表,编辑和删除。
只有第一个适用于所有帖子。
所以你可以有一个运行SELECT的list.php文件。此外,只有在此SELECT中,您才需要有关用户的信息,因此您的查询可能会变为:
$query = "SELECT posts.id, title, body, pub_date, user_id, username FROM posts JOIN users ON (posts.user_id = users.id) ORDER BY posts.id desc";
在显示周期中,我们将显示以下信息:
$query_fetch = mysql_query($query);
// This file will receive requests to edit or delete
// We can use a single form.
echo '<form action="manage.php">';
while ($post = mysql_fetch_assoc($query_fetch)) {
echo "<h2>" . censor($post["title"]) . "</h2>" . "<br> <p> Autor: " . $post["username"] . "</p><br><p>Objavljeno: " . $post["pub_date"];
if ((1 == $_SESSION['admin']) or ($_SESSION['username'] == $post["username"]) {
echo "<input type=\"submit\" name=\"Obriši objavu\" value=\"{$post['id']}\" />";
echo "<input type=\"submit\" name=\"Uredi objavu\" value=\"{$post['id']}\" />";
}
echo "<p>" . censor($blog_post["body"]) . "</p>";
}
echo "</form>";
这样您只需要一个表单,它将提交一个字段,其中包含一个描述要采取的操作的名称,以及要执行该操作的帖子。
文件manage.php将接收此信息 - 也可用于更新它:
foreach(array(
"delete" => "Obriši objavu", // from list.php
"edit" => "Uredi objavu", // " "
"update" => "update" // from this file itself (see below)
)
as $test_todo => $var) {
if (array_key_exists($var, $_POST)) {
$id = $_POST[$var];
$todo = $test_todo;
}
}
if (isset($id)) {
switch($todo) {
case "delete":
mysql_query("DELETE FROM posts WHERE id = '{$id}'");
break;
case "edit":
// Get this post.
$query = "SELECT posts.id, title, body, pub_date, user_id, username FROM posts JOIN users ON (posts.user_id = users.id) WHERE posts.id = '{$id}';";
echo '<form action="manage.php" method= "POST">';
// This is how we tell this file what to do, and to what.
echo "<input type=\"hidden\" name=\"update\" value=\"{$id}\">";
// run query, fetch the one record, display info...
echo "</form>";
break;
case "update":
// Build the update query from $_POST.
mysql_query("UPDATE posts SET ...");
}