0

我正在尝试在 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 ,因为这不起作用。我确实把它按这个顺序排列是有原因的,因为现在它首先按用户名分组,但不再使用最后一次登录。

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

提前感谢您的所有帮助!

4

4 回答 4

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}");

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

编辑:根据手册扩展第四点:

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

所以ORDER BY来了GROUP BY

于 2013-06-16T01:27:10.103 回答
1

为什么它不起作用,因为您的查询就像

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

好读

为什么我不应该在 PHP 中使用 mysql_* 函数?

警告

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

于 2013-06-16T01:28:57.713 回答
0

按照 arma 的建议添加空格,并考虑在块$limit = '';之前设置if ($filter)(不是绝对必要,但很好的做法)。

如果这只是伪代码,您可以忽略其余部分,但您确实应该考虑在盲目地将 $filter 变量插入数据库查询之前对其进行消毒,因为mysql_query它不处理转义等。在这个特定的例子中,`$filter = (int)$_GET['fltr']; 应该可以正常工作。考虑检查PHP MySQL PDO 对象

于 2013-06-16T01:26:51.957 回答
0

首先转义 $filter ,然后在 limit 和 $filter 之间放置一个空格。像 "LIMIT".$filter

于 2013-06-16T01:26:58.313 回答