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

Php mysql查询、分组和排序中的变量,php,html,mysql,Php,Html,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'"); 现在的问题是我在查询中添加了“$limit”。这

我试图在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}");
正如你所看到的,我不得不改变分组和顺序,因为这不起作用。 我把它放在那个顺序是有原因的,因为现在它先按用户名分组,但不再带出最后一次登录

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


提前感谢您的帮助

< P>根据ARMA建议添加空间,并考虑设置<代码> $Lime=′;<代码>在
if($filter)
块之前(并非严格必要,但为良好实践)


如果这只是伪代码,您可以忽略其余部分,但是在盲目地将其插入到DB查询之前,您确实应该考虑对$过滤器变量进行消毒,因为<代码> MySqLyQueQue>代码>无法处理逃逸等。在这个特定实例中,`$filter=(int)$\u GET['fltr'];应该很好用。考虑检查同样的情况。

< P>将空间添加为ARMA建议,并考虑设置<代码> $Lime=“”;<代码>在
if($filter)
块之前(并非严格必要,但为良好实践)


如果这只是伪代码,您可以忽略其余部分,但是在盲目地将其插入到DB查询之前,您确实应该考虑对$过滤器变量进行消毒,因为<代码> MySqLyQueQue>代码>无法处理逃逸等。在这个特定实例中,`$filter=(int)$\u GET['fltr'];应该很好用。考虑检查同样的情况。

< P>第一个逃逸$过滤器,然后在限制和$过滤器之间放置一个空格。像“LIMIT”。$filter

首先转义$filter,然后在LIMIT和$filter之间留出一个空格。比如“限制”。$filter

一些东西:

  • 在限制和数字之间需要一个空格
  • 您需要修复sql注入问题,例如,将用户发送的变量强制转换为
    int
  • 您需要去掉sql语句中围绕LIMIT语句的引号
  • 您需要在下单前进行分组,因此需要切换这两个选项
  • 因此,结果将是:

    if($filter)
    {
        $limit = 'LIMIT '. (int) $filter;
    }
    $lastonline = mysql_query("SELECT * FROM logins GROUP BY username ORDER BY time DESC {$limit}");
    
    您应该切换到PDO或mysqli并准备好语句,因为
    mysql.*
    函数已被弃用

    编辑:根据以下内容在第4点展开:

    一般来说,使用的子句必须按照中所示的顺序给出 语法描述。例如,HAVING子句必须在后面 任何GROUP BY子句和任何ORDER BY子句之前

    因此,
    orderby
    紧跟在
    groupby

    之后的是几件事:

  • 在限制和数字之间需要一个空格
  • 您需要修复sql注入问题,例如,将用户发送的变量强制转换为
    int
  • 您需要去掉sql语句中围绕LIMIT语句的引号
  • 您需要在下单前进行分组,因此需要切换这两个选项
  • 因此,结果将是:

    if($filter)
    {
        $limit = 'LIMIT '. (int) $filter;
    }
    $lastonline = mysql_query("SELECT * FROM logins GROUP BY username ORDER BY time DESC {$limit}");
    
    您应该切换到PDO或mysqli并准备好语句,因为
    mysql.*
    函数已被弃用

    编辑:根据以下内容在第4点展开:

    一般来说,使用的子句必须按照中所示的顺序给出 语法描述。例如,HAVING子句必须在后面 任何GROUP BY子句和任何ORDER BY子句之前


    因此,
    orderby
    位于
    groupby

    之后,为什么它不起作用,因为您的查询如下

    SELECT * FROM logins ORDER BY time DESC GROUP BY username 'LIMIT4'
    
    虽然它一定像

    SELECT * FROM logins ORDER BY time DESC GROUP BY username LIMIT 4
    
    你为什么会这样? 你得到这个是因为下面的线

    $limit = 'LIMIT'. $filter;
    
    所以,试着去做吧

    require_once('core/dbconnect.php');
    if(isset($_GET['fltr']))
    {
      $lastonline = mysql_query("SELECT * FROM logins ORDER BY time DESC GROUP BY username LIMIT " . mysql_real_escape_string($limit));
    }
    
    更多的mysql_*函数不推荐使用PDO或Mysqli,imo使用PDO

    读得好

    警告


    您的代码容易受到sql注入的攻击您需要正确地转义/清理所有请求

    为什么它不工作,因为您的查询

    SELECT * FROM logins ORDER BY time DESC GROUP BY username 'LIMIT4'
    
    虽然它一定像

    SELECT * FROM logins ORDER BY time DESC GROUP BY username LIMIT 4
    
    你为什么会这样? 你得到这个是因为下面的线

    $limit = 'LIMIT'. $filter;
    
    所以,试着去做吧

    require_once('core/dbconnect.php');
    if(isset($_GET['fltr']))
    {
      $lastonline = mysql_query("SELECT * FROM logins ORDER BY time DESC GROUP BY username LIMIT " . mysql_real_escape_string($limit));
    }
    
    更多的mysql_*函数不推荐使用PDO或Mysqli,imo使用PDO

    读得好

    警告


    您的代码容易受到sql注入的攻击您需要正确地转义/清理所有请求

    您需要在keyoword
    LIMIT
    $filter
    之间留出空间警告:sql注入仍然存在于世界上,我的意思是您的代码容易受到sql注入的攻击您需要正确地转义所有请求或更好地使用pdo(准备好的语句)…看到这个了吗?你试图调试你的代码并试图找到原因?你需要在keyoword
    LIMIT
    $filter
    之间留出空间警告:sql注入仍然存在于世界中,我的意思是你的代码容易受到sql注入的攻击。你需要正确地逃避所有请求,或者更好地使用pdo(准备好的语句)…看到这里了吗?您试图调试代码并试图找到原因是什么?+1,用于使用示例代码解决问题,并建议切换到更好、更受支持的SQL接口。Works(有点)好的,谢谢你提醒我MySQL注入。只有一个问题。我在GroupBy之前订购是有原因的。它必须删除最后一次登录,然后按用户名分组,就像现在按用户名分组一样,但不再使用最后一次登录。@manouh你可以尝试类似于
    SELECT*,MAX(time)的方法来自…
    +1,用于通过示例代码解决问题,并建议切换到更好、更受支持的SQL接口。现在工作(有点)正常,感谢您就MySQL注入向我发出警告。只有一个问题..我在GROUP BY之前订购是有原因的。