簡體   English   中英

在提供日期之前選擇所有MySQL數據

[英]Select All MySQL Data Before Provided Date

我有一個小的PHP應用程序,它應該允許用戶在XHTML Web表單中輸入4位數年份,並返回保存在MySQL數據庫中的所有信息,其年份低於提供的年份。 年份存儲在yearPublished列下的db中。 我有查詢工作,我沒有錯誤,但沒有返回數據。

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

您在數據庫中遇到的最大問題是:

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

YearPublished應該至少是整數或更好的實際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是來自表單提交的字符串,因此您也需要轉換它。

您的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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM