2014-08-27 2 views
4

У меня есть веб-программа, которая позволяет администратору обновлять информацию о пользователе ... С этим сказанным, я хочу только столбцы обновляемые, которые на самом деле были «обновлены» ...PDO MYSQL Update только Если Different

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

Может кто-нибудь, пожалуйста, помогите мне с утверждением?

По существу в psuedocode: Update FIRSTNAME if $editedUserdata['firstname'] != FIRSTNAME, LASTNAME if $editedUserData['lastname'] = ФАМИЛИЯ ... и т.д. ...

Вот что я для почтового кода ...

 $password = sha1($password); 
     $editedUserData = array(
       'firstname' => $firstname, 
       'lastname' => $lastname, 
       'username' => $username, 
       'password' => $password, 
       'cellphone' => $cellphone, 
       'security_level' => $seclvl, 
       'email' => $email, 
       'direct_phone' => $direct, 
       'ext_num' => $extension, 
       'is_active' => $userflag 
      ); 

Тогда это должно быть что-то вроде

$query = $this->db->prepare('UPDATE FIRSTNAME if(?) IS NOT FIRSTNAME, LASTNAME if(?) IS NOT LASTNAME, USERNAME if (?) IS NOT USERNAME.... VALUES (:firstname, :lastname, :username).....' 

if ($query -> execute($editedUserData)) { 
    more code.... 
+0

@ spencer7593 ahhh Извиняюсь, утверждение в вопросе было неверно истолковано. Я хочу просто оператор ONE для обновления всех полей alltogether ... Заявление psudocode будет обновляться через секунду. Я не требую отдельного запроса для каждого поля. Я просто хочу одно уникальное обновление для всех полей. – hawkhorrow

+0

Прошу прощения за непонимание вопроса, который вы задали. Вы не можете условно указать столбец для обновления в инструкции UPDATE. Если столбец назван в списке SET, тогда вы должны указать для него значение. Вы можете использовать выражение, следующее за оператором присваивания, и это выражение может условно вернуть текущее значение столбца. Нет преимущества в производительности для получения текущих значений, по сравнению с новыми значениями, а затем вывода оператора UPDATE для назначения только измененных значений. Будет проще обновить все столбцы. – spencer7593

+0

ВСЕ: СПАСИБО ЗА ВАШИ ОТВЕТЫ. Я смотрел на это с точки зрения производительности, но из ваших ответов я понимаю, что одно обновление будет наиболее полезным. Еще раз спасибо – hawkhorrow

ответ

3

Возможно, я не понимаю проблему, которую вы пытаетесь решить, но вам не нужно проверять, изменилось ли значение поля.

Если значение поля «A» и вы поставите там «А» он будет оставаться таким же иначе, если вы поставите там «B» будет обновляться, как и ожидалось

Подготовленное заявление было бы что-то подобный

$stmt = $dbh->prepare(" 
    UPDATE table_name 
    SET 
     field1 = :value1, 
     field2 = :value2 
    WHERE 
     field0 = :key 
"); 

$stmt->bindParam(':value1', $value1, PDO::PARAM_STR); 
$stmt->bindParam(':value2', $value2, PDO::PARAM_STR); 
$stmt->bindParam(':key', $key, PDO::PARAM_INT); 

$stmt->execute() 
0

Если вы действительно хотите использовать чехлы, прочитайте this.

Там нет причин, чтобы сделать это в вашем случае, как указано от @ spencer7593 в комментариях:

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

Я предполагаю, что любая СУБД достаточно умна, чтобы заметить, что Caches и т. Д. Не следует пересчитывать (если ничего не меняется), если это проблема.

1

Запустите один оператор, чтобы обновить строку.

Во-первых, каков уникальный идентификатор строки в таблице users, есть ли уникальный номер userid или username? Вам понадобится предложение WHERE в инструкции UPDATE, чтобы обновилась только эта строка.

Нормативная модель для оператора UPDATE для обновления нескольких столбцов в одной строке, как это:

UPDATE users 
    SET col2 = 'value' 
    , col3 = 'another value' 
    , col4 = 'fi' 
WHERE idcol = idvalue ; 

Чтобы использовать подготовленное заявление с PDO, текст SQL может выглядеть следующим образом, если вы используете именованные заполнители:

UPDATE users 
    SET col2 = :col2_value 
    , col3 = :col3_value 
    , col4 = :col4_value 
WHERE idcol = :id_value 

Или это, если вы используете позиционные обозначения для заполнителей:

UPDATE users 
    SET col2 = ? 
    , col3 = ? 
    , col4 = ? 
WHERE idcol = ? 

(Мое личное предпочтение заключается в использовании названных заполнителей, а не в позиционном, но либо будет работать.)

Вот как бы я это сделал, запустите команду подготовки, а затем bind_param, а затем выполним.

$sql = "UPDATE users 
      SET col2 = :col2_value 
      , col3 = :col3_value 
      , col4 = :col4_value 
     WHERE idcol = :id_value "; 

$stmt = $dbh->prepare($sql); 
$stmt->bindParam(':col2_value', $col2_val, PDO::PARAM_STR); 
$stmt->bindParam(':col3_value', $col3_val, PDO::PARAM_STR); 
$stmt->bindParam(':col4_value', $col4_val, PDO::PARAM_STR); 
$stmt->bindParam(':id_value' , $id_val, PDO::PARAM_STR); 
$stmt->execute(); 

Чтобы сделать что-то другое, чтобы динамически создать текст SQL, и настроить bindParam вызовы, что бы добавить ненужную сложность кода. Для этого нет преимущества в производительности; когда этот оператор UPDATE запускается, MySQL должен заблокировать строку, сохранить новую копию строки. Это ничего не спасает (кроме нескольких байтов передачи данных), чтобы не отправлять значение столбца, которое не изменилось.

13

Согласно документации MySQL - Ссылка: (http://dev.mysql.com/doc/refman/5.0/en/update.html)

«Если вы установите столбец значения в настоящее время он имеет, MySQL замечает это и не обновляет его»

+0

Спасибо за это. – Leo

+0

Триггер, похоже, срабатывает в любом случае http://stackoverflow.com/questions/6296313/mysql-trigger-after-update-only-if-row-has-changed – Blauhirn

Смежные вопросы