1

私は、ユーザーが 4 桁の年を XHTML Web フォームに入力し、MySQL データベースに保存されているすべての情報を、提供された年よりも低い年で返すことを可能にする小さな PHP アプリケーションを持っています。年は列の下のデータベースに保存されます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すべてのデータを取得するはずの変数に注意してください。これについて複数のチュートリアルを読みましたが、それらはすべて MySQL の「日付」データ型を使用しています。私の場合、テキスト データ型を使用しています。mysqli を使用するように言わないでください。この特定のプロジェクトでは、mysqli を使用する必要はありません。yearPublished$strBookPubYear

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'

OK、それは実際には問題ではありませんでした。このエラー チェック ブロックを試して、より良い手がかりを吐き出してください。

// 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 に答える