• ベストアンサー

PHP+MySQLで

PHPとMySQLにて、 データベースのテーブル[買い物]に、 「野菜」「日時」という属性を用意しておき、そこに (にんじん)(2006-10-31 09:00) (かぼちゃ)(2006-11-01 10:21) (たまねぎ)(2006-10-21 11:45) (もやし)(2006-12-22 14:00) が格納してあります。 ここから日付が、例えば、2006年の10月の行を抜き出すにはどうしたらよいのでしょうか? $y=$_GET['year'] $m=$_GET['month'] $d=$_GET['day'] として、年月日を得ます。 $y年の$m月分のデータを取得したいのですが、よく分かりません。 select * from 買い物 where 日時>$y-$m-1 and 日時<$y-$m-31 のような感じになるのでしょうか? どなたかよろしくお願いします。 MySQL4.4.4です。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

余計な話かもしれませんが#1さんの方法はインデックスがきかなそう なので避けた方がよさそうです。どうしてもというならとめませんが。 日時がdate型であればこんな感じです。 SELECT * FROM 買い物 WHERE 日時 >='$y-$m-1' and 日時<'$y-$m-1'+INTERVAL 1 MONTH - INTERVAL 1 DAY datetime型であればこうですね SELECT * FROM 買い物 WHERE 日時 BEWEEN '$y-$m-1' and '$y-$m-1'+INTERVAL 1 MONTH BETWEENをつかわなければこう? SELECT * FROM 買い物 WHERE 日時>= '$y-$m-1' and 日時<'$y-$m-1'+INTERVAL 1 MONTH

jumpman_723
質問者

お礼

回答ありがとうございます。 無事目的を果たすことができました。 ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

MySQL独自の関数(参考URLを参照のこと)を使う手もあります。 ですが私は移植性を考えて質問者さんが考えられたようなWHERE句でやってます。 ただ「日時」カラムの型がtimestamp型のように時分秒まで入るものでしたら、質問者さんの書かれている方法ですと31日は含まれないので、下記のようにしたほうがよいと思います。 SELECT * FROM 買い物 WHERE 日時>'$y-$m-1 0:0:0' AND 日時<'$y-($m+1)-1 0:0:0'

参考URL:
http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-functions.html
jumpman_723
質問者

お礼

回答ありがとうございます。 参考になりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

select * from 買い物 where year(日時)=$y and month(日時)=$m こちらでいけます。

jumpman_723
質問者

お礼

回答ありがとうございます。 こんな簡単な方法があったんですね! 参考になりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHPとMysqlを使用して

    PHPとMysqlを使用して会員登録制のカレンダーを作りたいと思っています。しかし思ったとおりの挙動に繋がりません。 やりたいことは、日付リンクをmysqlにスケジュールを登録した件だけに日付ページのリンクを反映させたいです。 しかし、何をやってもうまくいきません。 if($month >= 3){などとするとその月全ての日付にリンク<a>でくくられてしまいます。 フリーのカレンダー.phpのソースを部分的に抜き出してカスタマイズしたものです。 参考ページは登録したスケジュールの日付にだけ、ちゃんとリンクが反映されています。 mysqlでやろうとしたら、その月の日付全てにリンクがついてしまいました。 というか、日にち全てにリンクがついてしまいました。 これをmysqlに登録したスケジュール(monthとday)が該当した日付だけにリンクができるように設定をしたいのです。 もともと参考にしたカレンダーのサイトは.datに保存する形式のソースでした。 それをmysqlにスケジュールを登録して読み込む形にカスタムしたいのです。 ■対象部分と思われるリンク if(!isset($month)){ echo "<a href=$PHP_SELF?action=view&year=" . $year . "&month=" . $month . "&day=" . $day_num . " onMouseOver=this.style.color='red' onMouseOut=this.style.color='green'><b>$day_num</b></a>"; ソースは以下の通りになります。 ■参考にしたサイトのソース http://space.geocities.jp/kokorononakaniitumo/calendar_sample.txt ■反映させたいPHPのソース http://space.geocities.jp/kokorononakaniitumo/calendar.txt ■参考サイトの画像 http://space.geocities.jp/kokorononakaniitumo/sankou.jpg ■若干違いますが参考にしたカレンダーのPHP http://www.yumemaboroshi.net/cgi/us-re-detail1.php?mode=sample&s01=... ■mysql(フィールドの中身) http://space.geocities.jp/kokorononakaniitumo/mysql.txt ■リンクのない画像 http://space.geocities.jp/kokorononakaniitumo/nolink.jpg ■リンクが月の全てに反映されてしまった画像(これをmysqlに登録したスケジュールの日付(monthとdayが一致した)と一致した日付だけにリンク<a>がくくられるようにしたい) http://space.geocities.jp/kokorononakaniitumo/linkall.jpg ■mysqlの画像(monthが4、dayが19と26の二件が登録されており、つまりは4月19日と4月26日の日付だけが<a>でくくられるようにしたいのです) http://space.geocities.jp/kokorononakaniitumo/mysql.jpg

    • 締切済み
    • PHP
  • PHP mysql 時刻表示方法

    データベースに登録されている時刻を表示する方法についてご質問があります。 PHPは初心者です。 コードは以下になります。 $row = mysql_fetch_array($result_member); if ($row) { $m_reg_date = $row['reg_date']; $m_edit_date = $row['edit_date']; } } $str_reg = $m_reg_date; list($m_reg_year,$m_reg_month,$m_reg_day) = explode("-",$str_reg); $format_reg = "%04d年%02d月%02d日"; $str_edit = $m_edit_date; list($m_edit_year,$m_edit_month,$m_edit_day) = explode("-",$str_edit); list($m_edit_hour,$m_edit_minute,$m_edit_second) = explode(":",$str_edit); $format_edit = "%04d年%02d月%02d日 %02d:%02d:%02d"; という記述をしており、 <?php printf($format_edit, $m_edit_year, $m_edit_month, $m_edit_day, $m_edit_hour, $m_edit_minute, $m_edit_second); ?> で表示させています。 しかし、こちらの表示方法だと 2010年04月03日 2010:43:22 と表示されてしまい、時刻の**時がなぜか西暦になってしまいます。 こちらを24時間方式の表示に変更したいのですが、 お分かりのかたいらっしゃいましたらご教授お願いいたします。

    • ベストアンサー
    • PHP
  • PHPでカレンダー

    PHPを使ってカレンダーを作成しました。が、コードの意味が良く分かりません。 コードは以下の通りです。 <?php if($_GET['num']==''){ $today_year = date("Y"); //4桁の西暦年 $today_month = date("n"); //1~12の月 }else{ $timestamp = mktime(0,0,0,date("n")+$_GET['num'],date("d"),date("Y")); $today_year = date("Y",$timestamp); $today_month = date("n",$timestamp); //1~12月 } $current = mktime(0,0,0,$today_month,1,$today_year); $first_day = date("w",$current); //1日の曜日を0~6に当てはめる $last_day= date("t",$current); //月の日数 ?> <html> <head> <title>カンレンダー</title> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> </head> <body> <h1><?php print (date("Y年m月",$current)); ?>のカレンダー</h1> <table border="1" cellpadding="0" cellspacing="2"> <tr> <th>日</th><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th>土</th> </tr> <?php for($i=1; $i<=$first_day+$last_day; $i++){ if($i%7==1){print ("<tr>");} if($i>$first_day){ print ("<td>".($i-$first_day)."</td>"); }else{ print ("<td>&nbsp;</td>"); } if($i%7==0){print ("</tr>");} } ?> </table> </body> </html> for以降の部分が良く分かりません。よろしくお願いします。※上記のスクリプトで正しく表示されることは確認済です。

    • 締切済み
    • PHP
  • ファイルデータの入れ替えについての質問

    お世話になります ファイルの内容は $s_get_year<>$s_get_month<>@chk<>\n このような並び方です POSTメソッドで送られてきたデータ$get_yearと$get_monthが 一番目のデータ($s_get_year)と2番目のデータ($s_get_month)と同じならば その行を入れ替えて、そうでなければ追加して書き込むという処理を行いたいのですが 下記のようにしたのですが思い通りの動作をしません、御教授お願いします。 sub ho_disc_write { @new=(); open(IN,"$holidayfile") || &error("Open Error : $holidayfile"); while (<IN>) { ($s_get_year,$s_get_month) = split /<>/, $_, 2; if ($s_get_year == $get_year && $get_month == $s_get_month) { $_ = join('<>',$get_year,$get_month,@chk,"\n"); } push(@new,$_); } close(IN); # データ上書き open(OUT,">$holidayfile") || &error("Write Error : $holidayfile"); print OUT @new; close(OUT); exit; }

    • ベストアンサー
    • Perl
  • PHP データベース データ更新

    データベース更新について お世話になっております。 データベースの更新ができず困っております。 ご教授いただければと思います。 PHPは初心者です。 コードは下記の用になっております。 form.php <?php ・ ・ ・ $member = $_GET[name]; ・ ・ ・ $query_member = sprintf("SELECT * FROM `member` WHERE ID='$member'"); $result_member = mysql_query($query_member, $link); if ($result_member) { $row = mysql_fetch_array($result_member); if ($row) { $m_id = $row['id']; $m_first_name = $row['first_name']; $m_last_name = $row['last_name']; $m_first_kana = $row['first_kana']; $m_last_kana = $row['last_kana']; $m_b_year = $row['b_year']; $m_b_month = $row['b_month']; $m_b_day = $row['b_day']; } } ?> <html> <body> <form action="complete.php?<?php print $m_id; ?>" method="POST"> <input type="text" name="<?php print $m_first_name; ?>" value="<?php print $m_first_name; ?>" /> <input type="text" name="<?php print $m_last_name; ?>" value="<?php print $m_last_name; ?>" /> <input type="text" name="<?php print $m_first_kana; ?>" value="<?php print $m_first_kana; ?>" /> <input type="text" name="<?php print $m_last_kana; ?>" value="<?php print $m_last_kana; ?>" /> <input type="text" name="<?php print $m_b_year; ?>" value="<?php print $m_b_year; ?>"> 年 <input type="text" name="<?php print $m_b_month; ?>" value="<?php print $m_b_month; ?>"> 月 <input type="text" name="<?php print $m_b_day; ?>" value="<?php print $m_b_day; ?>"> 日 <input type="submit" name="regist" value="編集"> </form> complete.php <?php ・ ・ ・ $m_id = $_GET[name]; ・ ・ ・ $first_name = mysql_real_escape_string($_POST['m_first_name']); $last_name = mysql_real_escape_string($_POST['m_last_name']); $first_kana = mysql_real_escape_string($_POST['m_first_kana']); $last_kana = mysql_real_escape_string($_POST['m_last_kana']); $year = mysql_real_escape_string($_POST['m_b_year']); $month = mysql_real_escape_string($_POST['m_b_month']); $day = mysql_real_escape_string($_POST['m_b_day']); $query_edit = sprintf("UPDATA `member` SET `first_name`='$first_name', `last_name`='$last_name' WHERE id='$m_id'"); $result_edit = mysql_query($query_edit, $link) or die(mysql_error()); if ($result_edit) { $msg = '編集しました。'; } else { $msg = '編集に失敗しました。'; } ?> <html> <body> <?php print $msg; ?> </body> </html> となっております。 $member = $_GET[name];はhttp://oshiete1.goo.ne.jp/qa5783266.htmlにてご教授いただいたので使用しています。 $result_edit = mysql_query($query_edit, $link) or die(mysql_error());でエラーが出力されたところデータの受け渡しができていませんでした。 どこを直せば良いのかわからず困っております。 お分かりの方がいらっしゃいましたらご教授お願いいたします。

    • ベストアンサー
    • PHP
  • php MySQL データ登録 方法

    以前もご質問させていただいたのですが、調べてもわからず困り果てています。 PHPとMySQLは初心者です。 PHPのバージョンはPHP 5.2.12 MySQLのバージョンは 5.1 サーバーはさくらインターネットを使用しています。 コードは下記のとおりになります。 form.php <html> <body> <form action="complete.php" method="POST"> <input type="text" name="id"> <input type="text" name="password"> <input type="text" name="first_name"> <input type="text" name="last_name"> <input type="text" name="first_kana"> <input type="text" name="last_kana"> <?php print '<select name="b_year">'."\n"; $start = date('Y') -40; $end = date('Y') -16; for ($i = $start; $i <= $end; $i++) { $selected = ""; $selected = ($_POST["b_year"] == sprintf('%04d',$i)) ? "selected":""; print '<option value="' . sprintf('%04d',$i) . '" '.$selected.'>' . sprintf("%04d",$i) . '</option>' . "\n"; } print '</select> 年' . "\n"; (文字数のためb_monthとb_dayを省略) ?> <input type="text" name="number"> <input type="text" name="height"> <input type="text" name="weight"> <input type="submit" name="regist" value="登録"> <input type="reset" name="reset" value="リセット"> </form> </body> </html> complete.php <?php ・ ・ $id = mysql_real_escape_string($_POST['id']); $password = mysql_real_escape_string($_POST['password']); $first_name = mysql_real_escape_string($_POST['first_name']); $last_name = mysql_real_escape_string($_POST['last_name']); $first_kana = mysql_real_escape_string($_POST['first_kana']); $last_kana = mysql_real_escape_string($_POST['last_kana']); $year = mysql_real_escape_string($_POST['b_year']); $month = mysql_real_escape_string($_POST['b_month']); $day = mysql_real_escape_string($_POST['b_day']); $number = mysql_real_escape_string($_POST['number']); $height = mysql_real_escape_string($_POST['height']); $weight = mysql_real_escape_string($_POST['weight']); ・ ・ $query_reg = sprintf("INSERT INTO `member` (`id`,`password`,`first_name`,`last_name`,`first_kana`,`last_kana`,`b_year`,`b_month`,`b_day`,`number`,`height`,`weight`) VALUES('$id',$password,'$first_name','$last_name','$first_kana','$last_kana',$year,$month,$day,,$number,$height,$weight"); $result_reg = mysql_query($query_reg, $link) or die(mysql_error()); if ($result_reg) { $msg = '登録しました。'; } else { $msg = '登録に失敗しました。'; } ・ ・ ・ ?> <html><body><?php print $msg; ?></body></html> とフォームを入力してデータベースに登録をするという流れです。 ご質問ですが、フォームに項目を入力して登録するとデータベースに登録がされます。 しかし、数字のみ($number、$height、$weight)の場所を未入力にするとエラーが出力されます。 エラーは 「You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near」です。 MySQLは下記のように設定しています。 id varchar(20) None password varchar(255) None first_name varchar(8) NULL last_name varchar(8) NULL first_kana varchar(8) NULL last_kana varchar(8) NULL b_year int(4) NULL b_month int(2) NULL b_day int(2) NULL number varchar(2) NULL height varchar(3) NULL weight varchar(3) NULL 未入力でもエラーが表示されずデータベースに入力されたとこだけ登録されるようにするにはどうしたらよろしいのでしょうか? お分かりの方がいらっしゃいましたらご教授お願いいたします。

    • ベストアンサー
    • PHP
  • MySQL + PHP 同じテーブル内でのクエリについて

    PHP+MySQL勉強中の初心者です。 PHP+MySQL環境でのクエリについて、以下の条件でのクエリ結果を求めたいのですが、上手くできませんので、質問させてください。 MySQLのテーブルは以下のようになっています。 date        no   name ---------------------------- 2009-12-10   15   takada 2009-12-15   10   hirooka 2009-12-18   13   wakada 2010-01-10   15   takada 2010-01-11   13   wakada ----------------------------- 出力させたいクエリは、前月データを元にno列をKEYとした重複チェックです。 前月データを全件出力し、当月データに同じnoがあった場合、当月日付を 表示させたいと思っています。 (PHPで希望する出力結果) date       no   name     date2 ---------------------------------------- 2009-12-10  15   takada   2010-01-10 2009-12-15  10   hirooka 2009-12-18  13   wakada   2010-01-11 ----------------------------------------- 以下のようなソースでは、1行のみの出力結果しか表示されず、 whileの使い方に問題があると思うのですが、どのように解決すれば良いのかが解りません。 どうか、解決策をよろしくお願いいたします。 $mysql->query("SELECT * FROM xxxx where date LIKE '$y-$m%'"); while($row = $mysql->fetch()){ $date = $row["date"]; $no = $row["no"]; $name = $row["name"]; $mysql->query("SELECT * FROM xxxx where upddate LIKE '$y2-$m2%' and no = '$no'"); while($row = $mysql->fetch()){ $date2 = $row["date"]; echo <<<EOT <td>$date</td> <td>$no</td> <td>$name</td> <td>$date2</td><tr> EOT; } }

    • 締切済み
    • PHP
  • php+MYSQL

    タイトル 本文 書き込み後保存を押すと 下に書き込み保存されていく形です タイトル 本文 書き込み日時 タイトル 本文 書き込み日時 エラー自体は出てないのですが書き込みが反映されません val_dunpで調べたところ resource(7) of type (mysql result) > このように出てきましたなにか文自体に必要なものがないのでしょうか? <?php $link = mysql_connect('localhost','user','pass'); if (!$link) { die('接続に失敗しました。'.mysql_error()); } $db_selected = mysql_select_db('ogawa',$link); if(!$db_selected) { die('データベース選択に失敗しました。'.mysql_error()); } $res = mysql_query('SELECT * FROM test'); if (!$res) { die('クエリーが失敗しました。'.mysql_error()); } if ( $link !==false) { $msg =''; $err_msg =''; if ( isset( $_POST['send'] )=== true) { $subject =$_POST['subject']; $honbun =$_POST['honbun']; $kakikomi = $_POST['kakikomi']; if ( $subject !=='' && $honbun !=='' && $kakikomi !=='' ) { $query = " INSERT INTO test ( " ."subject," ."honbun," ."kakikomi," .") VALUES ( " . "'" . mysql_real_escape_string( $link, $subject ) ."', " . "'" . mysql_real_escape_string( $link, $honbun )."'," . "'" . mysql_real_escape_string( $link, $kakikomi)."'," ." ) "; $kakikomi = date('Y-m-d h:i:s'); $res = mysql_query($query,$link); if ($res !==false) { $msg = '書き込みに成功しました。'; }else{ $err_msg = '書き込みに失敗しました。'; } }else{ $err_msg = 'タイトルと本文を書き込んで下さい。'; } } $query = 'SELECT id,subject,honbun,kakikomi FROM test'; $res = mysql_query($query,$link); $data = array(); var_dump($res); if ($res) { while($row = mysql_fetch_assoc($res)) { array_push($data,$row); } } arsort($data); }else{ echo"データベースの接続に失敗しました"; } mysql_close($link); ?> <html> <head> <meta http-equiv="content-type" content="text/html;charset=UTF8;" /> </head> <body>> <table border="1"> <form action="test6.php" method="POST"> <tr><th>タイトル<td><input type="text" name="text" size="50"></td></tr> <tr><th>本文<td><textarea name="subject" cols="52" rows="8"></textarea> <tr><td><input type="submit" value="保存 する" /></td><tr> </table> </form> <?php if ($msg !=='')echo'<p>'.$msg.'</p>'; if ($err_msg !=='')echo'<p style="color:#f00;">'.$err_msg.'</p>'; foreach($data as $key =>$val) { echo $val['subject'].''.$val['honbun'].''.$val['kakikomi'].'<br>'; } ?> </body> </html>

  • mysqlで年と月を別々のカラムに収納しています

    mysql5.1を利用してデータベースを作成しています。 テーブルに年と月を別々で収納しているのですが、 そのテーブルの中のデータから「今月を過ぎていなければ」という条件で抽出したいのですが、 SQLの書き方がわかりません。 私のSQLの基礎の基礎しか教えてもらっておらず、 あとは独学で、現在のレベルはようやく少しサブクエリを書き出した(学びだした)レベルです。 しかもwindows上のNavicat Lite(アプリ)上で書いてる状態です。 自分のイメージ的には下記のような感じなのですが、動きません。 どなたか教えていただけないでしょうか。 よろしくお願いします。 hoge_tblテーブルからBカラムが'hoge'かつ、 hoge_tblテーブル内のYEARカラムとMONTHカラムの値を今月と比較して、 「今月を過ぎていなければ」といった条件を付けたいと考えております。 select A from hoge_tbl where B = 'hoge' and (select date_format(now(),'%Y%m') as NOW) < (select date_format('(select YEAR,MONTH from hoge_tbl )’,'%Y%m') as END)

    • ベストアンサー
    • MySQL
  • PHP 余分に出来たタグを消したい

    PHP初心者です。 ただ今カレンダーを作成しております。 コードは以下です。 <?php $d=isset($_GET['d'])? $_GET['d']:date("Y-n-d"); list($year,$month,$day)=explode("-",$d); $prev=date("Y-n-d",mktime(0,0,0,$month-1,1,$year)); $next=date("Y-n-d",mktime(0,0,0,$month+1,1,$year)); $timestamp = mktime(0,0,0,$month,1,$year); $fd=date("w",$timestamp); $ld=date("t",$timestamp); ?> <table> <tr> <th><a href="?d=<?php echo$prev; ?>">←</a></th> <th colspan="5"><?php echo ("<h1>".$year."年".$month."月</h1>"); ?></th>   <th><a href="?d=<?php echo$next; ?>">→</a></th> </tr> <tr> <th class="sun">日</th> <th>月</th> <th>火</th> <th>水</th> <th>木</th> <th>金</th> <th class="sat">土</th> </tr> <tr> <?php $offset = $fd; // while($fd--){ //$y ++; // 空セル文曜日を増やす $s .= "<td></td>\n"; } for($i=1; $i<=$ld; $i++){ $tmp = $offset + $i; //$tmpを$offset(1日までの空セル) と $i(31日)を足したものにする $s.="<td>$i</td>\n"; //$sに日数とセルを追加 if($tmp % 7 ==0){ //$tmp(空セル+その月の日数)を7で割りあまりが0すなわち土曜日まできたら $s.= "</tr>\n<tr>\n"; //</tr>で改行をいれる } } $y=0; for($i=1; $i<=$tmp; $i++){ //$tmp(空セル+その月の日数)になるまで if($y % 7 == 0){ //7倍数になったら0にリセットする $y = 0; } $y++; //リセットされた残りの曜日 } $r=7-$y; $y=0; while($r--){ $s.='<td></td>'; } for($i=1; $i<=$tmp; $i++){ if($tmp % 7 == 0){ $s.="</table>\n"; break; }else{ $s.="</tr></table>\n"; break; } } echo $s; ?> 一見出来ているようですが、最終日が土曜日になると余分な<tr>が入ってしまいます。 原因として、 if($tmp % 7 ==0){ $s.= "</tr>\n<tr>\n";} と入れてあり、土曜日に7がくる(7で割り切れる数字で終わる)であるとは理解しているのですが、どうすれば、「最終セルに最後の日が来たときに<tr>をいれない」といった命令の仕方がわかりません。 素人ですので、分かりやすく解説していただけると嬉しいです。 よろしくお願い致します。