可以在更新SQL字段命令中插入变量吗?

时间:2018-04-25 19:07:13

标签: php mysqli

如果我想使用变量在group_a_1_pick sql字段中插入另一个字母作为group_b_1_pick。

$update = $mysqli->query("UPDATE players SET group_a_1_pick='$pick1' WHERE food='$player'");

$ groupletter = b

$update = $mysqli->query("UPDATE players SET group_$groupletter_1_pick='$pick1' WHERE food='$player'");

这可能吗?

3 个答案:

答案 0 :(得分:2)

对于数据值,您当然应该使用预备语句和查询参数。例如,您的$pick1$player值属于此类别。要了解准备好的陈述,this is a great place to start

然而,这并不是你真正想要的。您正在询问是否为架构对象(列名,表名等)使用变量而不是数据值。那些不能由查询参数处理。

好消息是,你可以使用变量来完成你正在尝试做的事情。例如:

$query = "UPDATE Table1 SET Col_{$someVar}_X = ?";

这只是将值插入到字符串中,就像PHP中的任何其他字符串一样。  但是,考虑到对 SQL注入的担忧,真正的问题就变成了:

  

$someVar来自哪里?

它绝不应该来自用户输入。幸运的是,虽然数据值可以是任何阳光下的任何东西,但架构对象是有限的并且是提前知道的。因此,您可以采用简单的白名单方法。处理逻辑时,您可以列出$someVar的所有可能有效值。 (硬编码或从数据库模式生成。)

然后,您可以将任何输入值与该列表中的值进行比较。如果没有匹配,则返回错误。如果 匹配,请使用列表中的匹配值。这样你就只能使用已知的安全值,这与使用文字字符串没什么不同。

毕竟,虽然这可能会乍一看引发一些SQL注入警报:

$query = "UPDATE Table1 SET Col_{$someVar}_X = ?";

如果您知道值的来源,那些警报的上下文会有所不同:

$someVar = "123";
$query = "UPDATE Table1 SET Col_{$someVar}_X = ?";

SQL注入并不总是将预准备语句用作魔术棒。它总是控制应用程序执行的SQL代码,无论代码来自何处。只要你控制代码并且用户没有,你就可以了。

答案 1 :(得分:1)

它不起作用,因为$groupletter_1_pick是一个有效的变量名。对于双引号字符串中的变量,PHP将在$之后标识最长的有效变量名称。它不会因为该变量的存在而在$groupletter停止。

您可以将变量括起来在字符串中指定它。

... SET group_{$groupletter}_1_pick ...

但我真的建议重新考虑你的桌面设计。像这样的列名表示可能应该归一化到相关表中的数据。

答案 2 :(得分:1)

这就是你需要的。只需用大括号包裹你的变量即{$variable}。请参阅复杂的卷曲语法http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing.complex

$groupletter = 'b';
$pick1 = 'some_value_goes_here';
$player = 'some_other_value_goes_here';
$string = "UPDATE players SET group_{$groupletter}_1_pick='$pick1' WHERE food='$player'";
$mysqli->query($string);