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 BY
或 LIMIT
(或 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 查询中应该是安全的。由于 $uId
是 WHERE
的一部分,您可以为它使用准备好的变量,这很好。
我在执行查询时遇到以下错误。
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 BY
或 LIMIT
(或 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 查询中应该是安全的。由于 $uId
是 WHERE
的一部分,您可以为它使用准备好的变量,这很好。