2017-11-29 33 views
-1

ユーザーのxp値が彼のレベルの最大xpより大きいかどうかを確認して、経験値バーが値を適切に更新しようとしています。私はこのコード複数の条件に基づいてフィールドを更新する

$sql1 = "UPDATE progression SET xp=(xp + 2) WHERE username='$username'"; 

によって価値を高めています。そして、私はXPの値が今の最大のXPよりも高い場合は、データベースにチェックしたいと思いますし、それがXPを取るある場合 - 最大XPを。これはプレーヤーが98%xpなどで10%xpを得た場合、次のレベルで8%に更新する必要があります(次のレベルでは最大xpの増加がない場合)。私はこのようなものが欲しいですが、これはうまくいかないようです。

$sql2 = "UPDATE if xp > maxxp SET xp=(xp - maxxp) WHERE username='$username'"; 
+0

これは、 'if'がmysqlでどのように動作するかではありません。しかし、 'WHERE'セクションに別の条件を追加することができます。 – jeroen

+0

あなたが比較したいのであれば、なぜあなたはUPDATEを使用していますか?あなたはSELECTを実行する必要があるので、それはどこですか? –

+4

* "プレイヤーが98%xpなどで10%XPを取得した場合、次のレベルで8%に更新する必要があります" * - これは最初の場所。ほとんどのシステムでは、獲得した経験ポイントの合計数が記録されます。追加の経験は、単にその合計を増分します。レベルやパーセンテージなどの情報を次のレベルに表示するときは、その場で実行される簡単な計算です。計算を保存しないでください。 * data *を保存し、計算をディスプレイに実行します。 – David

答えて

3

あなたのクエリが間違った構文を持っている場合は、余分を必要としないので:

$sql2 = "UPDATE if xp > maxxp SET xp=(xp - maxxp) WHERE username='$username'"; 

$sql2 = "UPDATE progression SET xp=(xp - maxxp) WHERE username='$username' AND xp > maxxp"; 

する必要がありますが、私はあなただけで更新する必要があることをデビッドに同意します経験値の数を計算し、その場でレベル計算を行います。

このクエリでは、更新するテーブルの名前がありません。あなたはまだ進歩を更新していると思います。

さらに、準備されたステートメントを見てみてください。これはSQLインジェクションを防ぎます。

+0

これはうまくいきますが、残念ながらそれは他の問題を作成しました。 – Thea

+0

あなたが100ポイントごとに新しいレベルを取得するとしましょう。あなたはdb 325ポイントに格納し、あなたはレベル3 + 25ポイントであることをphp(または何でも)計算します。この場合、(325/100)= 3.25のモジュラスを使用して、モジュラスは3になり、残りは* 100 = 25ポイントの0.25になります。これは、各レベル(初回100回、2回目の250回後)でしきい値を変更する場合に、より重要です。それはもっと明確ですか? –

+0

もう少し明確です。しかし、これは非常に新しいので、それはまだ明確ではない多くのです。 1位、この計算はどこで行われるべきですか?私はまた、各レベルが* 1.5で必要とされる最大xpを増加させることによって閾値を変化させる。たとえば、最初のレベルは経験値の100%に等しい10ポイントを必要とします。 – Thea

0

SQLは、IF文を使用する他の言語と同様の文をCASEで使用します。だから私はあなたが代わりに〜と何かを探していると信じています。

CASE WHEN (xp > maxxp) THEN SET xp=(xp - maxxp) WHERE username='$username' 

SQL内のCASE文の詳細は、linkを参照してください。しかし、他の人が言及したように、この問題を解決するために、whereステートメントに別の条件を簡単に追加することができます。

AND;これはセキュリティの問題であるため、変数をSQL文に直接渡すべきではありません。代わりに、パラメータをクエリにバインドする必要があります。あなたはこのために2つのクエリを必要としない

2

、あなたは直接modulusを使用して計算することができます。

$sql1 = "UPDATE progression SET xp = (xp + 2) % maxxp WHERE username = :username"; 

はまた、あなたがあなたのクエリで変数を注入ではなく、準備されたステートメントを使用するべきではないことに注意してください。

0

IFを使用する場合は、このようなものを試すことができます。

UPDATE progression 
SET  xp = IF(xp > maxxp, xp - maxxp, xp) 
WHERE username='$username' 

しかし、おそらく、WHEREの方が良い場合があります。

関連する問題