【问题标题】:Best way to build an SQL Update sentence from PHP从 PHP 构建 SQL 更新语句的最佳方法
【发布时间】:2023-03-08 04:46:01
【问题描述】:

我正在做一个需要配置文件的项目,人们可以在其中修改他们的信息。

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

即使只更改了一个值,更改这两个值是否更好? (例二)

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

【问题讨论】:

  • 仅更新已更改的值,并在一个查询中完成所有操作。另外,使用prepared statements 来避免SQL injection 攻击。
  • @AlexHowansky 我知道准备好的陈述,这只是为了快速阅读。你怎么只用一个查询,你用switch吗?在我的个人资料上,我只有两个字段,但将来可能需要更多字段,您建议我做什么?谢谢顺便说一句!
  • 有什么区别,快读还是不快?为什么您不使用准备好的语句进行任何阅读?
  • 我删除了我的答案。看看这个,或者google一下“动态绑定参数mysqli”:pontikis.net/blog/dynamically-bind_param-array-mysqli
  • 是的,没有我的错误,我会看看准备好的声明,这不是我想的那样。谢谢大家!

标签: php mysql optimization mysqli


【解决方案1】:

执行一个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

编辑: 如果安全是一个问题,请认真考虑使用准备好的语句,正如某些 cmets 中所指出的那样。

【讨论】:

  • 非常清晰灵活的回答,非常感谢!我将编辑我原来的问题,因为缺乏准备好的陈述真的会触发每个人。
【解决方案2】:

我通常处理这种情况的方法是使表单名称与数据库字段名称匹配,然后在可见输入旁边放置一个隐藏字段,其中包含带有修改名称的旧值;

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

附带说明,如果攻击者意识到您的输入名称与您的数据库字段名称相同,这可能会向攻击者提供信息。 但是要测试它们首先必须将其放入您的数据库中,如果您拥有所有相关的保护措施,这应该不是问题。

祝你好运

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2016-03-16
    • 2010-09-26
    相关资源
    最近更新 更多