按日期排序返回不正确的值

时间:2011-11-03 15:01:46

标签: php mysql

我有这个问题:

$sql = "SELECT   likes, date
        FROM     statistics_pages
        WHERE    idnum = '".$_COOKIE['id']."'
          AND    page_name = '".$row_fpages['page_name']."'
        ORDER BY date DESC
        LIMIT 7";

它返回完全不正确的数字(likes)就像给予任何值+ 500k额外而且我不知道为什么会发生这种情况,因为当我删除ORDER BY时,这些值是准确的(但不是有序的)正确地)。

使用表格结构编辑:

  `id` int(5) NOT NULL AUTO_INCREMENT,
  `idnum` int(5) NOT NULL,
  `page_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `page_id` varchar(12) COLLATE utf8_unicode_ci NOT NULL,
  `likes` int(12) NOT NULL,
  `date` date NOT NULL DEFAULT '0000-00-00',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=243 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

<强> SQL注入

正如所解释的那样,您的查询存在SQL注入问题。

将代码重写为:

$idnum = mysql_real_escape_string($_COOKIE['id']);
$pagename = mysql_real_escape_string($row_fpages['page_name']);
$sql = "SELECT   likes, date
        FROM     statistics_pages
        WHERE    idnum = '$idnum'
          AND    page_name = '$pagename'
        ORDER BY date DESC
        LIMIT 7";

对于整数,你也可以使用intval(),但我更喜欢一个函数用于我的所有转义。

除此之外,查询没有任何问题。单词date 是一个mysql保留字,不需要反引号。
请在此处查看保留字列表:http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

为什么您的查询无效
问题很可能是表中的虚假数据,删除limit 7并研究输出 查询本身是100%正确的。

评论表

  `id` int(5) NOT NULL AUTO_INCREMENT,   
  `idnum` int(5) NOT NULL,
  `page_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `page_id` varchar(12) COLLATE utf8_unicode_ci NOT NULL,
  `likes` int(12) NOT NULL,
  `date` date NOT NULL DEFAULT '0000-00-00',   <<-- not recommended use `null` 
                                               <<-- for `no date` 
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)  <<-- PK's are always unique, you can drop this.
) ENGINE=MyISAM AUTO_INCREMENT=243 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

int(5)int(12)实际上是相同的32位整数。只是int(5)只显示5位数。