MariaDB 查询错误

MariaDB error with query

我在执行查询时遇到以下错误。

Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''0', '25'' at line 1

这里是查询

   $sqlData = 'SELECT * FROM users WHERE u_id_id = :UID_ID ORDER BY :ORDER_BY :ORDER_TYPE limit :START, :DATA_LENGTH';

        $params = array(
            ":UID" => $uId,
            ":ORDER_BY" => $orderBy,
            ":ORDER_TYPE" => $orderType,
            ":START" => $start,
            ":DATA_LENGTH" => $length
        );
      $queryData = \registry::getDBHandler()->prepare($sqlData);


  $queryData->execute($params);
var_dump($queryData->execute($params));

注意

这里是 paramas 的 var dum 输出

array (size=5)
  ':UID' => string '66' (length=2)
  ':ORDER_BY' => string 'id' (length=2)
  ':ORDER_TYPE' => string 'asc' (length=3)
  ':START' => string '0' (length=1)
  ':DATA_LENGTH' => string '25' (length=2)

准备好的语句让您可以将变量绑定到 SQL 查询的 WHERE(我认为是 SELECT)子句。不幸的是,它们不允许您绑定到 ORDER BYLIMIT(或 FROM)子句。为此,您需要手动附加到字符串。

由于这些值不是由用户输入的,如果您只是这样做,您应该不会受到 SQL 注入:

$sqlData = "SELECT * FROM users WHERE u_id_id = :UID_ID ORDER BY $orderBy $orderType LIMIT $start, $length";

(注意字符串两边的双引号)

然后您的 $params 数组将是:

$params = array(":UID" => $uId);

如果您担心 SQL 注入,那么您可以使用以下方法来解决这个问题:

  • 对于您的 ORDER BY,您可以确保您的 $orderBy 硬编码 字段列表中,如果不是则拒绝它.
  • 对于 $orderType,只需确保它等于 "asc""desc"(可能忽略大小写)。
  • 对于 $start$length,确保它们是 整数 。如果需要,您也可以尝试使用 intval() 来转换它们。

如果您遵循这些规则,那么将这些变量附加到您的 SQL 查询中应该是安全的。由于 $uIdWHERE 的一部分,您可以为它使用准备好的变量,这很好。