带有变量的Mysqli准备好的语句列[重复]

Posted

技术标签:

【中文标题】带有变量的Mysqli准备好的语句列[重复]【英文标题】:Mysqli prepared statement column with variable [duplicate] 【发布时间】:2017-01-11 18:26:18 【问题描述】:

我的代码必须使用自定义变量作为列来更新查询。

如何安全地绑定列名?

$username = 'MyUsername'; 
$rank = 'Administrator';
$server = 'Node5';

$stmt = $connection->prepare("UPDATE staff_members SET ?=? WHERE Username=? LIMIT 1");
$stmt->bind_param("sss", $server, $rank, $username);
$stmt->execute();

【问题讨论】:

【参考方案1】:

不可能为列名或表名使用参数。相反,它们必须在使用前明确过滤掉,使用white list 方法。

// define a "white list"
$allowed = ['Node5', 'Node4'];

// Check the input variable against it 
if (!in_array($server, $allowed)) 
    throw new Exception("Invalid column name");


// now $server could be used in the SQL string
$sqlString = "UPDATE staff_members SET $server=? WHERE Username=?";
$stmt = $connection->prepare($sqlString);
$stmt->bind_param("ss", $rank, $username);
$stmt->execute();

【讨论】:

以上是关于带有变量的Mysqli准备好的语句列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 mysqli 和准备好的语句时命令不同步 [重复]

php mysqi bind_param 变量数与准备好的语句中的参数数不匹配[重复]

MySQLi:使用一个准备好的语句插入多行

如果在循环中使用 MySQLi 准备好的语句,我啥时候调用 bind_param?

mysqli_stmt::bind_result():绑定变量的数量与准备好的语句中的字段数量不匹配

mysqli_stmt::bind_param():变量的数量与准备好的语句中的参数数量不匹配