24

次の 2 つのクエリを 1 つのクエリに変換するにはどうすればよいですか

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

私はphpBB modで使用していますが、要点は、レベルを取得し、それに1つ追加してから更新することです.1つのクエリとして実行できれば、はるかに簡単で高速になるようです.

編集:$idはすでに整数に強制されているため、今回はエスケープは必要ありません。

4

7 に答える 7

31

私はこれのためにダウンモッドになりますか?

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

Teifion の特定のケースでは、phpBB DDL はその特定のフィールドを NOT NULL としてリストするため、NULL をインクリメントする危険はありません。

通常、ゼロを表すために NULL を使用しないでください。NULLをインクリメントすると、NULL の応答が返されます。もしあなたが NULL=0 と考える、見当違いの開発者なら、キーボードから離れて別の娯楽を見つければ、残りの私たちの生活を苦しめるだけです。もちろん、これはコンピューター業界であり、あなたが間違っていると誰が言えますか? 間違っていない場合は、使用してください

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

...しかし、それに直面しましょう: あなたは間違っています。全員がレベル 0 から開始する場合、DDL には以下を含める必要があります。

level INT DEFAULT '0' NOT NULL

プログラマーがレコードを作成するときに設定を忘れた場合に備えて。全員がレベル 0 から開始するわけではない場合は、DEFAULT をスキップして、プログラマーが作成時に値を指定するように強制します。レベルを超えている人がいて、レベルを持つことが無意味である場合、レベルにレベルを追加しても同じように意味がありません。その場合は、DDL から NOT NULL を削除してください。

于 2008-08-08T12:35:53.007 に答える
11

こちらです:

UPDATE skills
SET level = level + 1
WHERE id = $id
于 2008-08-08T12:36:42.113 に答える
6

PDOと準備されたクエリを使用する場合:

$query = $db->prepare("UPDATE skills SET level = level + 1 WHERE id = :id")
$query->bindValue(":id", $id);
$result = $query->execute();
于 2008-08-25T01:19:45.817 に答える
3
$sql = "UPDATE skills SET level = level + 1 WHERE id = $id";

コードの他の場所で適切にサニタイズしていることを願っています$id!

于 2008-08-08T12:36:22.863 に答える
2

これを試して

UPDATE skills SET level = level + 1 WHERE id = $id
于 2008-08-08T12:36:27.107 に答える
1

どうですか:

UPDATE skills SET level = level + 1 WHERE id = $id;
于 2008-08-08T12:37:17.980 に答える
-1

Mat: それは質問から貼り付けたものです。編集されていないので、Markdown のバグによるものだと思います。しかし、不思議なことに、私は気づいた。

また: はい、mysql_escape_string()!

于 2008-08-08T12:47:15.853 に答える