Сокращение для обновления строки таблицы в базе данных?

Интересно, является ли эта идея хорошей практикой для обновления строки в таблице в базе данных.

Обычно я обновляю строку следующим образом:

$pg_id = set_variable($_POST,'pg_id'); $pg_url = set_variable($_POST,'pg_url'); $pg_title = set_variable($_POST,'pg_title'); $pg_subtitle = set_variable($_POST,'pg_subtitle'); $pg_description = set_variable($_POST,'pg_description'); $pg_introduction = set_variable($_POST,'pg_introduction'); $pg_content_1 = set_variable($_POST,'pg_content_1'); $pg_content_2 = set_variable($_POST,'pg_content_2'); $pg_content_3 = set_variable($_POST,'pg_content_3'); $pg_content_4 = set_variable($_POST,'pg_content_4'); $pg_backdate = set_variable($_POST,'pg_backdate'); $pg_tag = set_variable($_POST,'pg_tag'); $pg_user = set_variable($_POST,'pg_user'); $pg_member = set_variable($_POST,'pg_member'); $pg_highlight = set_variable($_POST,'pg_highlight'); $pg_hide = set_variable($_POST,'pg_hide'); $pg_cat_id = set_variable($_POST,'pg_cat_id'); $ps_cat_id = set_variable($_POST,'ps_cat_id'); $parent_id = set_variable($_POST,'parent_id'); $tmp_id = set_variable($_POST,'tmp_id'); $usr_id = set_variable($_POST,'usr_id'); $sql = " UPDATE root_pages SET pg_url = ?, pg_title = ?, pg_subtitle = ?, pg_backdate = ?, pg_description = ?, pg_introduction = ?, pg_content_1 = ?, pg_content_2 = ?, pg_content_3 = ?, pg_content_4 = ?, pg_highlight = ?, pg_hide = ?, ps_cat_id = ?, parent_id = ?, tmp_id = ?, updated_by = ? WHERE pg_id = ? "; # use the instantiated db connection object from the init.php, to process the query $result = $connection->run_query($sql,array( $pg_url, $pg_title, $pg_subtitle, $pg_backdate, $pg_description, $pg_introduction, $pg_content_1, $pg_content_2, $pg_content_3, $pg_content_4, $pg_highlight, $pg_hide, $ps_cat_id, $parent_id, $tmp_id, $usr_id, $pg_id )); 

Я нахожу, что это занимает много времени, чтобы печатать, чтобы перечислить все поля в таблице, когда приходит на обслуживание, поэтому у меня есть эта короткая идея, чтобы обойти ее,

 # queury the table columns. $sql = " SHOW COLUMNS FROM root_pages "; # use the stored connection object from the class_page_controller.php, to process the query. $columns = $connection->fetch_all($sql); # loop through the table columns, select the 'Field' column only, turn the field into variables, then get the variable's value from the array. foreach($columns as $column) { $$column['Field'] = set_variable($_POST,$column['Field']); } foreach($columns as $column) { $sql = " UPDATE root_pages SET ".$column['Field']." = ? WHERE pg_id = ? "; # use the instantiated db connection object from the init.php, to process the query $result = $connection->run_query($sql,array($$column['Field'],$pg_id)); } 

Он короче, но я использую множество циклов в этом короткометраже – это плохо?

Это делает сервер медленным в обработке обновления? Какие проблемы я получу в этом методе, который я не вижу?

Больше запросов означает больше времени, поэтому, если вы обновляете каждое поле по отдельности (а не по строке за раз), это займет значительно больше времени.

Кроме того, вы можете применить фильтр к представленным значениям, чтобы убедиться, что поле, которое вы не хотите обновлять, может быть неактивным.

Например, если у вас есть таблица пользователей, у которых были оставлены остатки на счетах:

 id | user | credit ========================== 1 | John Smith | 50 

Если я могу отправить форму обработчику формы, так как поле «кредит» появится в запросе SHOW COLUMNS... , я могу отправить вам сообщение POST через форму, предназначенную для меня, чтобы изменить мое имя , с $_POST['user'] = "Mike Rowe" и $_POST['credit'] = 9999 , и вы изменили бы это на:

 id | user | credit ========================== 1 | Mike Rowe | 9999 

UPDATE: предлагаемое решение

Вместо того, чтобы доверять тому, что имена полей базы данных безопасны для обработки такого запроса, почему бы вам не создать собственный массив редактируемых полей и просто пропустить их?

 $editable_fields = array( 'pg_url' , 'pg_title' , ... ); $form_values = array(); $sql_pattern = array(); foreach( $editable_fields as $k ){ if( $k != 'pg_id' && isset( $_POST[$k] ) ){ $form_values[$k] = $_POST[$k]; // NOTE: You could use a variant on your above code here, like so // $form_values[$k] = set_variable( $_POST , $k ); $sql_pattern[] = "$k = ?"; } } $sql_pattern = 'UPDATE root_pages SET '.implode( ' , ' , $sql_pattern ).' WHERE pg_id = ?'; # use the instantiated db connection object from the init.php, to process the query $result = $connection->run_query($sql_pattern,array_merge( $form_values , $_POST['pg_id'] )); 

ПРИМЕЧАНИЕ. Этот код не проверен, а не так, как я обычно использую, поэтому используйте его как руководство, а не библию …