• ベストアンサー

開始日と終了日が設定されているデータの扱いについて

開始日と終了日が設定されているデータの扱いについて教えてください。 すでに複数登録されているデータには、開始日と終了日というフィールドが登録されています。  → "開始日","終了日","箱1","箱2" → "051101","051130","a1","a2" → "051201","051231","b1","b2" 新しいデータを追加する際、すでに登録された期間に被っていた場合はエラー表示させたいのですが、そのやり方がわかりません。 (※12月1日~12月31日までというデータがすでに登録されていた場合、  11月1日~12月15日というデータは登録できない、という感じです) とりあえず下記のようにやったりしているのですが、 どうも思ったように動いてくれません また、SELECTを使うものなのか疑問に思っています。 $start_date = "2005-12-01" $end_date = "2005-12-31" $hoge = "SELECT * FROM table_name WHERE ( date_start<='"$start_data"' AND date_end>='"$start_data"' ) OR ( date_start<='"$end_data"' AND date_end>='"$end_data"')"; $db_query = sql_query($hoge,$ID); $array_result = mysql_fetch_array($db_query); if(empty($date_start_check) != TRUE ){ die("この期間内のデータはすでに登録されています。"); } 何卒、良いやり方を教えてくださいm(_ _)mペコリ

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

  • ベストアンサー
  • asdf24
  • ベストアンサー率54% (27/50)
回答No.3

>( date_start<='"$start_data"' AND date_end>='"$start_data"' ) OR >( date_start<='"$end_data"' AND date_end>='"$end_data"')"; この式だと、追加するデータの期間に収まってしまうデータがすり抜けます。 (たとえば、12月2日~12月30日までというデータがすでに登録されていた場合でも、 12月1日~12月31日というデータが登録できます) あと気になったのは >if(empty($date_start_check) != TRUE ) ここでいきなり $date_start_check というのが出てきてますが 実際のプログラムでは $array_result となってるのをタイプミスをしたのでなければ、実行は出来ますがSQLに関係なくif文は成立しません。 $hoge = "SELECT date_end, date_start FROM table_name WHERE date_end>='$start_date' AND date_start<= '$end_dated'"; $db_query = mysql_query($hoge,$ID); if( mysql_num_rows($db_query) ){ die("この期間内のデータはすでに登録されています。"); } とりあえずこんな感じで動くと思います。

dororon999
質問者

お礼

ありがとうございます。 無事、動くようになりましたm(_ _)mペコリ

その他の回答 (3)

  • fire--
  • ベストアンサー率49% (146/293)
回答No.4

asdf24さんのが正しいロジックですね。 うっかり、見落としていました。 失礼しました。

  • fire--
  • ベストアンサー率49% (146/293)
回答No.2

後者については、普通のキーならばduplicateエラーとか ありますが、こういう期間の場合の手は知りません。 ベテランなら良い手を知っているかもしれません。 現在、期間が重なって登録できるとの事ですが、基本的な式は どうみても間違ってないので、コーディングに何か問題が あるように思えます。それを確認するには、プログラムを コピー&ペーストしてもらえば判るかもしれません。 確認するに

  • fire--
  • ベストアンサー率49% (146/293)
回答No.1

ここに書いたとおりのコーディングでしょうか? だとすると、基本的な考えは良いのですが、ミスがありますね。 まず日付のデータですが、データベースの中身は yymmdd の 形式で、プログラム中で代入しているのは、yyyy-mm-dd に なってますね。合わせましょう。 次に変数名です。値を代入するときは $start_date ですが、 SQL文中は$start_dataで、eとaが違ってます。endのほうも 同じです。 まず、そこを確認しましょう。

dororon999
質問者

補足

すみません。 上記、記載しているものは書き込み用に編集したときにタイプミスしたもので、実際は通常に動いています。 しかし、SQL文の条件部分がやりたいことを満たしてないので、期間が重なっても登録できてしまいます。 また、上記ではSELECT文で読み出した後に、mysql_fetch_arrayを使って配列として取得した後、取得できたならエラーというの作業をしていますが、クリエ実行段階でデータがあればFALSEを返すみたいなものがあれば、そこでエラーを出せる気がしたので、他にそのようなやり方があれば教えてくださいm(_ _)mペコリ

関連するQ&A