我有这样的查询:
$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;
有什么建议吗?
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位数字。