質問
次の 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 つのクエリとして実行できれば、はるかに簡単かつ高速になるようです。
編集: $id
はすでに整数であることが強制されているため、今回はエスケープする必要はありません。
解決
これのためにダウンモッドを受けてしまいますか?
$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 を削除します。
他のヒント
こちらです:
UPDATE skills
SET level = level + 1
WHERE id = $id
PDO と準備されたクエリを使用すると、次のようになります。
$query = $db->prepare("UPDATE skills SET level = level + 1 WHERE id = :id")
$query->bindValue(":id", $id);
$result = $query->execute();
$sql = "スキルを更新 SET レベル = レベル + 1 WHERE id = $id";
コード内の他の場所で $id が適切にサニタイズされていることを願っています。
これを試して
UPDATE skills SET level = level + 1 WHERE id = $id
どうでしょうか:
UPDATE skills SET level = level + 1 WHERE id = $id;
マット:それが質問から貼り付けられたものです。これは編集されていないため、Markdown のバグのせいだと考えています。しかし、不思議なことに、私は気づいてしまったのです。
また:はい、 mysql_escape_string()
!