2008-08-08 21 views
18

Wie die folgenden 2 Abfragen in 1 Abfrage1 In einem Feld

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

Ich drehe ich verwende es in einem phpBB mod aber das Wesentliche ist, dass ich die Ebene greifen, fügen Sie ein, um es dann Update, es scheint, dass es viel einfacher und schneller wäre, wenn ich es als eine Abfrage tun könnte.

Bearbeiten: $id wurde bereits gezwungen, eine ganze Zahl zu sein, so dass diesmal keine Flucht erforderlich ist.

Antwort

29

Ich bekomme downmodded dafür?

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

In Teifion spezifischen Fall listet die phpBB DDL dass bestimmte Feld als NOT NULL, also gibt es keine Gefahr, NULL zu inkrementieren.

Im allgemeinen Fall sollten Sie NULL nicht als Null darstellen. Inkrementieren NULL sollte geben eine Antwort von NULL. Wenn Sie der falsche Entwickler sind, der NULL = 0 denkt, gehen Sie von der Tastatur weg und finden Sie einen anderen Zeitvertreib, Sie machen dem Rest von uns das Leben schwer. Natürlich, das ist die Computerindustrie und wem sollen wir sagen, dass Sie falsch liegen? Wenn Sie nicht falsch liegen, verwenden Sie

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

... aber lassen Sie uns ehrlich sein: Sie irren sich. Wenn jeder auf der Ebene 0 beginnt, dann sollten Sie Ihre DDL

level INT DEFAULT '0' NOT NULL 

in Fall sind die Programmierer vergessen, es zu setzen, wenn sie einen neuen Eintrag erstellen. Wenn nicht alle auf Stufe 0 beginnen, dann überspringen Sie die DEFAULT-Anweisung und erzwingen, dass der Programmierer bei der Erstellung einen Wert angibt. Wenn einige Menschen über Ebenen hinaus sind, für die ein Level eine bedeutungslose Sache ist, dann hat das Hinzufügen einer Ebene zu ihrer Ebene keine Bedeutung. In diesem Fall löschen Sie NOT NULL aus der DDL.

+1

Ich habe ein Problem, wenn ‚Wert‘ null ist, wird es nicht erhöhen. – MaurerPower

2

$ sql = "UPDATE Fähigkeiten SET level = level + 1 WHERE id = $ id";

Ich hoffe nur, dass Sie $ id an anderer Stelle in Ihrem Code ordnungsgemäß bereinigen!

+0

Insbesondere ohne Anführungszeichen muss jemand nicht einmal das letzte Zitat mit SQL Injection $ id = "'null' ODER DELETE FROM skills;"; Haha –

1

versuchen, diese

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

auf diese Weise:

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

Wie wäre:

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

Mat: Das ist, was von der Frage in klebte. Es wurde nicht bearbeitet, also schreibe ich das einem Fehler in Markdown zu. Aber merkwürdigerweise habe ich es bemerkt.

Auch: ja, mysql_escape_string()!

5

Mit PDO und vorbereiteter Abfrage:

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