$ 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)(这本身就是一个查询),我会更新所有列吗?
由于
答案 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";