2012-11-26 21 views
1

我有一個小型的PHP應用程序,它應該允許用戶在XHTML Web表單中輸入一個4位數的年份,並返回比MySQL一個提供。這些年份存儲在db下的列yearPublished。我有查詢工作,我得到沒有錯誤,但沒有數據被返回。在提供日期之前選擇所有MySQL數據

下面是用於創建數據庫的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。

回答

1

Your 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); 
} 
+0

我試過這個,得到了同樣的結果......沒有什麼大聲笑 –

+0

命令是否用CONVERT(yearPublished,SIGNED)工作? –

+0

嘗試不同的錯誤塊,mysql_error()可能會產生一些更好的線索! –

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 function數據類型之間的轉換。

所以這樣的事情應該工作:

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

由於$strBookPubYear是從形式進來的字符串提交,你需要轉換這一點。

+0

感謝您的想法,但是SQL文件是提供的,我不能爲了功能而改變它。無論如何不改變這種數據類型呢? –

+0

您可以強制mysql在每個查詢的基礎上將varchar解析爲數字。 –

+0

你能告訴我如何做到這一點,或指出我朝着正確的方向嗎? –

相關問題