我不明白…,我有一个表resource
与name
, amount
和level
所以我创建了一个数组,我想在其中存储按级别添加到每个资源的资源数量。
例如,我的数据库中有资源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]);
}
}