我正在尝试在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'");


现在问题出在我在查询中放入“ $ 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}");


如您所见,我不得不更改GROUP BY和ORDER BY,因为那是行不通的。
我之所以按此顺序进行排序是有原因的,因为现在它首先按用户名分组,但不再取出最后一个登录名。

是否有人知道此查询中最后一个问题的解决方案?

感谢您提前提供的所有帮助!

最佳答案

一些东西:


您需要在LIMIT和数字之间留一个空格;
您需要解决您的sql注入问题,例如,将用户发送的变量强制转换为int
您需要删除LIMIT语句中sql语句中的引号;
您需要先分组才能下订单,因此您需要切换这两个。


因此结果将是:

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


并且您应该切换到PDO或mysqli并使用已准备好的语句,因为不建议使用mysql_*函数。

编辑:根据manual在第4点展开:


  通常,所使用的子句必须严格按照
  语法说明。例如,必须在HAVING子句之后
  任何GROUP BY子句以及任何ORDER BY子句之前。


所以ORDER BYGROUP BY之后。

关于php - mysql查询,分组和排序中的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17129368/

10-12 00:05
查看更多