Добавить 1 в поле

Как превратить следующие 2 запроса в 1 запрос

$sql    = "SELECT level FROM skills WHERE id = $id LIMIT 1;";
$result = $db->sql_query($sql);
$level  = (int) $db->sql_fetchfield('level');
$db->sql_freeresult($result);

++$level;

$sql    = "UPDATE skills SET level = $level WHERE id = $id;";
$result = $db->sql_query($sql);
$db->sql_freeresult($result);

Я использую его в моде phpBB, но суть в том, что я беру уровень, добавляю к нему, а затем обновляю, кажется, что было бы намного проще и быстрее, если бы я мог сделать это как один запрос.

Edit: $idуже был вынужден быть целым числом, поэтому на этот раз экранирование не требуется.

8.08.2008 12:34:20
7 ОТВЕТОВ
РЕШЕНИЕ

Меня унизили за это?

$sql = "UPDATE skills SET level = level+1 WHERE id = $id";
$result = $db->sql_query($sql);
$db->sql_freeresult($result);

В конкретном случае Teifion DDL phpBB перечисляет это конкретное поле как NOT NULL, поэтому нет опасности увеличения NULL.

В общем случае вы не должны использовать NULL для представления нуля. Увеличение NULL должно дать ответ NULL. Если вы из тех заблудших разработчиков, которые думают, что NULL = 0, отойдите от клавиатуры и найдите другое занятие, вы просто усложняете жизнь остальным. Конечно, это компьютерная индустрия, и кто мы такие, чтобы говорить, что ты не прав? Если вы не ошиблись, используйте

$sql = "UPDATE skills SET level = COALESCE(level,0)+1 WHERE id = $id";

... но давайте посмотрим правде в глаза: вы не правы. Если все начинают с уровня 0, тогда ваш DDL должен включать

level INT DEFAULT '0' NOT NULL

на случай, если программисты забудут установить его при создании записи. Если не все начинают с уровня 0, пропустите DEFAULT и заставьте программиста указать значение при создании. Если некоторые люди находятся за пределами уровней, для которых наличие уровня является бессмысленной вещью, то добавление одного уровня к своему уровню в равной степени не имеет смысла. В этом случае удалите NOT NULL из DDL.

30
14.11.2012 13:16:17
У меня есть проблема, где, если 'уровень' равен нулю, он не будет увеличиваться.
MaurerPower 24.05.2012 21:59:29

$ sql = "Уровень навыков UPDATE SET = уровень + 1, ГДЕ id = $ id";

Я просто надеюсь, что вы правильно очищаете $ id в другом месте вашего кода!

3
8.08.2008 12:36:22
особенно без кавычек, кому-то даже не нужно выходить из последней кавычки с навыками SQL-инъекции $ id = "'null' ИЛИ ​​УДАЛИТЬ ИЗ;"; Хаха
Josh Bedo 21.05.2013 21:06:39

попробуй это

UPDATE skills SET level = level + 1 WHERE id = $id
2
21.01.2014 06:31:01

Сюда:

UPDATE skills
SET level = level + 1
WHERE id = $id
11
8.08.2008 12:36:42

Как насчет:

UPDATE skills SET level = level + 1 WHERE id = $id;
1
21.01.2014 06:31:12

Мэт: Это то, что вставлено из вопроса. Он не редактировался, поэтому я приписываю это ошибке в Markdown. Но, как ни странно, я это заметил.

Также: да mysql_escape_string()!

-1
3.10.2012 08:15:37

С PDO и подготовленным запросом:

$query = $db->prepare("UPDATE skills SET level = level + 1 WHERE id = :id")
$query->bindValue(":id", $id);
$result = $query->execute();
6
25.08.2008 01:19:45