Mysql表字段值在php数组中作为更新语句的索引


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

我不明白…,我有一个表resourcename, amountlevel

所以我创建了一个数组,我想在其中存储按级别添加到每个资源的资源数量。

例如,我的数据库中有资源cea,数量为100,级别为1。因为级别1(资源数组索引),我想在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]

可能在预绑定中有一个技巧,我可以在语句中使用level作为一个数字。

谢谢

从字面上回答你的问题:当然,那只是不可能

因为SQL不会运行你的PHP代码。更不用说在生成的SQL代码中根本没有PHP—您可以通过简单地回显$ SQL变量来自己检查。
同样,当您在PHP脚本中组装SQL查询时,也没有来自数据库的level字段值。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]);
    }
}