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

时间:2016-09-14 14:32:47

标签: php mysql pdo

我没理解......,我有resource nameamountlevel

的表格WHEN 'ResourceA' THEN amount + $resourceA[1]

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

例如,我的数据库中有ResourceA,数量为100,级别为1.由于级别1(resourceA数组索引),我想将2个点添加到100个。

这是有效的: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]正在运行,然后孔字符串被解释为{{1}}

也许有一个准备好的绑定技巧,我可以在声明中使用level作为数字。

由于

1 个答案:

答案 0 :(得分: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]);
    }
}