代码之家  ›  专栏  ›  技术社区  ›  Sam Johannes Rudolph

很多“if语句”,还是多余的mysql查询?

  •  2
  • Sam Johannes Rudolph  · 技术社区  · 14 年前

    $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)?

    谢谢

    4 回复  |  直到 14 年前
        1
  •  6
  •   Pekka    14 年前

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

    顺便说一下,我在处理这些数据负载时喜欢做的是创建一个临时数组。

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

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

    更新: 子母弹指出,使用变量并不是一个好的做法,这是正确和有效的。虽然我认为在函数范围内使用变量是完全可以接受的,但是最好不要使用它们。更好的方法是清理所有传入字段并使其成为可用的形式:

    $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"] = ....
    
        2
  •  1
  •   Naktibalda    14 年前

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

    UPDATE table SET col1='a', col2='b', col3='c' WHERE id = '5'
    
        3
  •  1
  •   Bill Karwin    14 年前

    我建议您使用所有列值执行更新。这比试图确认该值与当前数据库中的值不同要便宜。不管怎样,这个确认都是无关紧要的,因为如果有人更新了数据库中的值,在您检查它们之后,它们可能会立即发生变化。

    如果您对MySQL发出更新,并且这些值与数据库中已有的值相同,那么更新将是禁止操作的。也就是说,MySQL报告了零行受影响。 MySQL知道在更新期间不要做不必要的工作。

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

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

        4
  •  0
  •   Your Common Sense    14 年前

    是的,可以更新每个字段。
    生成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";