2011-11-03 103 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位數字。