从PHP

时间:2017-05-04 13:57:58

标签: php mysql optimization mysqli

我正在开发一个项目,需要一个人们可以修改其信息的简介。

它正在工作,但我想知道:改变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)

性能最好的是什么?谢谢!

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注入的风险,那就不好了:)

附注,如果他们意识到您的输入名称与您的数据库字段名称相同,则可能会向攻击者提供信息。 但是为了测试他们首先必须将它放入你的数据库中,如果你已经有了所有相关的保障措施,这应该不是问题。

祝你好运