Perl で、直近の INSERT で生成された ID を得るには?

MySQL を使っていて、auto_increment だったカラムがあるテーブルに INSERT をした場合、このときに生成された ID を取得するには、LAST_INSERT_ID() と書いた SELECT 文を発行する。
@result = $DB->selectrow_array(qq|SELECT LAST_INSERT_ID()|);
$id = $result[0];
MySQL を使っていて、auto_increment だったカラムがあるテーブルに INSERT をした場合、このときに生成された ID を取得するには、LAST_INSERT_ID() と書いた SELECT 文を発行する。
@result = $DB->selectrow_array(qq|SELECT LAST_INSERT_ID()|);
$id = $result[0];

PHP で、直近の INSERT で生成された ID を得るには?

MySQL を使っていて、auto_increment だったカラムがあるテーブルに INSERT をした場合、このときに生成された ID を取得するには、PHP では mysql_insert_id という便利な関数が用意されている。
<?php

// 最初のカラムは auto_increment
$sql = "INSERT INTO `sample` values('', 'test1', 'test2', 'test3')";
mysql_query($sql);
$id = mysql_insert_id();

?>
MySQL を使っていて、auto_increment だったカラムがあるテーブルに INSERT をした場合、このときに生成された ID を取得するには、PHP では mysql_insert_id という便利な関数が用意されている。
<?php

// 最初のカラムは auto_increment
$sql = "INSERT INTO `sample` values('', 'test1', 'test2', 'test3')";
mysql_query($sql);
$id = mysql_insert_id();

?>

Perl で、誕生日を求める。

my $now = time; とすれば、$now に 「1970 年 1 月 1 日から現在までの秒数」 の値が入る。そこで、ある人の誕生日を 1970 年からの秒数としてデータベースに保存してある場合は、現在の時刻から誕生日の時刻を引き算してあげて年(365 日)、日(24 時間)、時(60 分)、分(60 秒)で割ってあげた整数値(int)を計算すれば、誕生日が求まるような気がする。しかしすぐに気づくのだがこの方法だけではうるう年が勘案されていないから、正確な誕生日は求められない。単純に 365 で割ったのでは誤差が出てしまうのである。 そこでどうすればいいかというと、365 という値を 「1年の正確な日数」 にして割ればよい。1 年というのは正確には 365.2425 日らしいので、「生年月日から現在までの日数」 を 「365.2425」 で割れば、正確な年齢を求めることができる。
#!/usr/bin/perl -w

use Time::Local;

$year = 1980;
$mon = 8;
$day = 24;

my $birthday = timelocal(0, 0, 0, $day, $mon - 1, $year);
$age = int((time - $birthday) / 365.2425 / 24 / 60 / 60);

print $age;

1;
my $now = time; とすれば、$now に 「1970 年 1 月 1 日から現在までの秒数」 の値が入る。そこで、ある人の誕生日を 1970 年からの秒数としてデータベースに保存してある場合は、現在の時刻から誕生日の時刻を引き算してあげて年(365 日)、日(24 時間)、時(60 分)、分(60 秒)で割ってあげた整数値(int)を計算すれば、誕生日が求まるような気がする。しかしすぐに気づくのだがこの方法だけではうるう年が勘案されていないから、正確な誕生日は求められない。単純に 365 で割ったのでは誤差が出てしまうのである。 そこでどうすればいいかというと、365 という値を 「1年の正確な日数」 にして割ればよい。1 年というのは正確には 365.2425 日らしいので、「生年月日から現在までの日数」 を 「365.2425」 で割れば、正確な年齢を求めることができる。
#!/usr/bin/perl -w

use Time::Local;

$year = 1980;
$mon = 8;
$day = 24;

my $birthday = timelocal(0, 0, 0, $day, $mon - 1, $year);
$age = int((time - $birthday) / 365.2425 / 24 / 60 / 60);

print $age;

1;

Movable Type で、アーカイブのページにインデックス (目次) を作る

Movable Type というか、ブログは、実は当サイトのような技術解説のような内容のサイトにははっきり言って向かない。なぜなら技術文書では、時系列に日々のコンテンツを並べるという日記やニュース的なブログのスタイルよりも、後から参照されることを前提としたリファレンスとしての利用のされ方をするからである。技術は積み重ねでもあるので、簡単なものから難しいものへ、すなわちアーカイブでは最新順ではなく古い順から並んでいってもらった方が良い場合がある。そしてさらに技術文書のインデックス (目次) を作っておくと便利だろう。当サイトのアーカイブページのように、このような場合は Movable Type ではアーカイブ用のテンプレートを少し改造する。以下、青で示している部分が追加・変更点である。参考にして欲しい。
...

<div class="content">

<font color="blue"><a name="index"><h3>「<$MTArchiveTitle$>」のインデックス</h3></a>
<ol>
<MTEntries sort_order="ascend">
<li><a href="#<$MTEntryID pad="1"$>"><$MTEntryTitle$></a></li>
</MTEntries>
</ol>
</font>
<MTEntries <font color="blue">sort_order="ascend"></font>
<$MTEntryTrackbackData$>

<font color="blue"><a name="<$MTEntryID pad="1"$>"><h3 id="a<$MTEntryID pad="1"$>">
<$MTEntryTitle$>
</h3></a></font>

<$MTEntryBody$>

...

<font color="blue">| <a href="#index">Top ↑</a></font>
</p>

...
Movable Type というか、ブログは、実は当サイトのような技術解説のような内容のサイトにははっきり言って向かない。なぜなら技術文書では、時系列に日々のコンテンツを並べるという日記やニュース的なブログのスタイルよりも、後から参照されることを前提としたリファレンスとしての利用のされ方をするからである。技術は積み重ねでもあるので、簡単なものから難しいものへ、すなわちアーカイブでは最新順ではなく古い順から並んでいってもらった方が良い場合がある。そしてさらに技術文書のインデックス (目次) を作っておくと便利だろう。当サイトのアーカイブページのように、このような場合は Movable Type ではアーカイブ用のテンプレートを少し改造する。以下、青で示している部分が追加・変更点である。参考にして欲しい。
...

<div class="content">

<font color="blue"><a name="index"><h3>「<$MTArchiveTitle$>」のインデックス</h3></a>
<ol>
<MTEntries sort_order="ascend">
<li><a href="#<$MTEntryID pad="1"$>"><$MTEntryTitle$></a></li>
</MTEntries>
</ol>
</font>
<MTEntries <font color="blue">sort_order="ascend"></font>
<$MTEntryTrackbackData$>

<font color="blue"><a name="<$MTEntryID pad="1"$>"><h3 id="a<$MTEntryID pad="1"$>">
<$MTEntryTitle$>
</h3></a></font>

<$MTEntryBody$>

...

<font color="blue">| <a href="#index">Top ↑</a></font>
</p>

...