Question

Comment 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 je récupère le niveau, que j'y ajoute un puis que je mets à jour, il semble que ce serait beaucoup plus facile et plus rapide si je pouvais le faire en une seule requête.

Modifier: $id a déjà été forcé à être un entier, donc aucun échappement n'est nécessaire cette fois.

Était-ce utile?

La solution

Je suis downmoddé 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 phpBB répertorie ce champ particulier comme NOT NULL, il n'y a donc aucun danger d'incrémenter NULL.

Dans le cas général, vous ne devez pas utiliser NULL pour représenter zéro.Incrémentation de NULL devrait donner une réponse NULL.Si vous êtes le genre de développeur malavisé qui pense que NULL = 0, éloignez-vous du clavier et trouvez un autre passe-temps, vous ne faites que rendre la vie difficile au reste d'entre nous.Bien sûr, nous sommes dans 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 soyons réalistes :vous vous trompez.Si tout le monde commence au niveau 0, alors votre DDL devrait inclure

level INT DEFAULT '0' NOT NULL

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

Autres conseils

Par ici:

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

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

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

J'espère juste que vous désinfectez correctement $id ailleurs dans votre code !

essaye ça

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

Que diriez-vous:

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

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

Aussi:Oui, mysql_escape_string()!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top