Memo DB

memorial.txt を参照して、記念日の DataBase(memorial.db) を作成します。

プログラムの説明

  1. 記念日アプリケーションで使用する DataBase(memorial.db) を作成します。
    PHP+DB Memo では5件の記念日を登録していますが、本格的な記念日の DataBase を作成します。
    記念日を memorial.txt に列挙して、一件ずつ入力しながら memorial.db に登録します。
    memorial.txt の形式です。
    1995-1-17 阪神淡路大震災
    1997-8-31 ダイアナ妃交通事故死
        ・・・
    2001-9-11 アメリカ航空機テロ
    2011-3-11 東日本大震災
    
  2. memorial.txt を入力しながら memorial.db を作成する memo_txt_db.php です。
    c:\html\public\php\ に memorial.txt と memo_txt_db.php を格納して下さい。
    memorial.db を新規に作成するので、事前に削除して下さい。
    <?php
        // 通算日数を計算する関数
        function Days($yy,$mm,$dd)
        {   $mt = array( 0,31,59,90,120,151,181,212,243,273,304,334 );
            $y= (int)$yy;
            $m= (int)$mm-1;
            $d= (int)$dd;
            //print $y . "-" . $m . "-" . $d . "\n";
            $w= ($y-1)*365;           //年*365
            $w+= floor($y/4) - floor($y/100) + floor($y/400) + $mt[$m] + $d;
            if ($m<3 && Uruu($y))    $w--;
            return($w);
        }
        // 閏年を調べる関数
        function Uruu($y)
        {   if ($y%400==0)  return(true);
            if ($y%100==0)  return(false);
            if ($y%4==0)    return(true);
            return(false);
        }
    
        $flag = file_exists('memorial.db');
        if ($flag)
        {   die("実行する前に memorial.db を削除して下さい");  }
        $db = new SQLite3('memorial.db');
        $db->exec('create table table1 (num, ymd, msg)');
        $db->exec("insert into table1 values(1, '1-1-1', '西暦元年元旦')");
        if (($fp = fopen("memorial.txt","r")))
        {   while(!feof($fp))
            {   $str= fgets($fp);
                if (strlen($str)<6)	continue;
                $str = str_replace(array("\r", "\n"), '', $str);
                $array = explode(" ", $str);
                $ary = explode("-", $array[0]);
                $num = Days($ary[0], $ary[1], $ary[2]);
                $ws= "insert into table1 values($num, " . "'" . $array[0] . "', '" . $array[1] . "')";
                print $ws . "\n";
                $db->exec($ws);
            }
            fclose($fp);
        }
        //データを表示
        $results = $db->query('select * from table1');
        print "<table border='1'>\n";
        while($row = $results->fetchArray())
        {   print "<tr><td>$row[num]</td>";
            print "<td>$row[ymd]</td>";
            print "<td>$row[msg]</td></tr>\n";
        }
        print "</table>";
        $db->close();
    ?>
    
  3. memorial.db の検索において、キーとなるのが「西暦元年元旦からの通算日数」です。
    日付を文字列で比較したのでは、1 と 01 の違いや空白の挿入などにより比較に工夫が必要です。
    Days($yy,$mm,$dd) 関数で通算日数を計算します。
    Uruu($y) 関数で閏年を調べます。
    詳細は Days of the week を参照して下さい。

前田稔の超初心者のプログラム入門
PHP Program