我正在用MySQL制作一个游戏,我需要一个更新查询,在这个查询中,字段名可以从一个用户更改到另一个用户。
我的代码是:
$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、p小麦和$type,它们只能是“小麦”、“石头”或“木头”。
我想更新所选字段(这取决于$type),以增加p2 (这里是10)。
发布于 2017-06-27 19:51:53
请参见http://php.net/manual/fr/pdo.prepare.php,特别是下面的评论:
“对于那些想知道为什么在占位符周围添加引号是错误的,以及为什么不能将占位符用于表或列名:
对于准备好的语句中的占位符是如何工作的,有一种常见的误解:它们不是简单地在as (转义)字符串中被替换,并且得到的SQL被执行。相反,被要求“准备”语句的DBMS提出了一个完整的查询计划,说明它将如何执行该查询,包括它将使用哪些表和索引,不管您如何填写占位符,它们都是相同的。
"SELECT name FROM my_table,id = :value“的计划将与替代":value”的计划相同,但似乎类似的"SELECT name :table = :value“无法计划,因为DBMS不知道您实际上要从哪个表中选择。
发布于 2017-06-28 13:35:24
谢谢你的回答,我改正了:
$upd = $sql->prepare("UPDATE empire_users SET p".$type." = p".$type." + :p2 WHERE id = :id");
$upd->execute(array(
':p2' => 10,
':id' => $_SESSION["id"]
));https://stackoverflow.com/questions/44788504
复制相似问题