2016-09-14 7 views
1

私はそれを得ることはありません...、私はnameamountlevelMySQLのテーブルのフィールドの値が

だから私は保存したいアレイを作成しresourceを持つテーブルを持っていますレベル別に各リソースに追加されたリソースの量。

は、例えば、私は100の量と、私は100

この量に2点を追加したいので、レベル1(resourceAの配列インデックス)のレベル1と自分のデータベースにResourceAを有します働いている:WHEN 'ResourceA' THEN amount + $resourceA[1]

これが動作していません。WHEN 'ResourceA' THEN amount + $resourceA[level]

$resourceA = array(0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024); 
$resourceB = array(0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024); 
$resourceC = array(0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512); 

try { 
    $conn = new PDO("mysql:host=$servername;port=3307;dbname=$dbname",$username, $password); 

    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $sql = "UPDATE resource SET amount = CASE name 
       WHEN 'ResourceA' THEN amount + $resourceA[level] 
       WHEN 'ResourceB' THEN amount + $resourceB[level] 
       WHEN 'ResourceC' THEN amount + $resourceC[level] 
       END"; 

    $conn->exec($sql); 
    echo "Updated successfully"; 
    } 
catch(PDOException $e) 
{ 
    echo $e->getMessage(); 
} 

$conn = null; 

を誰かがリソース配列のインデックスとして、テーブルのフィールドlevelを使用するために、私を助けることができますか?

更新:あなたの説明のためにこれがなぜ機能しないのか理解しています。ありがとうございました。

は、私は多分準備バインディングとトリックがあり、その後の穴列がWHEN 'ResourceA' THEN amount + $resourceA[1]

のように解釈され、

WHEN 'ResourceA' THEN amount + $resourceA[1] 

が働いているともamount = amount + 2が働いているので、それは私が使用することができ、働くだろうと思いましたステートメント内の数字としてのレベル。

おかげ

+0

これは単なる不可能なことです。あなたは、SQLクエリがPHPではなくSQLサーバによって実行されることを認識していますか? –

+0

レベルフィールドの値をphp変数にフェッチし、php変数をインデックスとして使用するか、リソースデータをMySQL内のテーブルにプッシュし、純粋なSQLを使用してマルチテーブル更新構文を使用して増加を計算する必要があります。 – Shadow

+0

あなたの大丈夫、ありがとう、おそらく準備された拘束力のあるトリックがあります。 – Retterdesdialogs

答えて

1

は文字通りあなたの質問に答えるために:もちろん、それはちょうど不可能です。

SQLはあなたのPHPコードを実行しないためです。結果として得られるSQLコードには、PHPがまったく存在しないことは言うまでもありません。単純に$ sql変数をエコーするだけで、自分でチェックすることができます。
同様に、PHPスクリプトでSQLクエリをアセンブルしているときに、データベースのレベルフィールド値はありません。 PHPとSQLは、向かい側に立つ2つの建物です。あなたはある手紙を別の手紙に送ることができますが、別の手紙にペンを使ってこの手紙をある家に書くことはできません。

幸いにも、あなたの場合、PHP配列はまったく必要ありません。単純な数式を使用してフィールドを更新するだけです。

UPDATE resource SET amount = CASE name 
      WHEN 'ResourceA' THEN amount + pow(2, level) 
      WHEN 'ResourceB' THEN amount + pow(2, level) 
      WHEN 'ResourceC' THEN amount + pow(2, level)/2 
      END 

一般に、名前とレベルの組み合わせごとに別々のクエリを実行するだけで済みます。準備ができていなくても大したことではありませんが、少しきれいにすることができます。

$update = [ 
    'resourceA' = array(0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024), 
    'resourceB' = array(0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024), 
    'resourceC' = array(0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512), 
]; 
$sql = "UPDATE resource SET amount = ? WHERE name = ? AND level = ?"; 
$stmt = $pdo->prepare($sql); 
foreach ($update as $name => $row) 
{ 
    foreach ($row as $level => $value) 
    { 
     $stmt->execute([$value, $name, $level]); 
    } 
} 
+0

あなたは正しいと答えを受け入れますが、私は他の数字を使用したいときは何ですか? 1,3,4,5,7のように。私は最初に試したことをするための変数としてレベルを得ることができますか?それ以降は+ $ resourceA [1]が動作しているので、準備済みのバインディングやidk(select level)lvlまたは何か(@level:= level)lvlを使用している可能性があります – Retterdesdialogs

+1

私は自分の答えを更新しました –

関連する問題