使用动态字段更新MySQL

时间:2017-06-27 19:37:49

标签: php mysql pdo

我正在使用PHP与MySQL进行游戏,我需要一个UPDATE查询,其中字段名称可以从一个用户更改为另一个用户。

我的代码是:

$upd = $sql->prepare("UPDATE empire_users SET :p = :p + :p2 WHERE id = :id");
$upd->execute(array(
    ':p' => "p".$type,
    ':p2' => 10,
    ':id' => $_SESSION["id"]
));

在我的数据库中,用户有3列:pwood,pstone,pwheat,$ type只能是“wheat”,“stone”或“wood”。

我想更新所选字段(取决于$ type)以增加p2(此处为10)。

2 个答案:

答案 0 :(得分:2)

请参阅http://php.net/manual/fr/pdo.prepare.php,特别是以下评论:

有些人想知道为什么在占位符周围添加引号是错误的,以及为什么你不能使用占位符来表或列名:

关于预处理语句中的占位符如何工作存在一个常见的误解:它们不是简单地替换为(转义的)字符串,而是执行生成的SQL。相反,DBMS要求"准备"一个语句提供了一个完整的查询计划,用于说明它将如何执行该查询,包括它将使用哪些表和索引,无论你如何填写占位符,它都是相同的。

" SELECT name FROM my_table WHERE id =:value"无论你用什么代替":value",但看似相似的" SELECT名称FROM:表WHERE id =:value"无法规划,因为DBMS不知道您实际要从哪个表中进行选择。

答案 1 :(得分:0)

感谢您的回答,我更正了:

$upd = $sql->prepare("UPDATE empire_users SET p".$type." = p".$type." + :p2 WHERE id = :id");
$upd->execute(array(
    ':p2' => 10,
    ':id' => $_SESSION["id"]
));