2017-06-27 99 views
0

我正在使用PHP和MySQL进行游戏,我需要一个UPDATE查询,其中字段名称可以从一个用户更改为另一个用户。使用动态字段更新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,pwheat和$类型只能是 “麦田”, “石头” 或 “木头”。

我想更新选定的字段(这取决于$类型)增加p2(这里是10)。

+1

*不起作用*手段? – Jens

+1

您不能使用占位符作为列名称。你必须在那里连接字符串 – Jens

回答

2

http://php.net/manual/fr/pdo.prepare.php,尤其是以下评论:

对于那些想知道为什么加引号围绕一个占位符是错误的,你为什么不能使用占位符表或列名:

有一个共同的关于准备好的语句中的占位符是如何工作的误解:它们不会简单地替换为(转义)字符串,并执行结果SQL。相反,DBMS要求“准备”一个语句时,会提供一个完整的查询计划来说明它将如何执行该查询,包括它将使用哪些表和索引,无论您填入占位符的方式如何,它们都是相同的。

无论您替代“:value”,“SELECT name FROM my_table WHERE id = value”的计划都是相同的,但无法计划看起来类似的“SELECT name FROM:table WHERE id =:value” ,因为DBMS不知道你实际要从哪个表中选择。

0

谢谢您的回答,我纠正:

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