Php 能否在update SQL field命令中插入带有的变量?

Php 能否在update SQL field命令中插入带有的变量?,php,mysqli,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='$p

如果我想在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'");

这可能吗?

它不起作用,因为
$groupletter\u 1\u pick
是一个有效的变量名。对于双引号字符串中的变量,PHP将在
$
后面标识可能最长的有效变量名。它不会仅仅因为变量存在就停在
$groupletter

可以将变量括在括号中,以便在字符串中指定它

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

不过,我还是建议你重新考虑一下桌子的设计。这样的列名表示可能应该规范化到相关表中的数据。

它不起作用,因为
$groupletter\u 1\u pick
是一个有效的变量名。对于双引号字符串中的变量,PHP将在
$
后面标识可能最长的有效变量名。它不会仅仅因为变量存在就停在
$groupletter

可以将变量括在括号中,以便在字符串中指定它

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

不过,我还是建议你重新考虑一下桌子的设计。这样的列名表示可能应该规范化为相关表的数据。

这就是您需要的。只需用大括号将变量括起来,即
{$variable}
。请参见关于复杂卷曲语法


这就是你需要的。只需用大括号将变量括起来,即
{$variable}
。请参见关于复杂卷曲语法

对于数据值,您当然应该使用准备好的语句和查询参数。例如,您的
$pick1
$player
值属于此类别。要了解准备好的语句

然而,这并不是你真正想要的。您询问的是如何将变量用于模式对象(列名、表名等),而不是数据值。这些不能由查询参数处理

好消息是,您可以使用一个变量来完成您想要做的事情。例如:

$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代码,无论这些代码来自何处。只要您控制代码而用户不控制,您就没事。

对于数据值,您当然应该使用准备好的语句和查询参数。例如,您的
$pick1
$player
值属于此类别。要了解准备好的语句

然而,这并不是你真正想要的。您询问的是如何将变量用于模式对象(列名、表名等),而不是数据值。这些不能由查询参数处理

好消息是,您可以使用一个变量来完成您想要做的事情。例如:

$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代码,无论这些代码来自何处。只要你控制代码而用户不控制,你就没事。

我不确定你想做什么,但无论如何。。。不要将数据连接到查询,而是使用准备好的语句。是的,这是可能的。如果要检查,可以将整个查询字符串分配给变量,并检查这是否是您想要的,然后可以将其传递到查询中。类似下面的$sql=“UPDATE players SET group”{$groupletter}u 1_pick='$pick1'WHERE food='$player')确定可以完成,但您确定要这样做吗?您将自己留在这里接受sql注入。另外,该列需要存在。如果有人为其输入的值与列集不匹配,则会出现错误。@funkfortynine