【问题标题】:Lots of 'If statement', or a redundant mysql query?大量的“If 语句”,还是冗余的 mysql 查询?
【发布时间】:2010-06-23 11:07:50
【问题描述】:

$url = mysql_real_escape_string($_POST['url']); $shoutcast_url = mysql_real_escape_string($_POST['shoutcast_url']); $site_name = mysql_real_escape_string($_POST['site_name']); $site_subtitle = mysql_real_escape_string($_POST['site_subtitle']); $email_suffix = mysql_real_escape_string($_POST['email_suffix']); $logo_name = mysql_real_escape_string($_POST['logo_name']); $twitter_username = mysql_real_escape_string($_POST['twitter_username']);

表格中的所有这些选项都是预先填写的(由数据库),但是用户可以选择更改它们,从而更新原始数据库。尽管有一些行可能没有更新,但对我来说更新所有列会更好,还是只对每个行执行 if ($original_db_entry = $possible_new_entry) (这本身就是一个查询)?

谢谢

【问题讨论】:

    标签: php mysql if-statement


    【解决方案1】:

    我想说这两种方式都无关紧要 - 您发送到服务器的查询的大小在这里几乎不相关,并且对于将不公正地更新的列没有“最后更新”信息,所以。 ..

    顺便说一句,在处理大量数据时,我喜欢做的是创建一个临时数组。

    $fields = array("url", "shoutcast_url", "site_name", "site_subtitle" , ....); 
    
    foreach ($fields as $field)
     $$field = mysql_real_escape_string($_POST[$field]);
    

    这里唯一需要注意的是,您必须小心不要将变量名放入$fields,这会覆盖现有变量。

    更新: Col. Shrapnel 提出了正确且有效的观点,即使用可变变量不是一个好习惯。虽然我认为在函数范围内使用变量变量是完全可以接受的,但确实最好不要使用它们。清理所有传入字段并使它们以可用形式出现的更好方法是:

    $sanitized_data = array();
    $fields = array("url", "shoutcast_url", "site_name", "site_subtitle" , ....); 
    
    foreach ($fields as $field)
     $sanizited_data[$field] = mysql_real_escape_string($_POST[$field]);
    

    这将为您留下一个可以使用的数组:

    $sanitized_data["url"] = ....
    $sanitized_data["shoutcast_url"] = ....
    

    【讨论】:

    • @Sam $$field 设置 $url$shoutcast_url$site_name.... 无论当前循环正在运行的数组中的哪个字符串。代码与您的代码块一样设置变量,只是行数更少。
    • 这里不需要真正的变量变量,因为我们不需要变量本身,而是SQL查询字符串。
    • @Col 这取决于他在插入数据之前对数据所做的其他事情。此外,它是一种减少特定代码块所需行数的技术的一般演示。我真的不明白这对你来说有什么价值。
    • 变量变量总是值得你知道的。不要混合代码和数据。不要使用技巧解释器允许你
    【解决方案2】:

    只需运行一个更新所有列的查询:

    UPDATE table SET col1='a', col2='b', col3='c' WHERE id = '5'
    

    【讨论】:

      【解决方案3】:

      我建议您使用所有列值执行 UPDATE。这比尝试确认该值与数据库中当前的值不同的成本更低。无论如何,这种确认是无关紧要的,因为如果其他人更新它们,数据库中的值可能会在您检查它们后立即更改。

      如果您对 MySQL 发出 UPDATE 并且值与数据库中已有的值相同,则 UPDATE 将是空操作。也就是说,MySQL 报告零行受影响。 MySQL 知道在 UPDATE 期间不要做不必要的工作。

      如果只有一列发生变化,MySQL 确实需要工作。它只会更改不同的列,但仍会创建新的行版本(假设您使用的是 InnoDB)。

      当然,将 UPDATE 语句实际发送到 MySQL 服务器还需要做一些少量的工作,以便它可以与现有行进行比较。但在现代服务器上,这通常只需要百分之一毫秒。

      【讨论】:

        【解决方案4】:

        是的,可以更新每个字段。
        生成 SET 语句的简单函数:

        function dbSet($fields) {
          $set='';
          foreach ($fields as $field) {
            if (isset($_POST[$field])) {
              $set.="`$field`='".mysql_real_escape_string($_POST[$field])."', ";
            }
          }
          return substr($set, 0, -2); 
        }
        

        及用法:

        $fields = explode(" ","name surname lastname address zip fax phone");
        $query  = "UPDATE $table SET ".dbSet($fields)." WHERE id=$id";
        

        【讨论】:

        • 这不适用于复选框。如果取消设置复选框,更改将丢失,字段不变。
        • @Pekka 是的,但是您仍然不需要复选框的变量变量
        • @Col 这与手头的问题有什么关系?
        • @Pekka 你可以在调用这个函数之前做一些准备工作。从单独的部分组装日期值,填充复选框值等,然后使用它来组装查询。除了超全局变量之外,不需要任何变量
        • @Col 我在哪里可以做这些准备工作?写入$_POST?这是一个好主意吗?我不知道。该功能很好,但是如果您有复选框,则不适用,这就是我的意思。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多