2011-11-10 3 views
1

У меня есть форма и таблица базы данных с именем reports. У меня есть поле date (первичный ключ) и текстовое поле с именем changes, чтобы сказать, что было изменено в эту дату. Если дата такая же, я хочу, чтобы она могла перезаписать информацию в столбце «changes» для этой даты.Получение ON DUPLICATE KEY UPDATE working

Моя команда вставки, которая работает сама по себе, заключается в следующем:

mysql_query(" 
    INSERT INTO reports (thedate,changes) 
    VALUES ('$_POST[thedate]','$_POST[changes]') 
"); 

Я понимаю, что мне нужно использовать ON DUPLICATE KEY UPDATE после моего INSERT, но после многочисленных попыток я не могу получить это право. Не только ничего не обновляет, но, похоже, он прерывает мою команду вставки, поэтому даже новая строка не добавляется в базу данных.

Извините, если это дублирующийся вопрос. После многих поисков и много попыток я не могу заставить его работать.

+0

Как выглядит ваш запрос, который вы тестировали? – Marcus

ответ

3

Посмотрите на REPLACE.

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для первичного ключа или UNIQUE индекса, старая строка удаляется до новой строки вставлено.

Обратите внимание, что если у вас есть внешний ключ с действием ON DELETE он будет срабатывать при использовании REPLACE, так как это делает удалить, за которым следует вставки.


Использование ON DUPLICATE KEY это может выглядеть следующим образом:

INSERT reports (thedate, changes) VALUES ('$_POST[thedate]', '$_POST[changes]') 
    ON DUPLICATE KEY UPDATE changes = '$_POST[changes]' 
+0

Да, вот и все! Я соглашусь, как только это позволит мне, спасибо –

+0

Поскольку старая строка удалена и создается новая строка, первичный ключ изменится, это может привести к изменению URL-адреса, если у вас есть items.php? Itemid = 1, который плохо для SEO - чтобы обойти это, вам нужно получить PK старой строки и поместить ее в новую строку тоже! – 472084

+0

Итак, просто не используйте REPLACE, а ON DUPLICATE KEY! – netiul

1

Это должно работать:

mysql_query("INSERT INTO reports (thedate,changes) VALUES ('$_POST[thedate]','$_POST[changes]') ON DUPLICATE KEY UPDATE changes=VALUES(changes)");

Неудобство использования REPLACE является то, что это не стандарт SQL, но расширение MySQL. Кроме того, при использовании автоматических добавочных столбцов REPLACE будет повторно вставлен с другим значением. Я не буду рекомендовать его никому.

Редактировать: ON DUPLICATE KEY также не является стандартным SQL. Сожалею!

2

Это обычный SQL-запрос:

INSERT INTO reports (thedate, changes) 
VALUES ('2011-11-10', 'Lorem ipsum') 
ON DUPLICATE KEY UPDATE changes=VALUES(changes) 

http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html

Теперь вы абсолютно необходимо, чтобы сесть и попытаться понять, что SQL и как она взаимодействует с PHP и отличается от него. Вы используете PHP для составления строк, которые являются кодом с другого языка, называемого SQL. Как вы это делаете, полученный код может быть действительным SQL или нет, и он будет зависеть от произвольных данных, отправленных любым анонимным посетителем. В лучшем случае ваш скрипт выйдет из строя. В худшем случае посетитель сможет прочитать конфиденциальные данные или изменить вашу базу данных.Вот пример на странице руководства для mysql_query():

// This could be supplied by a user, for example 
$firstname = 'fred'; 
$lastname = 'fox'; 

// Formulate Query 
// This is the best way to perform an SQL query 
// For more examples, see mysql_real_escape_string() 
$query = sprintf("SELECT firstname, lastname, address, age FROM friends 
    WHERE firstname='%s' AND lastname='%s'", 
    mysql_real_escape_string($firstname), 
    mysql_real_escape_string($lastname)); 

// Perform Query 
$result = mysql_query($query); 
+0

Спасибо за ответ, совет и материал для чтения, я проверю его. В этом случае безопасность не важна (никогда не думал, что я так сказал), поскольку это чисто внутренняя, не связанная с сетью система, к которой можно получить доступ и использовать только меня. –

+0

Хорошо, если случайные сбои не являются проблемой, продолжайте ;-) –

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