Pergunta

Como faço para transformar as 2 consultas a seguir em 1 consulta

$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);

Estou usando-o em um mod phpBB, mas a essência é que eu pego o nível, adiciono um e atualizo, parece que seria muito mais fácil e rápido se eu pudesse fazer isso como uma consulta.

Editar: $id já foi forçado a ser um número inteiro, portanto, nenhum escape é necessário desta vez.

Foi útil?

Solução

Eu fico desanimado por isso?

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

No caso específico do Teifion, o DDL do phpBB lista esse campo específico como NOT NULL, portanto não há perigo de incrementar NULL.

No caso geral, você não deve usar NULL para representar zero.Incrementando NULL deve dê uma resposta NULL.Se você é o tipo de desenvolvedor equivocado que pensa NULL = 0, afaste-se do teclado e encontre outro passatempo, você está apenas dificultando a vida do resto de nós.Claro, esta é a indústria da informática e quem somos nós para dizer que você está errado?Se você não está errado, use

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

...mas vamos encarar:você está errado.Se todos começarem no nível 0, então seu DDL deverá incluir

level INT DEFAULT '0' NOT NULL

caso os programadores se esqueçam de configurá-lo ao criar um registro.Se nem todos começarem no nível 0, pule o DEFAULT e force o programador a fornecer um valor na criação.Se algumas pessoas estão além dos níveis, para quem ter um nível não tem sentido, então adicionar um ao seu nível também não tem sentido.Nesse caso, elimine NOT NULL do DDL.

Outras dicas

Por aqui:

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

Com DOP e consulta preparada:

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

$sql = "ATUALIZAR habilidades SET nível = nível + 1 WHERE id = $id";

Só espero que você esteja higienizando $id adequadamente em outras partes do seu código!

tente isso

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

Que tal:

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

Esteira:Isso é o que foi colado na pergunta.Não foi editado, então atribuo isso a um bug no Markdown.Mas, por incrível que pareça, eu percebi.

Também:sim, mysql_escape_string()!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top