2008-08-08 6 views
18

Comment activer les 2 requêtes suivantes dans 1 requêteAjouter 1 à un champ

$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 prends le niveau, ajouter un à ce alors mise à 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é d'être un entier, donc aucune échappée n'est nécessaire cette fois.

Répondre

29

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, les listes phpBB DDL ce domaine particulier NOT NULL, donc il n'y a pas de danger de incrémenter NULL.

Dans le cas général, vous ne devez pas utiliser NULL pour représenter zéro. Incrémenter NULL si donne 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 regardons les choses en face: vous avez tort. Si tout le monde commence au niveau 0, votre LDD devrait inclure

level INT DEFAULT '0' NOT NULL 

dans le cas où les programmeurs oublient de le mettre 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.

+1

J'ai un problème où si « niveau » est nul, il ne sera pas augmenter la valeur. – MaurerPower

2

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

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

+0

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 compétences;"; haha –

1

essayer cette

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

De cette façon:

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

Que diriez-vous:

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

Mat: C'est ce que collé dans de la question. Il n'a pas été édité, donc j'attribue cela à un bug dans Markdown. Mais, curieusement, j'ai remarqué. En outre: oui, mysql_escape_string()!

5

avec AOP 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(); 
Questions connexes