2011-11-03 101 views
0

我有这个疑问:排序按日期返回不正确的值

$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; 

有什么建议?

+5

SQL注入警报! – hsz

+0

Eww,'$ _COOKIE'值直接转储到查询中。 - 你能否发表一些在表格中的示例数据? –

+0

只是为了确保。 1.是“日期”一个真正的日期字段,或者只是与时间戳int? 2.在你的ORDER BY – sascha

回答

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位数字。