Вопрос
Как мне превратить следующие 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
уже было принудительно преобразовано в целое число, поэтому на этот раз экранирование не требуется.
Решение
Меня из-за этого унижают?
$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 = 0, отойдите от клавиатуры и найдите другое развлечение, вы просто усложняете жизнь остальным из нас.Конечно, это компьютерная индустрия, и кто мы такие, чтобы говорить, что вы не правы?Если вы не ошибаетесь, используйте
$sql = "UPDATE skills SET level = COALESCE(level,0)+1 WHERE id = $id";
..но давайте посмотрим правде в глаза:ты ошибаешься.Если все начинают с уровня 0, то ваш DDL должен включать
level INT DEFAULT '0' NOT NULL
на случай, если программисты забудут установить его при создании записи.Если не все начинают с уровня 0, то пропустите значение ПО УМОЛЧАНИЮ и заставьте программиста указать значение при создании.Если некоторые люди находятся за пределами уровней, для которых наличие уровня бессмысленно, то добавление одного к их уровню в равной степени не имеет смысла.В этом случае удалите значение NOT NULL из DDL.
Другие советы
Сюда:
UPDATE skills
SET level = level + 1
WHERE id = $id
С PDO и подготовленным запросом:
$query = $db->prepare("UPDATE skills SET level = level + 1 WHERE id = :id")
$query->bindValue(":id", $id);
$result = $query->execute();
$sql = "ОБНОВИТЬ набор навыков level = уровень + 1, ГДЕ id = $id";
Я просто надеюсь, что вы правильно очищаете $id в другом месте вашего кода!
попробуй это
UPDATE skills SET level = level + 1 WHERE id = $id
Как насчет:
UPDATE skills SET level = level + 1 WHERE id = $id;
Коврик:Это то, что вытекает из вопроса.Он не был отредактирован, поэтому я объясняю это ошибкой в Markdown.Но, как ни странно, я это заметил.
Также:ДА, mysql_escape_string()
!