我试图在依赖于变量$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);
}
发布于 2014-07-10 17:11:37
这是因为使用准备好的语句,您只能构建值(而不是标识符)。就这样
SELECT ?
变成了
SELECT 'somevalue'
第一段代码是正确的,但是为了安全起见,您必须确保$garment
变量值是白色的。
发布于 2014-07-10 17:12:46
不能为列名使用标记。因此,您必须指定实际的列名w/o标记。
来自正式php文档
这些标记仅在SQL语句中的某些位置是合法的。例如,在INSERT语句的VALUES()列表中(为一行指定列值)或与WHERE子句中的列进行比较时允许使用它们来指定比较值。 但是,在select语句要返回的列的SELECT列表中,它们不允许用于标识符(例如表或列名),也不允许指定二进制运算符的两个操作数,例如=相等号。后一种限制是必要的,因为不可能确定参数类型。通常,参数仅在数据操作语言(DML)语句中是合法的,而在数据定义语言(DDL)语句中是不合法的。
https://stackoverflow.com/questions/24688712
复制相似问题