Frage

Wie verwandle ich die folgenden 2 Abfragen in 1 Abfrage?

$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 verwende es in einem phpBB-Mod, aber das Wesentliche ist, dass ich mir das Level schnappe, eins hinzufüge und dann aktualisiere. Es scheint, dass es viel einfacher und schneller wäre, wenn ich es als eine Abfrage tun könnte.

Bearbeiten: $id wurde bereits als Ganzzahl erzwungen, daher ist dieses Mal kein Escape erforderlich.

War es hilfreich?

Lösung

Ich werde dafür herabgestuft?

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

Im speziellen Fall von Teifion listet die phpBB-DDL dieses bestimmte Feld als NOT NULL auf, sodass keine Gefahr besteht, NULL zu erhöhen.

Im Allgemeinen sollten Sie NULL nicht zur Darstellung von Null verwenden.NULL erhöhen sollen Geben Sie eine Antwort von NULL.Wenn Sie zu der Art von fehlgeleitetem Entwickler gehören, der denkt, NULL=0, sich von der Tastatur fernzuhalten und sich einen anderen Zeitvertreib zu suchen, machen Sie dem Rest von uns nur das Leben schwer.Natürlich ist dies die Computerindustrie und wer soll uns sagen, dass Sie Unrecht haben?Wenn Sie sich nicht irren, verwenden Sie

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

...aber seien wir ehrlich:du liegst falsch.Wenn alle auf Level 0 beginnen, sollte Ihr DDL Folgendes enthalten

level INT DEFAULT '0' NOT NULL

für den Fall, dass die Programmierer vergessen, es festzulegen, wenn sie einen Datensatz erstellen.Wenn nicht jeder auf Level 0 beginnt, überspringen Sie den Standardwert und zwingen Sie den Programmierer, bei der Erstellung einen Wert anzugeben.Wenn es Menschen gibt, die sich jenseits von Ebenen befinden und für die es bedeutungslos ist, eine Ebene zu haben, dann hat das Hinzufügen einer Ebene zu ihrer Ebene ebenfalls keine Bedeutung.Löschen Sie in diesem Fall NOT NULL aus der DDL.

Andere Tipps

Hier entlang:

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

Mit PDO und vorbereiteter Abfrage:

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

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

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

Versuche dies

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

Wie wäre es mit:

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

Matte:Das ist es, was aus der Frage eingefügt wurde.Es wurde nicht bearbeitet, daher führe ich das auf einen Fehler in Markdown zurück.Aber seltsamerweise ist es mir aufgefallen.

Auch:Ja, mysql_escape_string()!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top