Подтвердить что ты не робот

Добавить 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 уже был вынужден быть целым числом, поэтому на этот раз не требуется экранирование.

4b9b3361

Ответ 1

Я получаю от этого изменения?

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

В конкретном случае Teifion, DDP файл 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.

Ответ 2

Таким образом:

UPDATE skills
SET level = level + 1
WHERE id = $id

Ответ 3

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

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

Ответ 4

$sql = "Усовершенствования UPDATE SET level = level + 1 WHERE id = $id";

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

Ответ 5

попробуйте это

UPDATE skills SET level = level + 1 WHERE id = $id

Ответ 6

Как насчет:

UPDATE skills SET level = level + 1 WHERE id = $id;

Ответ 7

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

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