我正在开发一个项目,需要一个人们可以修改其信息的简介。
它正在工作,但我想知道:改变mysql数据库中一行的最佳方法是什么?我应该按值修改值还是更新所有内容?
示例: 在这里,我得到当前的名称和名字,我只会在它与我目前的数据库不同时更新
示例1 - 按值划分值
如果进行了更改,我对每个数据进行了两次查询。
if( (!empty($name)) && ($nom != $name_user) ){
$sql = "UPDATE user SET name_user='$name' WHERE id_user='$id'";
mysqli_query($conn, $sql);
echo '<h2 class="center">Your name has been modified</h2>';
}
if( (!empty($firstname)) && ($firstname!= $firstname_user) ){
$sql = "UPDATE user SET name_user='$name' WHERE id_user='$id'";
mysqli_query($conn, $sql);
echo '<h2 class="center">Your firstname has been modified</h2>';
}
例2 - 一次查询中的所有内容
它的功能相同,但只有一个查询。
if( ((!empty($firstname)) && ($firstname!= $firstname_user)) || ((!empty($firstname)) && ($firstname!= $firstname_user)) ){
$sql = "UPDATE user SET name_user='$name', firstname_user='$firstname' WHERE id_user='$id'";
mysqli_query($conn, $sql);
echo '<h2 class="center">Your profil has been modified</h2>';
}
仅在实际更改时更新值是否更好? (例1)
即使只更改了一个值,更改两个值是否更好? (例2)
性能最好的是什么?谢谢!
答案 0 :(得分:0)
执行单个UPDATE
以修改所有必填字段。有几种方法来构建句子。这是一个基本的:
$fields = array("field1", "field2", "field3");
$values = array();
foreach ($fields as $field)
{
if (isset($_GET[$field]) AND !empty($_GET[$field]))
{
$values[$field] = "$field='"
. mysqli_real_escape_string($conn, $_GET[$field])
."'";
}
}
$sql = "UPDATE user SET " . implode (',', $values) . " WHERE id_user='$id'";
mysqli_query($conn, $sql);
注意:mysqli_real_escape_string()
用于转义特殊字符。详情here。
测试here。
编辑: 如果担心安全问题,请认真考虑使用准备好的陈述,如某些评论中所指出的那样。
答案 1 :(得分:-1)
我通常处理这种情况的方法是使表单名称与数据库字段名称匹配,然后在可见输入旁边放置一个隐藏字段,其中包含带有修改名称的旧值;
<input type="text" name="aboutme">
<input type="hidden" name="aboutme_old" value="<?= $aboutme ?>">
//$aboutme being the old value of the value to be changed
然后在接收PHP页面上使用foreach语句来运行可能的字段列表并创建所需的语句。
<?php
//Set the fields to check
$fields = array ('firstname', 'secname', 'interests', 'aboutme');
//Start MYSQL query
$mysql_query = 'UPDATE `table` SET ';
$i = 0;
//Run through the list
foreach ($fields as $field) {
$old_field = $field. '_old'; //Set to the old value input name
$input = cleanInput($_POST[$field]); //cleanInput() is a made up function to check the data.
if ($i != 0) $mysql_query =. ', '; //Check if you need a comma
if ($_POST[$field] != $_POST[$old_field]) $mysql_query =. $field. ' = "' $input. '"';
//Set the query if there is a change
$i++;
}
?>
确保在通过MYSQL之前检查您使用的数据,否则您冒着MYSQL注入的风险,那就不好了:)
附注,如果他们意识到您的输入名称与您的数据库字段名称相同,则可能会向攻击者提供信息。 但是为了测试他们首先必须将它放入你的数据库中,如果你已经有了所有相关的保障措施,这应该不是问题。
祝你好运