Много «если заявление», или избыточный запрос MySQL? - PullRequest
2 голосов
/ 23 июня 2010

$ 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 = $ Возможный_new_entry) для каждого (что само по себе является запросом)?

Спасибо

Ответы [ 4 ]

6 голосов
/ 23 июня 2010

Я бы сказал, что в любом случае это не имеет значения - размер запроса, который вы отправляете на сервер, вряд ли здесь уместен, и нет информации о «последнем обновлении» для столбцов, которые будут обновляться несправедливо, поэтому ..

Кстати, при работе с такими нагрузками мне нравится создавать временный массив.

$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"] = ....
1 голос
/ 23 июня 2010

Я бы порекомендовал вам выполнить ОБНОВЛЕНИЕ со всеми значениями столбцов.Это будет дешевле, чем пытаться подтвердить, что значение отличается от того, что в настоящее время находится в базе данных.И это подтверждение в любом случае не имеет значения, потому что значения в базе данных могут измениться сразу после того, как вы проверите их, если кто-то еще их обновит.

Если вы выполните UPDATE для MySQL, и значения идентичны значениям, уже имеющимся в базе данных, UPDATE будет запрещен.То есть MySQL сообщает об отсутствии затронутых строк.MySQL знает, чтобы не делать ненужную работу во время ОБНОВЛЕНИЯ.

Если изменяется только один столбец, MySQL действительно должен работать.Он только изменяет столбцы, которые отличаются, но он по-прежнему создает новую версию строки (при условии, что вы используете InnoDB).

И, конечно, есть небольшой объем работы, необходимый для фактической отправки оператора UPDATE вMySQL сервер, чтобы он мог сравнить с существующей строкой.Но обычно на современном сервере это занимает всего лишь сотые доли миллисекунды.

1 голос
/ 23 июня 2010

Просто запустите один запрос, который обновит все столбцы:

UPDATE table SET col1='a', col2='b', col3='c' WHERE id = '5'
0 голосов
/ 23 июня 2010

Да, все поля можно обновлять.
Простая функция для создания оператора 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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...