我有一个小的PHP应用程序,它应该允许用户在XHTML Web表单中输入4位数年份,并返回保存在MySQL数据库中的所有信息,其年份低于提供的年份。年份存储在yearPublished
列下的数据库中。我有查询工作,我没有错误,但没有返回数据。
以下是用于创建数据库的SQL文件:
CREATE TABLE IF NOT EXISTS `books` (
`ISBN` char(13) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`title` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`author_firstName` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`author_lastName` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`genre` varchar(35) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`publisher` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`yearPublished` varchar(4) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`price` float DEFAULT '0.0',
PRIMARY KEY (`ISBN`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
以下是执行查询的PHP代码:
if(isset($_POST['submitForm'])) {
$strBookPubYear = $_POST['pubYear'];
if(empty($strBookPubYear)) {
print("<p class='error'>You must enter a 4 digit publication date!</p>\n");
} else {
if(!is_numeric($strBookPubYear)) {
print("<p class='error'>The publication date must be numeric.</p>\n");
} else {
if(!(strlen($strBookPubYear) === 4)) {
print("<p class='error'>The Publication date must be exactly 4 characters long.</p>\n ");
} else {
$sqlQuery = mysql_query("SELECT yearPublished FROM books WHERE yearPublished < '$strBookPubYear'");
if($sqlQuery === false) {
print("<p class='error'>Could not execute the query, please try again.</p>\n");
} else {
注意$sqlQuery
变量应该获取yearPublished
低于$strBookPubYear
的所有数据。我已经阅读了多篇关于此的教程,但他们都使用了MySQL'Date'数据类型。在我的情况下,我使用文本数据类型。请不要告诉我使用mysqli,这个特定项目不要求我使用mysqli。
答案 0 :(得分:2)
数据库中最大的问题是:
yearPublished
varchar(4) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
YearPublished应至少为整数或更好的实际Date数据类型。
使用varchar数据类型(字符串数据类型),此SQL永远不会返回任何值:
yearPublished
小于号码,$sqlQuery = mysql_query("SELECT yearPublished FROM books WHERE yearPublished < '$strBookPubYear'");
无法比较字符串值是否“小于”某个其他字符串值。
<强>更新强>
如果你不能改变表的结构,你可以使用MySQL的CONVERT function来转换数据类型。
所以这样的事情应该有效:
<
由于$sqlQuery = mysql_query("SELECT yearPublished FROM books WHERE CONVERT(yearPublished, SIGNED) < CONVERT($strBookPubYear, SIGNED)");
是来自表单提交的字符串,因此您也需要转换它。
答案 1 :(得分:1)
您的yearPublished存储为varchar,它本质上是一个字符串。因此,当你说yearPublished < '$strBookPubYear'
时,它可能没有做你认为它正在做的事情。存储年度作为INTEGER发布。无论哪种方式,它需要4个字节。
您可以手动将varchar转换为查询中的数字,它应该可以开始工作。
SELECT yearPublished FROM books WHERE (yearPublished+0) < '$strBookPubYear'
好的,那不是真正的问题!试试这个错误检查块,吐出一些更好的线索:
// Check result
// This shows the actual query sent to MySQL, and the error. Useful for debugging.
if (!$sqlQuery) {
$message = 'Invalid query: ' . mysql_error() . "\n";
die($message);
}