簡體   English   中英

Mysql表字段值作為更新語句的php數組中的索引

[英]Mysql Table field value as index in php array for update statement

我不明白...,我有一個包含nameamountlevel的表resource

所以我創建了一個數組,我想在其中存儲按級別添加到每個資源的資源量。

例如,我的數據庫中有 ResourceA,數量為 100,級別為 1。由於級別 1(resourceA 數組索引),我想在 100 的數量上添加 2 個點。

這是有效的: 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]

正在工作並且amount = amount + 2正在工作,然后孔字符串被解釋為WHEN 'ResourceA' THEN amount + $resourceA[1]

也許准備綁定有一個技巧,我可以在語句中使用級別作為數字。

謝謝

從字面上回答你的問題:當然,那是不可能的

因為 SQL 不會運行您的 PHP 代碼。 更不用說在生成的 SQL 代碼中根本沒有 PHP - 您可以通過簡單地回顯 $sql 變量來自己檢查它。
同樣,當您在 PHP 腳本中組裝 SQL 查詢時,數據庫中沒有級別字段值。 PHP 和 SQL 是兩座相對而立的建築物。 你可以把一封信從一個人寄給另一個人,但你不能在一所房子里用筆在另一所房子里寫這封信。

幸運的是,對於您的情況,您根本不需要 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]);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM