Существует ли функция MySQL для «использования существующего значения» во время обновления?

#php #mysql

#php #mysql

Вопрос:

Есть ли способ с MySQL указать «использовать предыдущее / наследовать / без изменений / существующее значение»?

Вместо того, чтобы извлекать текущие данные из базы данных и использовать их, или иметь настраиваемую функцию базы данных, исключающую редактирование этих столбцов.

 if(x > y) {
$role_id = 3;
} else {
$role_id = '#no-change'; // Is there a way to do this? (not proper SQL syntax)
}

$update_user = $this->db->update('users', 
array(
    'first_name'      =>  filterName($post['first_name']),
    'last_name'      =>  filterName($post['last_name']),
    'email'     =>  filterEmail($post['email']),
    'role_id'     =>  $role_id,
), $user_id_to_edit, 'user_id');
 

В подобном случае, когда функция db использует подготовленные операторы (не показаны) Я не могу использовать имя столбца для отражения текущего значения.

Существует ли такая функция / переменная MySQL, которая по существу «игнорирует» обновление этого столбца? (просто оставьте существующее значение)

ОБНОВЛЕНИЕ: вот функция обновления:

     public function update($table, $data, $where_id, $column = 'user_id') {
        // Check for $table or $data not set
        if (( empty( $table ) || empty( $data )) || empty($data) ) {
            return false;
        }
        // Initiate variable to append to
        $placeholders ='';
        // Parse data for column and placeholder names
        foreach ($data as $key => $value) {
            $placeholders .= sprintf('%s=:%s,', $key, $key);
        }

        // Trim excess commas
        $placeholders = rtrim($placeholders, ',');

        // Append where ID to $data
        $data['where_id'] = $where_id;

        // Prepary our query for binding
        $stmt = $this->db->prepare("UPDATE {$table} SET {$placeholders} WHERE $column = :where_id");

        // Execute the query
        $stmt->execute($data);

        // Check for successful insertion
        if ( $stmt->rowCount() ) {
            return true;
        }

        return false;
    }
 

Комментарии:

1. Почему вы не создаете выборочно ключи / значения массива, которые вы передаете, на основе того, были ли переданы значения?

2. Вот как у меня это сейчас; но это создает кажущийся избыточным код; Мне было интересно, есть ли способ избежать этого. (То, что я показал, является упрощенной версией.)

3. Это зависит от определения $this->db->update() . Если ваша функция поддерживает это, то да. Если нет, то, очевидно, нет. Если вы просите, чтобы синтаксис SQL не обновлял определенный столбец, то я мог бы показать вам это.

4. Я добавил функцию update().

5. Ах. Это вроде того, что я думал, что вы делаете. Тогда мой ответ должен сработать.

Ответ №1:

Вы могли бы попробовать это:

 $data = array(
    'first_name'      =>  filterName($post['first_name']),
    'last_name'      =>  filterName($post['last_name']),
    'email'     =>  filterEmail($post['email']))

if(x > y) {
   $data['role_id'] = 3;
}

$update_user = $this->db->update('users', $data, $user_id_to_edit, 'user_id');

 

Таким образом, вы можете настроить $data заранее, если хотите.

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

 function sanitize($data) {
   if(x > y) {
      $data['role_id'] = 3;
   } else {
      if(isset($data['role_id']) {
         unset($data['role_id']);
      }
   }

   return $data;
}

$data = array(
    'first_name'      =>  filterName($post['first_name']),
    'last_name'      =>  filterName($post['last_name']),
    'email'     =>  filterEmail($post['email']))


$update_user = $this->db->update('users', sanitize($data), $user_id_to_edit, 'user_id');
 

Редактировать: я должен упомянуть, что, если мы говорим о чистом SQL, все, что вам нужно сделать, это исключить эти столбцы из запроса, поэтому:

 UPDATE table SET Col1=val1, Col2=val2, Col3=val3 WHERE id=val
 

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

 UPDATE table SET Col1=val1, Col2=val2 WHERE id=val
 

Поскольку у вас есть функция, которая просто добавляет все, что вы ей даете, вам просто нужно очистить данные заранее. Это, вероятно, лучший способ сделать это.

Комментарии:

1. Напрямую не отвечает на мой вопрос (что касается уникального синтаксиса SQL, но это хорошее предложение по обходному пути. Я приму в качестве ответа.

2. @BeninCA также добавил объяснение синтаксиса SQL.