【问题标题】:Mysqli SELECT ? (bind_param)mysqli 选择? (绑定参数)
【发布时间】:2014-07-11 01:08:32
【问题描述】:

我正在尝试根据变量 $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);
}

【问题讨论】:

    标签: php mysqli


    【解决方案1】:

    这是因为使用准备好的语句,您只能构建 (而不是标识符)。就是这样

    SELECT ? 
    

    变成

    SELECT 'somevalue'
    

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

    【讨论】:

      【解决方案2】:

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

      来自official php docs

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-01
        • 2010-12-03
        • 2012-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-27
        • 2016-08-31
        相关资源
        最近更新 更多