Ярлык для обновления строки таблицы в базе данных? - PullRequest
1 голос
/ 01 августа 2011

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

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

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

}

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

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

1 Ответ

2 голосов
/ 01 августа 2011

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

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

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

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

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

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

ОБНОВЛЕНИЕ: Предлагаемое решение

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

$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']
    ));

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...