【问题标题】:PHP page is storing form input variables after user submitsPHP页面在用户提交后存储表单输入变量
【发布时间】:2012-08-15 15:36:59
【问题描述】:

我不知道该标题还叫什么...我有一个 PHP 页面,它可以访问某个 MySQL 数据库,从表中提取值,并将它们放在 HTML 表单中(POST 方法 - PHP_SELF)。然后,用户可以查看这些值,根据需要更改它们并提交它们。然后页面获取这些值并更新 MySQL 数据库。一切正常,除了当用户提交并且页面显示新的更新变量时,它仍然显示旧值。在新变量出现之前,用户被强制刷新页面。我认为 PHP 可能没有删除变量,所以我在脚本结束后取消了所有存储的变量,但它仍然无法正常工作。我曾经尝试在脚本开始之前设置一个睡眠计时器,但这也不起作用。我会很感激任何建议。这是我的脚本仅供参考:

<html>
<body>

<?php

$sql = "SELECT * FROM lease";
$result = mysql_query($sql);

?>

<form id="lease_update" method="post" action="<?php echo htmlentities($PHP_SELF); ?>">
<table>
<tr>
<th>Account</th>
<th>Car Lease</th>
<th>Radio Lease</th>
<th>Misc. Charges</th>
</tr>

<?php
    while($rows = mysql_fetch_array($result)){
 ?>

<tr>
<td><input type="text" name="account[]" value="<?php echo $rows['accnt']; ?>" /></td>
<td><input type="int" name="car_lease[]" value="<?php echo $rows['car']; ?>" /></td>
<td><input type="int" name="radio_lease[]" value="<?php echo $rows['radio']; ?>" />     </td>
<td><input type="int" name="misc_lease[]" value="<?php echo $rows['misc']; ?>" /></td>
<input type="hidden" name="lease_ID[]" value="<?php echo $rows['ID']; ?>" />
</tr>

<?php
    }
?>
</table>
<input type="submit" value="Update" name="lease_update" />

<?php

if(isset($_POST['lease_update'])){

$account = $_POST['account'];
$car_lease = $_POST['car_lease'];
$radio_lease = $_POST['radio_lease'];
$misc_lease = $_POST['misc_lease'];
$lease_ID = $_POST['lease_ID'];

//Get Array Lengths For Each Section
$A = count($lease_ID);

//Update Lease Information
$i = 0;
while($i < $A){
    if(!mysql_query('UPDATE lease SET accnt = "' .$account[$i]. '", car = "' .$car_lease[$i]. '", radio = "' .$radio_lease[$i]. '", misc = "' .$misc_lease[$i]. '"  WHERE ID = ' .$lease_ID[$i]))
        die('Error: ' .mysql_error());
    $i++;
}
unset($_POST);
    unset($rows);
    unset(result);

}
?>
</body>
</html>

【问题讨论】:

标签: php mysql html forms unset


【解决方案1】:

您在更新之前显示数据库中的数据。

通常最好在页面顶部完成所有数据库连接,然后显示结果。

在您的代码中(即使用户提交了更新),您查询数据,从数据库中提取并显示它,然后使用用户提交的内容运行更新。

将您的代码更改为此应该可以解决问题(请阅读下面的注释):

<html>
<body>

<?php

if(isset($_POST['lease_update'])){

$account = $_POST['account'];
$car_lease = $_POST['car_lease'];
$radio_lease = $_POST['radio_lease'];
$misc_lease = $_POST['misc_lease'];
$lease_ID = $_POST['lease_ID'];

//Get Array Lengths For Each Section
$A = count($lease_ID);

//Update Lease Information
$i = 0;
while($i < $A){
    if(!mysql_query('UPDATE lease SET accnt = "' .$account[$i]. '", car = "' .$car_lease[$i]. '", radio = "' .$radio_lease[$i]. '", misc = "' .$misc_lease[$i]. '"  WHERE ID = ' .$lease_ID[$i]))
    die('Error: ' .mysql_error());
    $i++;
}
unset($_POST);
    unset($rows);
    unset(result);

}


$sql = "SELECT * FROM lease";
$result = mysql_query($sql);

?>

<form id="lease_update" method="post" action="<?php echo htmlentities($PHP_SELF); ?>">
<table>
<tr>
<th>Account</th>
<th>Car Lease</th>
<th>Radio Lease</th>
<th>Misc. Charges</th>
</tr>

<?php
    while($rows = mysql_fetch_array($result)){
 ?>

<tr>
<td><input type="text" name="account[]" value="<?php echo $rows['accnt']; ?>" /></td>
<td><input type="int" name="car_lease[]" value="<?php echo $rows['car']; ?>" /></td>
<td><input type="int" name="radio_lease[]" value="<?php echo $rows['radio']; ?>" />     </td>
<td><input type="int" name="misc_lease[]" value="<?php echo $rows['misc']; ?>" /></td>
<input type="hidden" name="lease_ID[]" value="<?php echo $rows['ID']; ?>" />
</tr>

<?php
    }
?>
</table>
<input type="submit" value="Update" name="lease_update" />

</body>
</html>

错误提示 - 您的代码很容易受到注入攻击。您正在使用带有 no 验证的表单数据。这是一个很大的危险信号。其次,您正在使用已弃用的 mysql_* 函数。您的代码应该使用mysqli_* 函数,或者更好的是移至PDO。它更安全,您可以用它做更多事情。

编辑 2:用户提交表单后页面正在更新,但您向用户显示的页面在您更新之前正在查询数据库 - 并使用该页面向用户显示页面。

【讨论】:

  • 嗯,这很有趣。我对 PHP 比较陌生,但我的印象是,一旦提交表单输入并更新数据库,页面就会重新加载(因为它是 PHP_SELF),并再次查询数据库(使用新值)。
  • 感谢您的留言。我仍在尝试在 PHP 中学习表单验证。此表单仅供管理员查看(其他用户无权访问)。您认为在这些情况下验证仍然很重要吗?
  • @user1562781 是的,你永远不能太安全——这并不难做到。我创建了一组使用准备好的语句并很好地完成所有验证的对象 - 我基本上可以在我编写的每一位代码上一遍又一遍地使用它们。
  • 谢谢。我会读到它,看看它是如何完成的。我来自工程背景,我所做的只是繁重的数学计算。我们永远不必与用户打交道,所以生活很简单。用户交互是一个巨大的痛苦。 :-P
  • @user1562781 将用户想象为会做错所有事情的人,点击他们应该做的地方以及尝试做的人他们可以hack越过你的系统。老实说,工程背景应该让你的工作更容易。将网页视为示意图或流程图——用户尽其所能一切离开预期的路径。然后,您将拥有不错的安全网站。
猜你喜欢
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 2014-05-26
  • 2012-07-17
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多