虽然print_r建议正确输入,但PHP代码不会更新SQL数据库

时间:2015-05-17 09:56:15

标签: php mysql

首先,这是我在这里的第一个问题,而且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);
                                }
                        }
}

任何帮助都将不胜感激。

3 个答案:

答案 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 ...");
  }