[英]Mysql Table field value as index in php array for update statement
我不明白...,我有一個包含name
、 amount
和level
的表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.