Ajouter 1 à un champ

Comment puis-je transformer les 2 requêtes suivantes en 1 requête

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

Je l'utilise dans un mod phpBB mais l'essentiel est que j'attrape le niveau, y ajoute un, puis le met à jour, il semble que ce serait beaucoup plus facile et plus rapide si je pouvais le faire en une seule requête.

Edit: $ id a déjà été forcé à être un entier, donc aucune échappée n'est nécessaire cette fois.

0

7 Réponses

$ sql = "MISE À JOUR compétences niveau SET = niveau + 1 WHERE id = $ id";

J'espère juste que vous nettoyez $ id ailleurs dans votre code!

0
ajouté
en particulier sans guillemets, quelqu'un n'a même pas besoin d'échapper la dernière citation avec SQL Injection $ id = "'null" OU DELETE FROM skills; "; haha
ajouté l'auteur Josh Bedo, source

essaye ça

UPDATE skills SET level = level + 1 WHERE id = $id
0
ajouté

Par ici:

UPDATE skills
SET level = level + 1
WHERE id = $id
0
ajouté

Je suis démodé pour ça?

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

Dans le cas spécifique de Teifion, le DDL de phpBB liste ce champ particulier comme NOT NULL, donc il n'y a aucun danger d'incrémentation de NULL.

Dans le cas général, vous ne devez pas utiliser NULL pour représenter zéro. Incrémenter NULL devrait donner une réponse de NULL. Si vous êtes le genre de développeur mal avisé qui pense que NULL = 0, éloignez-vous du clavier et trouvez un autre passe-temps, vous rendez la vie dure pour le reste d'entre nous. Bien sûr, c'est l'industrie informatique et qui sommes-nous pour dire que vous avez tort? Si vous n'avez pas tort, utilisez

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

... mais avouons-le: vous avez tort. Si tout le monde commence au niveau 0, alors votre DDL devrait inclure

level INT DEFAULT '0' NOT NULL

au cas où les programmeurs oublient de le définir quand ils créent un enregistrement. Si tout le monde ne démarre pas au niveau 0, ignorez le DEFAULT et forcez le programmeur à fournir une valeur à la création. Si certaines personnes sont au-delà des niveaux, pour qui avoir un niveau est une chose insignifiante, alors en ajouter une à leur niveau n'a pas de sens. Dans ce cas, supprimez le NOT NULL du DDL.

0
ajouté
J'ai un problème où si 'level' est nul, il n'augmentera pas.
ajouté l'auteur MaurerPower, source

Mat: C'est ce qui collait de la question. Il n'a pas été édité, donc j'attribue cela à un bug dans Markdown. Mais, curieusement, j'ai remarqué.

Aussi: oui, mysql_escape_string() !

0
ajouté

Que diriez-vous:

UPDATE skills SET level = level + 1 WHERE id = $id;
0
ajouté

Avec PDO et requête préparée:

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