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