Mysqli SELECT? (bind_param)

时间:2014-07-11 01:08:32

标签: php mysqli

我正在尝试查询依赖于变量$ 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);
}

2 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为使用预备语句,您只能构建(而不是标识符)。就是这样

SELECT ? 

变为

SELECT 'somevalue'

第一个代码是正确的代码,但为了安全起见,您必须确保将$garment变量值列入白名单。

答案 1 :(得分:0)

您不能使用标记作为列名。因此,您必须使用标记指定实际的列名称。

来自official php docs

  

标记仅在SQL语句的某些位置是合法的。对于   例如,它们被允许在INSERT语句的VALUES()列表中   (指定行的列值),或与列进行比较   在WHERE子句中指定比较值。

     

但是,不允许使用标识符(例如表格或列)   名称),在选择列表中,用于命名要由a返回的列   SELECT语句),或指定二元运算符的两个操作数   例如=等号。后一种限制是必要的,因为   无法确定参数类型。一般来说,   参数在Data Manipulation Languange(DML)中是合法的   语句,而不是数据定义语言(DDL)语句。