我正在尝试查询依赖于变量$ garment的列中的数据。查询有效,直到我尝试绑定参数$ garment。知道我做错了吗?
谢谢!
//THIS WORKS
if ($stmt = mysqli_prepare($mysqli, "SELECT $garment FROM user WHERE uid=?")) {
mysqli_stmt_bind_param($stmt, "i", $uid);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $total);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
}
//DOESN'T WORK - $total returns the value of $garment
if ($stmt = mysqli_prepare($mysqli, "SELECT ? FROM user WHERE uid=?")) {
mysqli_stmt_bind_param($stmt, "si", $garment, $uid);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $total);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
}
答案 0 :(得分:0)
之所以发生这种情况,是因为使用预备语句,您只能构建值(而不是标识符)。就是这样
SELECT ?
变为
SELECT 'somevalue'
第一个代码是正确的代码,但为了安全起见,您必须确保将$garment
变量值列入白名单。
答案 1 :(得分:0)
您不能使用标记作为列名。因此,您必须使用标记指定实际的列名称。
标记仅在SQL语句的某些位置是合法的。对于 例如,它们被允许在INSERT语句的VALUES()列表中 (指定行的列值),或与列进行比较 在WHERE子句中指定比较值。
但是,不允许使用标识符(例如表格或列) 名称),在选择列表中,用于命名要由a返回的列 SELECT语句),或指定二元运算符的两个操作数 例如=等号。后一种限制是必要的,因为 无法确定参数类型。一般来说, 参数在Data Manipulation Languange(DML)中是合法的 语句,而不是数据定义语言(DDL)语句。