Mysqli 准备语句 + 绑定 Order BY

gpr*_*ime 5 php mysqli prepared-statement

我在使用 mysqli_stmt 准备函数时遇到一个小问题。这是我的查询:

$params = array(
    "sisi",
    "some_string",
    5000,
    "date_added DESC"
);

$sql = "SELECT *
        FROM scenes
        WHERE scene_title LIKE ?
        AND scene_id > ?
        ORDER BY ?
        LIMIT ?";
Run Code Online (Sandbox Code Playgroud)

现在,当我像这样将参数绑定到数组时(我实例化了一个有效的 mysqli_stmt 对象):

call_user_func_array(array($this->mysql_stmt, 'bind_param'), $params);
Run Code Online (Sandbox Code Playgroud)

订单依据不受约束。我在 php.net 上阅读(https://www.php.net/manual/en/mysqli.prepare.php

这些标记仅在 SQL 语句中的某些位置是合法的。例如,它们可以出现在 INSERT 语句的 VALUES() 列表中(以指定行的列值),或者可以出现在与 WHERE 子句中的列的比较中以指定比较值。

但是,它们不允许用于标识符(例如表名或列名)、命名要由 SELECT 语句返回的列的选择列表中,也不允许指定二元运算符的两个操作数(例如 = 等号)。

有没有办法解决这个问题,或者我是否必须使用 mysql_real_escape_char() 作为 ORDER BY 子句?

tkr*_*car 1

正如您找到的 php.net 链接所述,您不能使用绑定变量作为标识符。你需要一个解决方法。mysql_real_escape_char肯定是一种方式。

  • @YourCommonSense ...为什么? (2认同)