我没理解......,我有resource
name
,amount
和level
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作为数字。
由于
答案 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]);
}
}