我有一个表单,用户可以在其中更改已存在于数据库中的个人信息。 更新仅更改的数据库字段而不是所有可用的表单选项的最佳解决方案是什么。
如果你有更好的建议,而不是把每一个放在一个表格中,请告诉你。
答案 0 :(得分:2)
更新整个用户记录,而不是关注哪些字段已更改,哪些字段没有更改。
一次更新所有字段与查询检查哪些字段已更改大致相同,具有时间和内存效率。实际上,您只是浪费时间逐一检查字段以查看更新的字段。所以在更新之前没有必要进行此类检查。
答案 1 :(得分:2)
假设MySQL并且你不介意使用会话,这是一种方法:
<?php
// Start the session
session_start();
// The name of the table in the database
$table = 'table_name';
// The primary key of the record we are dealing with
$id = 1;
// The name of the column that holds the primary key
$pkCol = 'id';
// Connect to database somewhere here and store it in $conn
if (!empty($_POST['update'])) {
// Update the record
// Compare values from $_POST with values from $_SESSION and build an array of data that has changed
$changes = array();
foreach ($_SESSION['original_data'] as $colName => $value) {
if ($_POST[$colName] != $value) {
$changes[] = "$colName = '".mysqli_real_escape_string($conn, $_POST[$colName])."'";
}
}
// Build the query
$query = "UPDATE $table SET ".implode(', ', $changes)." WHERE $pkCol = {$_SESSION['record_id']}";
// Do the query
if (!mysqli_query($conn, $query)) exit("Unable to update record in database");
}
// generate the form
// Get original data from DB and store it in the session
$query = "SELECT * FROM $table WHERE $pkCol = $id";
if (!$result = mysqli_query($conn, $query)) exit("Unable to get record from database");
$_SESSION['original_data'] = mysqli_fetch_assoc($result);
$_SESSION['record_id'] = $id;
// Echo start of HTML page
echo "<html>
<head>
<title>Record update example</title>
</head>
<body>
<form method='post' action=''>
<input type='hidden' name='update' value='1' />
";
// Generate inputs from data
foreach ($_SESSION['original_data'] as $colName => $value) {
if ($colName != $pkCol) {
$colName = htmlspecialchars($colName);
$value = htmlspecialchars($value);
echo " $colName: <input type='text' name='$colName' value='$value' /><br />\n";
}
}
// Close off HTML
echo " </form>\n </body>\n</html>";
答案 2 :(得分:1)
提交更新表单后,您应该通过触发选择查询where id = xyz
检查值,然后检查if($_POST['textboxname'] == $row['colname'])
,如果发现任何更改,则添加到更新查询,否则跳过该值。< / p>
如果您已在此处编写代码,那么您可以很容易理解。
答案 3 :(得分:1)
您可以执行Hossein建议的操作(顺便提一下),或者您可以某种方式标记更改的项目,然后您可以将项目映射到您的ID。