phpとMySQLの連携についての質問です。


(関連:http://q.hatena.ne.jp/1178369803

GETメソッドで program.php?year=2007&month=05とアクセスし、2007年05月のデータを表示したいと思っています。

$yearnumber = $_GET["year"];
$monthnumber = $_GET["month"];
$date_format = $yearnumber."-".$monthnumber;

として、MySQL に

SELECT * FROM table_name WHERE DATE_FORMAT(hizuke, '%Y-%m' ) = '$date_format'

という命令を送ったのですが、うまく2007年5月のデータが読み込めませんでした。

ちなみに、

SELECT * FROM table_name WHERE DATE_FORMAT(hizuke, '%Y-%m' ) = DATE_FORMAT( now(), '%Y-%m')

で、今月のデータを取り出すというのはうまくいっています。

上記の例はどこが間違っているのでしょうか。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/05/09 21:50:11
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.2

回答回数1314ベストアンサー獲得回数393

ポイント100pt

一点確認したいのですが、GET で渡しているデータは"05"でしょうか。

SQL は文字列の比較になっているので、これが "5" である場合は異なると判断されます。


そうでなければ、

    $yearnumber = $_GET["year"];
    $monthnumber = $_GET["month"];
    $date_format = $yearnumber."-".$monthnumber;

    print "DEBUG :$date_format<BR>\n";  //  デバッグ確認用

    $sql = "SELECT * FROM table_name WHERE DATE_FORMAT(hizuke, '%Y-%m') = '$date_format';";
    $res = mysql_query( $sql, $conn ) or die("データ抽出エラー\n".$sql);

のような感じで、問題なく抽出できると思います(こちらでは成功しました。)。


DATE_FORMAT が返すのは文字列なのでその意味では問題ありませんが、DATE_FORMAT の中で使用するのは日付型なので

もし一度変換してからやるとしたら、

    $date_format = $yearnumber."-".$monthnumber."-01";
    $sql  = "SELECT * FROM table_name ";
    $sql .= "WHERE DATE_FORMAT( hizuke, '%Y-%m') = DATE_FORMAT( STR_TO_DATE('$date_format', '%Y-%m-%d'), '%Y-%m' );";

のようになると思います。

後者のやり方であれば、月が 5 でも 05 でも処理ができると思います。

MySQL STR_TO_DATE

id:sun-chan

ありがとうございます。

month=05 でも過去に試していたんですが、その時は命令文のほうが悪かったのかうまくいかなかったようです。


教えていただいた上のほうのやり方で今やってみたところ、ちゃんと表示されました。

DEBUG とか、 mysql_query($sql, $conn)と書くやり方、抽出エラーの後ろに.$sqlがついているのとかは初めてみたので、また本で見て勉強します。


ひとつなにかやろうとすると、こうやってつまづいて、自分で本とかネットで調べていろいろ試してみるんですが、うまくいかなくって…はてなで質問してばっかりで、なんだか情けないです。(^_^;)


ありがとうございました。

2007/05/09 18:19:52

その他の回答1件)

id:hopefully No.1

回答回数7ベストアンサー獲得回数0

ポイント20pt

SQL文で日付を取得する際は

条件文を日付型にしないといけません。

http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-functions.h...

id:sun-chan

なんとなくわかるんですが、なんとなくわかりません…(ごめんなさい)

DATE_FORMAT(hizuke, '%Y-%m' ) = '$date_format'

と型の違うのを比べているのがいけないんですよね?

$_GETで得た値を使って日付型を作るのはどうやったらいいんでしょうか。

$yearnumber = $_GET["year"];

$monthnumber = $_GET["month"];

$date_format = $yearnumber."-".$monthnumber."-01";

DATE_FORMAT(hizuke, '%Y-%m' ) = DATE_FORMAT($date_format, '%Y-%m' )

とかやったらいいんでしょうか。

2007/05/09 11:20:23
id:Mook No.2

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント100pt

一点確認したいのですが、GET で渡しているデータは"05"でしょうか。

SQL は文字列の比較になっているので、これが "5" である場合は異なると判断されます。


そうでなければ、

    $yearnumber = $_GET["year"];
    $monthnumber = $_GET["month"];
    $date_format = $yearnumber."-".$monthnumber;

    print "DEBUG :$date_format<BR>\n";  //  デバッグ確認用

    $sql = "SELECT * FROM table_name WHERE DATE_FORMAT(hizuke, '%Y-%m') = '$date_format';";
    $res = mysql_query( $sql, $conn ) or die("データ抽出エラー\n".$sql);

のような感じで、問題なく抽出できると思います(こちらでは成功しました。)。


DATE_FORMAT が返すのは文字列なのでその意味では問題ありませんが、DATE_FORMAT の中で使用するのは日付型なので

もし一度変換してからやるとしたら、

    $date_format = $yearnumber."-".$monthnumber."-01";
    $sql  = "SELECT * FROM table_name ";
    $sql .= "WHERE DATE_FORMAT( hizuke, '%Y-%m') = DATE_FORMAT( STR_TO_DATE('$date_format', '%Y-%m-%d'), '%Y-%m' );";

のようになると思います。

後者のやり方であれば、月が 5 でも 05 でも処理ができると思います。

MySQL STR_TO_DATE

id:sun-chan

ありがとうございます。

month=05 でも過去に試していたんですが、その時は命令文のほうが悪かったのかうまくいかなかったようです。


教えていただいた上のほうのやり方で今やってみたところ、ちゃんと表示されました。

DEBUG とか、 mysql_query($sql, $conn)と書くやり方、抽出エラーの後ろに.$sqlがついているのとかは初めてみたので、また本で見て勉強します。


ひとつなにかやろうとすると、こうやってつまづいて、自分で本とかネットで調べていろいろ試してみるんですが、うまくいかなくって…はてなで質問してばっかりで、なんだか情けないです。(^_^;)


ありがとうございました。

2007/05/09 18:19:52
  • id:Mook
    少しだけ補足です。

    "DEBUG" は単なる表示文字列なので、処理をする上で特別な意味があるわけではありません。
    実際に GET で期待したとおりになっているかを確認するために入れました。問題なければ print 文ごと削除してください。

    どのような言語でもそうですが、実行状態を確認するために、変数の内容を表示してみるというのは、有効な手段です。


    >抽出エラーの後ろに.$sqlがついているのとか
    この die の部分は、クエリが失敗したときのみ機能します。
    実際にどういうクエリ文かを確認するためにあるだけで、エラーメッセージの一部としているだけです。

    >初めてみたので、また本で見て勉強します。
    なので、参考書等には無いかもしれませんので、あまり深く悩みませんように。
  • id:sun-chan
    補足ありがとうございます。

    >> 実際に GET で期待したとおりになっているかを確認するために入れました。

    実はこういうやり方はわからなかったので、もうひとつ test.phpを書いて、
    $yearnumber = $_GET["year"];
    $monthnumber = $_GET["month"];
    $date_format = $yearnumber."-".$monthnumber;
    を echo で表示したりしていました。

    最初は $date_format = $yearnumber-$monthnumber;と書いていたので、2007-5= 2002 になっていました。(^_^;)

    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません