#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.