【问题标题】:Updating only those fields which users have changed in a Form仅更新用户在表单中更改的字段
【发布时间】:2014-01-19 07:12:16
【问题描述】:

假设我有一个包含 16 到 20 个字段的表单,包括输入类型文本和文本区域。

表单使用 POST 方法将字段提交到一个 php 页面,该页面更新一个表 带有 $_POST 变量的数据库。

我的问题是我只想更新数据库中的更改值,而不是更新每个值,

这种优化应用程序的方法有多好? ,我也在另一个网站上阅读了以下答案:

  • mySQL 会自动检测到您正在使用它已经包含的相同值更新一个字段,但实际上并没有更新它 场地。不确定这对于其他数据库是否相同 与 php 一起使用。

还有,以上说法的真实性如何?

【问题讨论】:

  • 确实如此。如果不需要,mysql 不会浪费时间在磁盘上重写字节。其他数据库是否具有相同类型的优化——您必须查看这些数据库的文档。
  • @MarcB 所以你的意思是我应该依靠 mysql db 优化自身而不是用 PHP 优化我的查询?
  • 好吧,考虑一下您必须做的额外工作:获取要在表单中显示的数据,获取提交的表单,再次获取数据,以便您可以将新值与旧值进行比较,然后构建一个仅更新更改值的查询。 2 次选择 + 1 次更新,v.s. 1 次选择 + 1 次更新
  • 谢谢,看来是合法的

标签: php mysql


【解决方案1】:

很简单,提交表单后,做:

if(isset($_POST['name'])) {
// Do the update
}
else {
// Don't do anything because it means there is no $_POST['name']
}

这是基本逻辑,我希望这就是你要找的。​​p>

【讨论】:

  • 这也可以,但缺点是您必须为 16-20 个字段中的每一个字段输入一个 if,并将脚本与表单紧密耦合。
  • OP 中没有太多详细信息,实际表单是什么样的,但仅检查变量是否已设置无济于事。它将始终设置,即使它没有更改。
【解决方案2】:

当您使用$_POST 变量来构造您的SQL 查询时,只需确保您没有包含任何未在$_POST 中设置的列名或值。如果 SQL UPDATE 语句没有列的值并且没有形成期望值,那么数据库将不会尝试更新这些列。最好的方法可能是使用foreach 循环:

// Init SQL query
$statement = "UPDATE tableName SET ";
$params = array();
// Iterate $_POST variables
foreach ($_POST as $key=>$value) {
    // Append a new SET key/value pair
    $statement .= "$key = :$key, ";
    // You're using prepared statements, right?
    $params[$key] = $value;
}

// Cut off last comma and append WHERE clause
$statement = substr($statement,0,-2)." WHERE id = :id";
// Store id for prepared statement
$params['id'] = $id;
// Prepare the query
$pdo->prepare($statement);
// Execute with parameters
$result = $pdo->execute($params);

【讨论】:

  • 直接将 $_POST 添加到查询中而不检查和转义字符串是很危险的。假设$_POST['age'] = "abcd"; // abcd is entered by user.这将如何插入数据库?
  • 这将导致 "UPDATE tableName SET age='abcd' WHERE id = $id" 我进行了编辑以确保为准备好的语句转义了 ID。我继续添加了一个模拟数据库调用...
猜你喜欢
  • 2019-06-24
  • 1970-01-01
  • 2019-11-10
  • 2013-08-22
  • 2019-07-30
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 2015-12-14
相关资源
最近更新 更多