warning: Creating default object from empty value in /var/www/drupal-5.23/modules/taxonomy/taxonomy.module on line 1418.

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];

Java で、JDBC を使って MySQL にアクセスする方法

Java で MySQL にアクセスするには、MySQL 用の JDBC のドライバが必要である。このドライバは MySQL のサイトから入手できる (MySQL Connector/J とあるので、安定版または最新バージョンをダウンロードする)。 ダウンロードしたものを解凍すると、mysql-connector-java-x.x.xx-bin.jar というファイルがあるはずなので、これを (Linux の場合は) $JAVA_HOME/jre/lib/ext にコピーする。ここに JAR ファイルを置いておく限り、このドライバ (JAR ファイル) に対する CLASSPATH は特に設定する必要はない。 以下はデータベース中の users テーブルから、name と password という 2つのフィールドを読み出す例である (MySQLJDBCTest.java という名前で保存)。
import java.sql.*;

public class MySQLJDBCTest {

    public static void main(String[] args) {

        try {
            // ドライバをロード
            Class.forName("org.gjt.mm.mysql.Driver");

            // データベースへ接続
            String url = "jdbc:mysql:///データベース名?&user=ユーザー名&password=パスワード&"
                       + "useUnicode=true&characterEncoding=UTF-8";
            Connection con = DriverManager.getConnection(url);

            // SQL 文を生成
            Statement s = con.createStatement();
            String sql = "SELECT * FROM `users`";

            // クエリーを実行して結果セットを取得
            ResultSet rs = s.executeQuery(sql);

            // 検索された行数分ループ
            while(rs.next()){
                String name     = rs.getString("name");  // ユーザー名
                String password = rs.getString("pass");  // パスワード

                // 表示
System.out.println(name + " / " + password);
            }

            // データベースから切断
            s.close();
            con.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
コンパイル
# javac MySQLJDBCTest.java
実行
# java MySQLJDBCTest
Java で MySQL にアクセスするには、MySQL 用の JDBC のドライバが必要である。このドライバは MySQL のサイトから入手できる (MySQL Connector/J とあるので、安定版または最新バージョンをダウンロードする)。 ダウンロードしたものを解凍すると、mysql-connector-java-x.x.xx-bin.jar というファイルがあるはずなので、これを (Linux の場合は) $JAVA_HOME/jre/lib/ext にコピーする。ここに JAR ファイルを置いておく限り、このドライバ (JAR ファイル) に対する CLASSPATH は特に設定する必要はない。 以下はデータベース中の users テーブルから、name と password という 2つのフィールドを読み出す例である (MySQLJDBCTest.java という名前で保存)。
import java.sql.*;

public class MySQLJDBCTest {

    public static void main(String[] args) {

        try {
            // ドライバをロード
            Class.forName("org.gjt.mm.mysql.Driver");

            // データベースへ接続
            String url = "jdbc:mysql:///データベース名?&user=ユーザー名&password=パスワード&"
                       + "useUnicode=true&characterEncoding=UTF-8";
            Connection con = DriverManager.getConnection(url);

            // SQL 文を生成
            Statement s = con.createStatement();
            String sql = "SELECT * FROM `users`";

            // クエリーを実行して結果セットを取得
            ResultSet rs = s.executeQuery(sql);

            // 検索された行数分ループ
            while(rs.next()){
                String name     = rs.getString("name");  // ユーザー名
                String password = rs.getString("pass");  // パスワード

                // 表示
System.out.println(name + " / " + password);
            }

            // データベースから切断
            s.close();
            con.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
コンパイル
# javac MySQLJDBCTest.java
実行
# java MySQLJDBCTest

Linux に、phpMyAdmin 2.6.4 をインストールする方法

phpMyAdmin とは、MySQL の管理がブラウザベースで行える PHP で書かれたフロントエンド UI である。これを使うと MySQL の管理が格段に楽になる。 画面イメージはこんな感じ。 phpMyAdmin.jpg まずは Apache と PHP のインストールをする。 Apache と PHP のインストールが済んだら phpMyAdmin をダウンロードする。 ダウンロードしたファイルを解凍したら、Apache の htdocs のディレクトリにまるごとコピーする (このディレクトリは HTML のルートになるため、https://yourdomain.com/phpMyAdmin/ でアクセスできるように、ディレクトリ名も変更しておこう)。
# cp -R ./phpMyAdmin-2.7.0-pl2 /usr/local/apache2/htdocs
# mv /usr/local/apache2/htdocs/phpMyAdmin-2.7.0-pl2 /usr/local/apache2/htdocs/phpMyAdmin
ここで、phpMyAdmin 用のデータベースを作成する (MySQL が 4.1.2 以上の場合は以下のスクリプトを走らせる)。
# mysql -u root -p < create_tables_mysql_4_1_2+.sql
次に、/usr/local/apache2/htdocs/phpMyAdmin/config.default.php を config.inc.php としてコピーする (ini ではなく、inc です)。
# cd /usr/local/apache2/htdocs/phpMyAdmin
# cp config.default.php config.inc.php
phpMyAdmin から MySQL にアクセスできるように、MySQL に config.inc.php の中のユーザー名とパスワードを設定する。
<?php

$cfg
['Servers'][$i]['user']          = 'root'; ←ここに MySQL がアクセスできるユーザー名を記述 (本当は root じゃない方がいい)
$cfg['Servers'][$i]['password']      = 'your_password'; ←上のユーザーに対するパスワードを記述

?>
ブラウザから phpMyAdmin にアクセスする。
phpMyAdmin とは、MySQL の管理がブラウザベースで行える PHP で書かれたフロントエンド UI である。これを使うと MySQL の管理が格段に楽になる。 画面イメージはこんな感じ。 phpMyAdmin.jpg まずは Apache と PHP のインストールをする。 Apache と PHP のインストールが済んだら phpMyAdmin をダウンロードする。 ダウンロードしたファイルを解凍したら、Apache の htdocs のディレクトリにまるごとコピーする (このディレクトリは HTML のルートになるため、https://yourdomain.com/phpMyAdmin/ でアクセスできるように、ディレクトリ名も変更しておこう)。
# cp -R ./phpMyAdmin-2.7.0-pl2 /usr/local/apache2/htdocs
# mv /usr/local/apache2/htdocs/phpMyAdmin-2.7.0-pl2 /usr/local/apache2/htdocs/phpMyAdmin
ここで、phpMyAdmin 用のデータベースを作成する (MySQL が 4.1.2 以上の場合は以下のスクリプトを走らせる)。
# mysql -u root -p < create_tables_mysql_4_1_2+.sql
次に、/usr/local/apache2/htdocs/phpMyAdmin/config.default.php を config.inc.php としてコピーする (ini ではなく、inc です)。
# cd /usr/local/apache2/htdocs/phpMyAdmin
# cp config.default.php config.inc.php
phpMyAdmin から MySQL にアクセスできるように、MySQL に config.inc.php の中のユーザー名とパスワードを設定する。
<?php

$cfg
['Servers'][$i]['user']          = 'root'; ←ここに MySQL がアクセスできるユーザー名を記述 (本当は root じゃない方がいい)
$cfg['Servers'][$i]['password']      = 'your_password'; ←上のユーザーに対するパスワードを記述

?>
ブラウザから phpMyAdmin にアクセスする。

Perl で、データベースを使う

Perl で、データベース (ここでは MySQL を使うときの基本) をおさらいしよう。Perl でのデータベースへのアクセスは、DBI モジュールを使う。このモジュールは XS で書かれているため、Linux などにインストールするには gcc のコンパイル環境が必要である。レンタルサーバは予め DBI がインストールされているところを選んでおけば間違いないが、そうでない場合は自力でインストールする必要があるため注意しよう。 さて、以下はデータベース中のテーブルのフィールドが id、name、value となっていてそれらを扱う場合の例である。最初のデータベースの定義のところで、mysql のところを Pg とするだけで PostgreSQL に対応できる (ようである)。 スクリプト中ではデータベースのテーブルを変数でマッピング (定義) している (ハッシュを使う方法もあると思うのでもっといい方法があったら教えて欲しい)。こうしておくと後でテーブルの定義を変更したときなど柔軟に対応できるだろう。 foreach の中の「$_」は、Perl では「現在処理中のデータ」であり、
foreach my $data (@$DATA) {
    $id    $data->$T_FIELD[$T_ID];
    $name  $data->$T_FIELD[$T_NAME];
    $value $data->$T_FIELD[$T_VALUE];
}
などするのと同義である。 DBI->selectrow_arrayref は、selectrow_array と似ているが、結果をリファレンスで複数行返すところが異なる。リファレンスなのでその後の処理も高速である (と思われる)。 使用するモジュール
use DBI;
#!/usr/bin/perl

use DBI;

# データベースの設定
our $DB_NAME     = 'DBI:mysql:your_database_name';
our $DB_USERNAME = 'your_username';
our $DB_PASSWORD = 'your_password';
our $DB_TABLE    = 'your_table_name';

# テーブルの定義
our $T_ID    = 0;
our $T_NAME  = 1;
our $T_VALUE = 2;

our @T_FIELD = (
    '`id`',
    '`name`',
    '`value`'
);

# データベースに接続
my $DB = DBI->connect($DB_NAME, $DB_USERNAME, $DB_PASSWORD)
       || die "Connection error";

# データを検索
my $DATA = $DB->selectall_arrayref(
                            qq|SELECT * FROM `$DB_TABLE` |
                          . qq|WHERE $T_FIELD[$T_ID]='ここに検索したい ID を書く'|
                        );

# データがあれば
if(@$DATA)    {

    my $id, $name;

    # データを出力
    foreach (@$DATA)    {

        $id    = $_->[$T_ID   ];    # $T_ID    = 0
        $name  = $_->[$T_NAME ];    # $T_NAME  = 1
        $value = $_->[$T_VALUE];    # $T_VALUE = 2

        print "$id / $name / $value\n";      # データを表示
    }
}

# データベースの接続を切断
$DB->disconnect();

1;
Perl で、データベース (ここでは MySQL を使うときの基本) をおさらいしよう。Perl でのデータベースへのアクセスは、DBI モジュールを使う。このモジュールは XS で書かれているため、Linux などにインストールするには gcc のコンパイル環境が必要である。レンタルサーバは予め DBI がインストールされているところを選んでおけば間違いないが、そうでない場合は自力でインストールする必要があるため注意しよう。 さて、以下はデータベース中のテーブルのフィールドが id、name、value となっていてそれらを扱う場合の例である。最初のデータベースの定義のところで、mysql のところを Pg とするだけで PostgreSQL に対応できる (ようである)。 スクリプト中ではデータベースのテーブルを変数でマッピング (定義) している (ハッシュを使う方法もあると思うのでもっといい方法があったら教えて欲しい)。こうしておくと後でテーブルの定義を変更したときなど柔軟に対応できるだろう。 foreach の中の「$_」は、Perl では「現在処理中のデータ」であり、
foreach my $data (@$DATA) {
    $id    $data->$T_FIELD[$T_ID];
    $name  $data->$T_FIELD[$T_NAME];
    $value $data->$T_FIELD[$T_VALUE];
}
などするのと同義である。 DBI->selectrow_arrayref は、selectrow_array と似ているが、結果をリファレンスで複数行返すところが異なる。リファレンスなのでその後の処理も高速である (と思われる)。 使用するモジュール
use DBI;
#!/usr/bin/perl

use DBI;

# データベースの設定
our $DB_NAME     = 'DBI:mysql:your_database_name';
our $DB_USERNAME = 'your_username';
our $DB_PASSWORD = 'your_password';
our $DB_TABLE    = 'your_table_name';

# テーブルの定義
our $T_ID    = 0;
our $T_NAME  = 1;
our $T_VALUE = 2;

our @T_FIELD = (
    '`id`',
    '`name`',
    '`value`'
);

# データベースに接続
my $DB = DBI->connect($DB_NAME, $DB_USERNAME, $DB_PASSWORD)
       || die "Connection error";

# データを検索
my $DATA = $DB->selectall_arrayref(
                            qq|SELECT * FROM `$DB_TABLE` |
                          . qq|WHERE $T_FIELD[$T_ID]='ここに検索したい ID を書く'|
                        );

# データがあれば
if(@$DATA)    {

    my $id, $name;

    # データを出力
    foreach (@$DATA)    {

        $id    = $_->[$T_ID   ];    # $T_ID    = 0
        $name  = $_->[$T_NAME ];    # $T_NAME  = 1
        $value = $_->[$T_VALUE];    # $T_VALUE = 2

        print "$id / $name / $value\n";      # データを表示
    }
}

# データベースの接続を切断
$DB->disconnect();

1;