使用php和表单

时间:2016-04-15 10:01:20

标签: php mysql forms sql-update

我试图创建一个使用html表单来更新mysql数据的php页面时遇到了一个奇怪的问题。

我的想法是创建一个页面,从我所拥有的“新闻”表中检索所有行,并将所有数据作为“默认”值插入到html表单中,这样我就可以在更改之前看到已写入的内容我想要这种形式。每个表单专门为检索到的每一行数据生成。

为此,我使用POST方法和两个php文件,一个名为“updateNews.php”,用于检索数据并呈现表单,另一个名为“newsUpdater.php”,用于注入更新的数据。

我这里有两个问题。一,表单不发布表单中写入的新数据,而是发布作为“默认”发布的原始数据。我想这是我的表单代码中的一个问题。我想我没有正确编码“默认”值。

第二个问题很奇怪。我以相反的顺序从“新闻”表中检索行,但是当我“提交”与特定行关联的表单时,它会发布第一行的数据,而不是我感兴趣的行。

这是我在第一个php文件中的代码,它检索数据并呈现表单:

<html>

<head>          
    <?php
        include "connectToNews.php";
        mysqli_set_charset($conToNews,"utf8");
        $query = mysqli_query ($conToNews, "SELECT * FROM news ORDER BY id DESC");

    ?>

</head>

<body>

    <?php 

        while ($newsArray = mysqli_fetch_array($query, MYSQLI_ASSOC)) {
            echo "<form action='newsUpdater.php' method='post' enctype='multipart/form-data'>";
            echo "<p>".$newsArray['id']."</p><br>";
            echo "<input name='Id' type='hidden' value='".$newsArray['id']."'>";
            echo "<input class='input' name='Fecha' type='text' value='".$newsArray['fecha']."'><br>";
            echo "<textarea class='textarea' name='Headline' type='text'>".$newsArray['headline']."</textarea><br>";
            echo "<textarea class='textarea' name='Story' type='text'>".$newsArray['story']."</textarea><br>";
            echo "<input type='submit' value='Actualizar'><br><br><br>";
            echo "</form>";
        }
    ?>

</body>
</html>

因此,正如您所看到的,我为每个现有行渲染了一个新的<Form>。我使用了2个<input>代码和2个<textarea>代码。其中一个<input>标签被隐藏,并且具有与特定行数据相关联的“Id”信息。在任何情况下,我使用“回声”与此Id数据来验证是否正在检索确定(它是)。我使用“value”属性将检索到的文本设置为此<input>标记中的默认文本。 在<textarea>标记中,我使用开始标记和结束标记之间的空格来定位“默认”文本。

此时,一切都呈现正常,我得到的形式与“新闻”表中的行一样多,当我按下提交按钮时,它会转到第二个php文件。

第二个php文件是“数据更新程序”。代码就是问题:

<html>

<head>
    <?php 
        $Id=$_POST['Id'];
        $Fecha=$_POST['Fecha'];
        $Headline=$_POST['Headline'];
        $Story=$_POST['Story'];

        echo "<p>".$Id."</p><br>";
        echo "<p>".$Fecha."</p><br>";
        echo "<p>".$Headline."</p><br>";
        echo "<p>".$Story."</p><br>";

        include "connectToNews.php";
        mysqli_set_charset($conToNews,"utf8");
        $query=mysqli_query ($conToNews, "UPDATE news SET fecha='$Fecha' headline='$Headline' story='$Story' WHERE id='$Id'");
    ?>
</head>

<body>
    <?php 
        echo "<p>News updated</p><br>";
        echo "<p><a href='updateNews.php'>Go back to form</a></p>";
    ?>
</body>
</html>

正如您所看到的,我将发布的数据“$ _POST ['whatever']”保存到4个变量中,只是为了更轻松地编写未来的mySql查询。

然后,我回显这些变量以检查实际传递的信息。这就是它变得奇怪的地方,因为te渲染的文本是从我的“新闻”表中的第一行检索到的文本,无论我在表单中编辑哪一行或我在表单中写的是什么。

另一个问题是,关于获取与更新过程相关的“ok”消息,数据从不保存到“新闻”表。虽然,我可能是错的,因为我真的将第1行的原始文本注入第1行,无论我真正想要编辑哪一行。

你能阅读我的代码并告诉我你们是否有任何问题。

感谢!!!

1 个答案:

答案 0 :(得分:3)

在UPDATE查询中,要更新的列必须用逗号分隔,这就解释了为什么您的数据没有更新。

您不确定查询失败的原因以及原因是您没有测试查询是否实际有效。

测试所有MYSQLI_个调用的结果总是一个非常好的主意,所以我会添加。然后,这将显示一条错误消息,这将有助于打印

$query=mysqli_query ($conToNews, 
        "UPDATE news SET fecha='$Fecha', 
                         headline='$Headline',
                         story='$Story' 
         WHERE id='$Id'");


if ( $query === FALSE ) {
    echo mysqli_error($conToNews);
    exit;
}
  

此代码中存在一些SQL注入问题,您应该阅读How can I prevent SQL injection in PHP?