Обновить int в поле MySQL

Как я могу увеличить int в ячейке базы данных MySQL? Я знаю, что автоинкремент бесполезен, потому что я никогда не хочу добавлять новую строку, просто обновляю существующую. В настоящее время я использую это (переменная POST используется для пояснения, проверена в реальном коде):

$columnToUpdate = 'type'.$_POST['voteid'];
$query = "UPDATE myTable $columnToUpdate = $columnToUpdate+1 WHERE id=1;";
if(!mysql_query($query)) {
    echo json_encode(array('success' => false, 'message' => 'Update failed: '.mysql_error()));
    exit;
}

В базе данных у меня есть 6 полей, id, type1, type2, type3, type4, type5 и одна строка с id, установленным на 1. Намерение состоит в том, чтобы получить число (1-5) и создать ссылку на правильный столбец перед обновлением поля. Это приводит к Update failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=type4+1 WHERE id=1' at line 1, поэтому я предполагаю, что значение поля не выводится должным образом до того, как оно увеличивается.

Как только это сработает, мне также нужно будет уменьшить значение поля таким же образом, если только его значение не равно 0. Итак, что касается бонусных баллов, могу ли я сделать все это в одном запросе или лучше разделить его?


person shanethehat    schedule 26.05.2011    source источник
comment
Как я уже сказал выше, это упрощено, чтобы добраться до корня проблемы. Конечно, я не собираюсь просто вставлять данные POST в запрос :)   -  person shanethehat    schedule 26.05.2011


Ответы (3)


Я думаю, вы пропустили ключевое слово "SET" в своем запросе - попробуйте

$query = "UPDATE myTable SET $columnToUpdate = $columnToUpdate+1 WHERE id=1;";

Редактировать:

Чтобы сделать «уменьшение, если оно не равно нулю», вы можете использовать что-то вроде:

UPDATE myTable SET $columnToUpdate = 
CASE $columnToUpdate 
    WHEN 0 THEN 0
    ELSE $columnToUpdate - 1
END CASE
WHERE id=1;`
person marnir    schedule 26.05.2011
comment
+1 правильный ответ. Но к OP: вам также нужно обратить внимание на комментарий @ Denis и решить проблемы с безопасностью SQL-инъекций. - person Spudley; 26.05.2011
comment
Хорошо заметный сэр, я, кажется, ослеп! Хотите ответить на вопрос о бонусе? - person shanethehat; 26.05.2011
comment
(Я отредактировал свой пост, чтобы включить предположение, но я не уверен, что синтаксис идеален) - person marnir; 26.05.2011

Для бонусных баллов на уменьшение:

$query = "UPDATE myTable SET '$columnToUpdate' = '$columnToUpdate'-1 WHERE id=1 AND '$columnToUpdate' > 0";
person qbert220    schedule 26.05.2011
comment
Хороший, и он тоже будет сочетаться с оригиналом. Мне лень спросить, так что спасибо! - person shanethehat; 26.05.2011

Помимо проблем с инъекциями, похоже, что ваш рабочий процесс может нуждаться в некоторой доработке. Вы уверены, что хотите выбрать столбец, который будет обновляться на основе переменной POST? Похоже, вы должны указать столбец и использовать переменную для поиска записи, которую необходимо обновить:

IE: "UPDATE myTable SET votes=votes+1 WHERE id=$post_variable;"

Опять же, вы должны отправить переменную как параметризованный запрос для защиты себя из SQL-инъекции.

person garnertb    schedule 26.05.2011