0

我正在添加一些服务器端表单验证(使用 php),以防我网站的一位用户关闭了 javascript。在一个表单上,有 10 个单独的输入字段可以更改。有人可以告诉我哪种协议会使用更少的系统资源吗?首先,我编写了一些 mySQL 变量来检查用户的当前设置,并将这些与发布的设置进行比较。如果所有 10 个发布的值都与当前值相同,则不要更新数据库,否则更新数据库:

$login_id = $_SESSION['login_id'];

$sql1 = mysql_fetch_assoc(mysql_query("SELECT value1 FROM login WHERE login_id = 
'$login_id'"));
$sql1a = $sql1['value1'];
// Eight More, then
$sql10 = mysql_fetch_assoc(mysql_query("SELECT value10 FROM login WHERE login_id = 
'$login_id'"));
$sql10a = $sql10['value10'];
$Value1 = $_POST['Value1'];
// Eight More, then
$Value10 = $_POST['Value10'];

//Other validations then the following

if (($sql1a == $Value1)&&($sql2a == $Value2)&&.......($sql10a == $Value10)) {
echo "<script>
alert ('You haven't made any changes to your profile');
location = 'currentpage.php';
</script>";
}
else {
$sqlUpdate = mysql_query("UPDATE login SET value1 = '$Value1',....value10 = '$Value10'     
WHERE login_id = '$login_id'");
echo "<script>
alert ('Your profile has been updated!');
location = 'currentpage.php';
</script>"; 
}//End php

或者只使用用户发布的值(保留 $_POST 变量)并避免使用比较行检查是否更便宜: (($sql1a == $Value1)&&($sql2a == $Value2)&&... ....($sql10a == $Value10)) 然后直接去

//Other validations then the following

$sqlUpdate = mysql_query("UPDATE login SET value1 = '$Value1',....value10 = '$Value10'     
WHERE login_id = '$login_id'");
echo "<script>
alert ('Your profile has been updated!');
location = 'currentpage.php';
</script>"; 

感谢您对此的任何意见!

4

1 回答 1

2

如果我理解正确,您的问题是性能检查配置文件是否可以修改。对我来说,在我检查了你的代码之后,这不仅仅是性能......

  • 让我们从性能开始: AFAIK MySQL 查询比基本的 PHP 比较慢,这是真的 - 但在这个规模上,我真的认为这并不重要。我们正在讨论两个非常基本的查询,它们不会处理大量数据。
  • 让我们考虑一下最终用户会看到什么(UX):在第二种情况下,用户不会有最准确的反馈告诉他/她没有进行任何修改。在个人资料修改屏幕上,我想这可能不是故意的,所以我会说我们没有修改任何东西。(此外,执行不必要的 UPDATE 查询并不是最优雅的。)
  • @aehiilrs 是对的,请注意该评论。这种 MySQL 使用方式对安全性特别不利——如果你继续这样做,你会在你的 PHP 代码中创建很多安全漏洞。这些真的很容易发现和利用,所以请仔细看看替代方案,从前面提到的 PDO 开始。任何优秀的 PHP 书籍都会向您展示方法。您还可以查看 StackOverflow 上的精彩问答:如何防止 PHP 中的 SQL 注入?
  • 我想知道尝试像您那样更新用户界面是否是一个好主意 - 我强烈希望在输出中没有任何<script>魔法的情况下加载另一个 PHP。在 PHP 结果中,您始终可以显示类似 CSS 样式的状态栏来显示此类信息。
于 2013-11-14T21:48:37.440 回答