【问题标题】:Using POST to update values through HTML form retrieves old values使用 POST 通过 HTML 表单更新值检索旧值
【发布时间】:2019-01-11 22:04:47
【问题描述】:

我正在开发一个 CRUD 系统,目前我在更新部分。我有来自用户的旧值需要通过 HTML 表单更新为新值。

现在我正在尝试从设置为 post 方法的 HTML 表单中检索 POST 值。之后,我使用从 POST 请求中获得的新值更新用户信息。

<?php
$oldId = $_GET['id'];
$conn = mysqli_connect('localhost', 'root', '')
or die('Verbinding met database server is mislukt.');
mysqli_select_db($conn, 'crudopdracht')
or die('De database is niet beschikbaar');
$query = "SELECT * FROM gebruikers WHERE id = $oldId";
$result = mysqli_query($conn, $query)
or die (mysqli_error($conn));
while ($row = mysqli_fetch_assoc($result)){
    $naam = $row['naam'];
    $leeftijd = $row['leeftijd'];
    $gender = $row['gender'];
    $locatie = $row['locatie'];
};
?>
<form action="" method="post">
    <label for="id">ID:</label><br>
    <input type="text" id="id" name="id" <?php echo 'placeholder="' . $oldId . '"><br>';?>
    <label for="naam">Naam:</label><br>
    <input type="text" id="naam" name="naam" <?php echo 'placeholder="' . $naam . '"><br>';?>
    <label for="leeftijd">Leeftijd:</label><br>
    <input type="text" id="leeftijd" name = "leeftijd" <?php echo 'placeholder="' . $leeftijd . '"><br>';?>
    <label for="gender">Geslacht:</label><br>
    <input type="text" id="gender" name="gender" <?php echo '[placeholder="' . $gender . '"><br>';?>
    <label for="locatie">Locatie:</label><br>
    <input type="text" id="locatie" name = "locatie" <?php echo 'placeholder="' . $locatie . '"><br><br>';?>
    <input type="submit" value="Verstuur" id="submit" name="submit">
</form>
</div>
<?php
if(isset($_POST["submit"])){
    echo 'hello';
    $id = $_POST["id"];
    $naam = $_POST["naam"];
    $leeftijd = $_POST["leeftijd"];
    $gender = $_POST["gender"];
    $locatie = $_POST["locatie"];
    $query2 = "UPDATE gebruikers SET id = $id, naam = $naam, leeftijd = $leeftijd, gender = $gender, locatie = $locatie WHERE id = $oldId";
    mysqli_query($conn,$query2);
}
?>

在我看来,我希望这些值会更改为 HTML 表单中设置的新值,但它们总是返回旧值。

【问题讨论】:

  • 了解prepared statements以防止sql注入
  • 另外,如果您执行echo $query2;,您会得到您期望看到的结果。如果您直接在数据库中运行此命令,您会收到错误吗?您是否尝试过查看日志以查看是否发生任何错误?
  • @Jens 我现在不太担心 sql 注入,因为我正在大学学习 Web 开发,现在我们的工作就是这样做。在此之后,我们将使用当前的 CRUD 来防止 sql 注入。
  • 占位符不提交给$_POST,需要使用value属性
  • 这段代码有很多错误(有些可能只是拼写错误),需要仔细检查。首先将其分解并尝试仅更新一个值。还要查看 PDO 和 Prepared Statements 以避免 SQL 注入。 php.net/manual/en/book.pdo.php

标签: php html sql mysqli


【解决方案1】:

除了 SQL 注入问题(正如您所说,它不在特定问题的范围内),您需要为任何非整数值正确格式化 SQL 查询,以便用引号将它们封装起来 (@987654321 @)。

您的查询当前运行为:

UPDATE gebruikers ( id = somevalue, naam = somevalue, leeftijd = somevalue, gender = somevalue, locatie = somevalue WHERE id = 12345`

在此查询中,SQL 会尝试将您的值解释为实体(列、表),这显然不是您想要的。

因此,尽管您永远不应该将用户输入值注入到查询中,但以下内容应该可以解决您的问题:

改变

$query2 = "UPDATE gebruikers SET id = $id, naam = $naam, leeftijd = $leeftijd, gender = $gender, locatie = $locatie WHERE id = $oldId";

$query2 = "UPDATE gebruikers SET id = $id, naam = '$naam', leeftijd = '$leeftijd', gender = '$gender', locatie = '$locatie' WHERE id = $oldId";`

假设id 是一个INT 字段,其他都是字符串。

【讨论】:

  • 非常感谢!我为混乱的代码道歉,我理解 SQL 注入和 XSS 攻击之类的危险。这只是一个学校作业,我们还没有了解准备好的陈述。
  • @Redshade 没问题 - 它并不总是与问题相关,但问题通常不是您对它的使用(作为提问者),而是其他人对建议的解释(作为观众) .如果没有作为警告披露,有人可能会阅读答案并以他们不应该的方式应用它。只要您了解风险并且很高兴您不需要处理它们:)
猜你喜欢
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多