Добавить 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, но суть в том, что я беру уровень, добавляю к нему один, а затем обновляю, кажется, было бы намного проще и быстрее, если бы я мог сделать это одним запросом.
Изменить: $id
уже было принудительно введено в целое число, поэтому на этот раз экранирование не требуется.
Ответов (7)7
Я сбился из-за этого?
$sql = "UPDATE skills SET level = level+1 WHERE id = $id";
$result = $db->sql_query($sql);
$db->sql_freeresult($result);
В конкретном случае Teifion, phpBB DDL перечисляет это конкретное поле как 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.