PDO, если id не существует, добавьте строку else в дубликат обновления [duplicate]

Более короткая версия:

  import проверить def f1 (): f2 () def f2 (): print 'имя вызывающего абонента:', inspect.stack () [1] [3] f1  ()  

(благодаря @Alex и Stefaan Lippen )

6
задан Robin Knight 5 September 2012 в 15:28
поделиться

4 ответа

Вы назначаете $pro команде prepare, а не execute.

Сказав, что если вы используете mysql, вы можете использовать синтаксис insert... on duplicate key update.

insert into $table (field, value) values (:name, :value) on duplicate key update value=:value2

Вы не можете использовать один и тот же связанный параметр дважды, но вы можете установить два связанных параметра в одно и то же значение.

Изменить: этот синтаксис mysql будет работать только , где (первичный или другой уникальный) присутствует и приведет к сбою вставки.

14
ответ дан Fluffeh 15 August 2018 в 16:24
поделиться
  • 1
    Я использую mySQL, но это вызывает ошибку – Robin Knight 5 September 2012 в 15:41
  • 2
    Это то, что я пробовал: function updateorcreate ($ table, $ name, $ value) {global $ sodb; $ pro = $ sodb- & gt; prepare («INSERT INTO $ table (field, value) values ​​(: name,: value) ON DUPLICATE KEY update value =: value2"); $ Про- & GT; выполнить (массив ( ': Имя' = & Gt; $ имя, значение ':' = & GT; $ значение, ': значение2' = & GT; $ значение)); } – Robin Knight 5 September 2012 в 15:42
  • 3
    @RobinKnight Извините, я должен был упомянуть об этом сразу с места в пути, у вас есть уникальное ограничение, установленное в таблице для столбца field да? – Fluffeh 5 September 2012 в 15:45
  • 4
    Нет, наверное, я должен, потому что не должно быть причин, по которым они когда-либо повторялись – Robin Knight 5 September 2012 в 15:46
  • 5
    @RobinKnight Извините, что этот помощник, да, синтаксис будет работать только в том случае, если столбец ограничен. Извинения, следовало бы упомянуть об этом с самого начала :( – Fluffeh 5 September 2012 в 15:48

try,

    PDO::exec() 

возвращает 1, если вставлено. 2, если строка обновлена.

для подготовленных операторов,

    PDOStatement::execute() 

Вы можете попробовать,

    PDOStement::rowCount()
0
ответ дан FirmView 15 August 2018 в 16:24
поделиться

Если это mysql-only, вы можете попробовать INSERT INTO ... ON DUPLICATE KEY UPDATE

http://dev.mysql.com/doc/refman/5.0/en/insert- на duplicate.html

2
ответ дан Louis Huppenbauer 15 August 2018 в 16:24
поделиться

Сначала вам нужно выполнить его.

Кроме того, это издевательский способ сделать это. Было бы лучше начать транзакцию, сделать SELECT, а затем определить, что делать (INSERT или UPDATE). Просто проверить, не удалось ли выполнить запрос UPDATE, это не удается, если ни одна строка не найдена.

0
ответ дан Sherlock 15 August 2018 в 16:24
поделиться
  • 1
    Хорошо, я пытался понять, можем ли мы обойти этот шаг, но если он не безопасен, тогда я не буду – Robin Knight 5 September 2012 в 15:31
  • 2
    Нет, это небезопасно. – Sherlock 5 September 2012 в 15:32
  • 3
    SELECT - довольно изворотливый способ сделать это тоже. Лучше было бы иметь уникальный ключ на поле, а затем использовать INSERT ... ON DUPLICATE KEY UPDATE .... – cHao 5 September 2012 в 15:32
  • 4
    Я никогда не читал, что он хочет избежать дублирования вообще. Он просто не хочет этого в этой конкретной ситуации. – Sherlock 5 September 2012 в 15:33
Другие вопросы по тегам:

Похожие вопросы: