很多'if语句',还是冗余的mysql查询?

时间:2010-06-23 11:07:50

标签: php mysql if-statement

$ 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 个答案:

答案 0 :(得分:6)

我认为这两种方式并不重要 - 您发送到服务器的查询的大小在这里几乎不相关,并且没有“最近更新”的信息用于不正当更新的列,所以。 ..

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

$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"] = ....

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

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