MariaDB错误与查询
问题描述:
执行查询时出现跟随错误。MariaDB错误与查询
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达姆输出
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)
答
预处理语句让你绑定变量的WHERE
(和我认为SELECT
)SQL查询的子句。不幸的是,他们不让你绑定到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"
(可能忽略大小写)。 - With
$start
and$length
,确保它们是整数。如果需要,您也可以尝试使用intval()
进行转换。
如果你遵循这些规则,那么它应该是安全的,这些变量追加到您的SQL查询。由于$uId
是WHERE
的一部分,因此您可以使用它准备的变量,这很好。
我不认为你可以使用ORDER BY或LIMIT准备变量。 –
@RocketHazmat:有没有其他的方式来做到这一点?请咨询 –
你的'$ params'从哪里来?特别是'$ orderBy','$ orderType','$ start'和'$ length'。你将不得不手动追加这些值到查询中,所以你也必须正确地将它们转义。或者说,做这样的事情:http://*.com/a/2543144如果你有一组硬编码的值,你可以使用它,只有当它在列表中使用它(或LIMIT只是确保他们是数字)。 –