1

我有一个小型 PHP 应用程序,它应该允许用户在 XHTML Web 表单中输入 4 位数的年份,并返回保存在 MySQL 数据库中的所有信息,其年份低于提供的年份。年份存储在 db 列下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。

4

2 回答 2

2

您在数据库中的最大问题在这里:

yearPublished varchar(4) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,

YearPublished 至少应该是 Integer 或更好的实际 Date 数据类型。

使用 varchar 数据类型(字符串数据类型),此 SQL 永远不会返回任何值:

$sqlQuery = mysql_query("SELECT yearPublished FROM books WHERE yearPublished < '$strBookPubYear'");

小于符号,<如果字符串值“小于”某个其他字符串值,则无法比较。

更新

如果不能改变表的结构,可以使用 MySQL 的CONVERT 函数在数据类型之间进行转换。

所以这样的事情应该有效:

$sqlQuery = mysql_query("SELECT yearPublished FROM books WHERE CONVERT(yearPublished, SIGNED) < CONVERT($strBookPubYear, SIGNED)");

由于$strBookPubYear是来自表单提交的字符串,因此您也需要对其进行转换。

于 2012-11-27T00:03:58.267 回答
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);
}
于 2012-11-27T00:03:39.197 回答