2016-12-29 60 views
0

执行查询时出现跟随错误。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) 
+1

我不认为你可以使用ORDER BY或LIMIT准备变量。 –

+0

@RocketHazmat:有没有其他的方式来做到这一点?请咨询 –

+0

你的'$ params'从哪里来?特别是'$ orderBy','$ orderType','$ start'和'$ length'。你将不得不手动追加这些值到查询中,所以你也必须正确地将它们转义。或者说,做这样的事情:http://stackoverflow.com/a/2543144如果你有一组硬编码的值,你可以使用它,只有当它在列表中使用它(或LIMIT只是确保他们是数字)。 –

回答

1

预处理语句让你绑定变量的WHERE(和我认为SELECT)SQL查询的子句。不幸的是,他们不让你绑定到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"(可能忽略大小写)。
  • With $start and $length,确保它们是整数。如果需要,您也可以尝试使用intval()进行转换。

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