mysql查询,分组和排序中的变量

Man*_*uHH 0 html php mysql

我试图在MySQL查询中获取变量.

$filter = $_GET['fltr'];
require_once('core/dbconnect.php');
if($filter)
{
    $limit = 'LIMIT '. $filter;
}
$lastonline = mysql_query("SELECT * FROM logins ORDER BY time DESC GROUP BY username '$limit'");
Run Code Online (Sandbox Code Playgroud)

现在问题出在我在查询中加上'$ limit'的地方.这不起作用,但这样做的正确方法是什么?

它几乎可以正常工作,因为我得到的结果不是绝对正确的结果.我将代码更改为:

$filter = $_GET['fltr'];
require_once('core/dbconnect.php');
if($filter)
{
$limit = 'LIMIT '. (int) $filter;
}
$lastonline = mysql_query("SELECT * FROM logins GROUP BY username ORDER BY time DESC {$limit}");
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我不得不改变GROUP BY和ORDER BY,因为它不起作用.我确实把它按顺序放入原因,因为现在它首先按用户名分组,但不再进行最后一次登录.

知道此查询中最后一个问题的解决方案的任何人?

感谢您的所有帮助!

jer*_*oen 5

一些东西:

  1. 你需要LIMIT和数字之间的空格;
  2. 您需要修复您的SQL注入问题,例如通过将用户发送的变量强制转换为int;
  3. 你需要在LIMIT语句周围删除sql语句中的引号;
  4. 您需要在订单之前进行分组,因此您需要切换这两个.

结果将是:

if($filter)
{
    $limit = 'LIMIT '. (int) $filter;
}
$lastonline = mysql_query("SELECT * FROM logins GROUP BY username ORDER BY time DESC {$limit}");
Run Code Online (Sandbox Code Playgroud)

并且您应该切换到PDO或mysqli并准备好语句,因为mysql_*函数已被弃用.

编辑:根据手册,扩展第4点:

通常,使用的子句必须完全按照语法描述中显示的顺序给出.例如,HAVING子句必须位于任何GROUP BY子句之后和任何ORDER BY子句之前.

所以ORDER BY来了GROUP BY.