2014-10-12 3 views
1

У меня есть быстрый вопрос ... Я обновляю все значения в строке с помощью подготовленного оператора и массива.Обновите все значения, кроме поля автоинкремента, используя PHP/MySql/PDO

При первой установке, мое заявление выглядит следующим образом (и работает отлично)

$sql="INSERT INTO $dbtable VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 

Первые и последние значения NULL как первое является полем ID автоматического приращения и последним поле временной метки.

Есть ли способ сохранить свое UPDATE заявление так просто, как мой INSERT заявление, как это ...

$sql="UPDATE $dbtable SET (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) WHERE `announcements`.`id` = $id LIMIT 1"; 

Я понимаю, что это не работает, как это связано с первым значением, являющимся поля автоматическое приращение, есть ли значение, которое я мог бы поместить в свой массив, чтобы «пропустить» это поле?

Возможно, это не лучший способ описать мой вопрос, но если вам нужна дополнительная информация, пожалуйста, дайте мне знать!

Спасибо заранее!

+0

Это даже работает? Я никогда раньше не видел этот синтаксис для обновления. Вы должны указать столбцы AFAIK. – Devon

ответ

2

UPDATE не имеет синтаксиса «неявных столбцов», например INSERT. Вы должны указать все столбцы, которые вы хотите изменить.

Один из вариантов вы можете использовать в MySQL является REPLACE:

REPLACE INTO $dbtable VALUES (?, ?, ?, ?, ?, ...) 

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

Подробнее о REPLACE здесь: https://dev.mysql.com/doc/refman/5.6/en/replace.html

Обратите внимание, что это внутренне очень похоже на @ предложение Девон использования двух заявлений, а DELETE, за которым следует INSERT. Например, когда вы запускаете REPLACE, если у вас есть триггеры, активируются три триггера ON DELETE, а затем триггеры ON INSERT. Он также имеет побочные эффекты при использовании внешних ключей.

+0

Конечно, я забыл о более простой замене. – Devon

+0

Отлично! Это отлично работает! Большое спасибо :) – VIDesignz

1

Решение, о котором я думаю, не включает в себя UPDATE.

DELETE FROM $dbtable WHERE id = $id; 
INSERT INTO $dbtable VALUES ($id, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); 

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

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