====== Perl - DBD::mysql ======
===== 概要 =====
[[http://search.cpan.org/~capttofu/DBD-mysql-4.018/lib/DBD/mysql.pm|CPAN - DBD::mysql]]
:!:**MySQLとDBIをあらかじめインストールしておくこと。**
CPAN経由でインストールする方法。
$ sudo cpan
cpan> install DBD::mysql
もし下記のように、
Library not loaded: libmysqlclient.18.dylib
libmysqlclient.18.dylib絡みのエラーが出た場合は以下を試して再実行。
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
===== 初期化 =====
#!/usr/bin/perl
BEGIN {
use File::Basename;
chdir dirname($0);
}
use strict;
use warnings;
use utf8;
use open ":utf8";
use open ":std";
use DBI;
# 初期設定
my $host = "127.0.0.1";
my $user = "hoge";
my $pass = "hoge";
my $database = "test_database";
my $table = "test_table";
# インスタンス変数の生成
my $dbh = "";
$dbh = "DBI:mysql:$database:$host";
$dbh = DBI->connect($dbh,$user,$pass,{"PrintError" => 0});
print "Error: $DBI::err $DBI::errstr\n" if $DBI::err;
# オプションの意味
#
# RaiseError
# 1(On)を指定すると、エラー発生時に例外 die() を発する。デフォルトは 0(Off)。
# PrintError
# 1(On)を指定すると、エラーコードを返すことに加えて警告を発する。デフォルトは 1(On)。
# AutoCommit
# 0(Off)を指定すると、明示的にコミットまたはロールバック出来るようになる。デフォルトは 1(On)。
#
# ※AutoCommit はストレージエンジンに InnoDB または BDB を使用しているテーブルに対してのみ使用出来る。
# 文字コードを UTF8 で扱うならこれを忘れずに。
$dbh->do("SET NAMES UTF8");
===== データの取得方法(配列編) =====
ここではデータを配列で取得するサンプルを紹介する。このやり方では SELECT したフィールド名の順番で配列に入ってくる。そのため何番目の添字にどのフィールドが入っているか自分で把握しておく必要がある。また、将来的にフィールドの追加等の変更があった場合、その都度添字を修正していく必要がある。
# test_tableからidが10以上のデータを取ってくる
my $sth = "";
$sth = $dbh->prepare("SELECT `name`,`mail`,`id` FROM $table WHERE `id`>=10");
$sth->execute;
print "Error: $DBI::err $DBI::errstr\n" if $DBI::err;
# 取得したデータを 1 レコードずつ配列に追加
my @tmp = ();
my @data = ();
while (@tmp = $sth->fetchrow_array) {
push @data, [ @tmp ];
}
$sth->finish if $sth;
# 取得したデータを出力
foreach (@data) {
utf8::decode($_->[0]);
print $_->[0], "\n";
}
===== データの取得方法(連想配列編) =====
ここではデータを連想配列で取得するサンプルを紹介する。\\
このやり方ではSELECTしたフィールド名をキーとした連想配列でデータを取得できる。\\
そのため配列の時のように何番目の添字にどのフィールドが入っているか等を把握しておく必要がなく、\\
将来的にフィールドの追加等の変更があった場合も臨機応変に対応出来るので個人的にはこちらがオススメ。
# test_tableからidが10以上のデータを取ってくる
my $sth = '';
$sth = $dbh->prepare("SELECT `name`,`mail`,`id` FROM $table WHERE `id`>=10");
$sth->execute;
print "Error: $DBI::err $DBI::errstr\n" if $DBI::err;
my @data = ();
while (my $ref = $sth->fetchrow_hashref) {
push @data, $ref;
}
$sth->finish if $sth;
foreach (@data) {
utf8::decode($_->{"name"});
print $_->{"name"}, "\n";
}