完整記錄 Windows 下 ActiveState Perl 環境安裝 DBI 與 DBD::mysql 模組、建立測試資料庫/資料表、Perl 腳本實現資料插入與條件查詢的全流程。
DBI.zip,解壓至暫存目錄,DOS 視窗執行 ppm install DBI.ppd(若失敗,切換至 perl/bin 目錄執行)。DBD-MySQL.zip,同樣用 ppm 安裝。mysql> CREATE DATABASE mydata;
mysql> USE mydata;
mysql> CREATE TABLE address (
id INT(5) NOT NULL,
name VARCHAR(40) NOT NULL,
email VARCHAR(50) NOT NULL,
telephone INT(12) NULL
);
mysql> INSERT INTO address VALUES (1, 'Nighthawk', 'nighthawk@163.net', 92384092);
use DBI;
# 連接資料庫
my $dbh = DBI->connect('DBI:mysql:mydata') or die "無法連接: " . DBI->errstr;
# 準備插入語句(佔位符防注入)
my $sth = $dbh->prepare(q{
INSERT INTO address (id, name, email, telephone) VALUES (?, ?, ?, ?)
});
print "輸入記錄 (id,name,email,tel 逗號分隔),Enter 結束:\n";
while ($inputdata = <>) {
chomp $inputdata;
last unless $inputdata;
my ($id, $name, $email, $tel) = split(/,/, $inputdata);
$sth->execute($id, $name, $email, $tel);
}
# $dbh->commit; # 若關閉 AutoCommit
# 依姓名查詢 Email 與電話
$sth = $dbh->prepare('SELECT * FROM address WHERE name = ?') or die $dbh->errstr;
print "請輸入姓名查詢,Enter 結束:\n";
while ($inputname = <>) {
chomp $inputname;
last unless $inputname;
$sth->execute($inputname) or die "錯誤: " . $sth->errstr;
while (my @data = $sth->fetchrow_array()) {
print "Email: $data[2] Telephone: $data[3]\n";
}
}
$dbh->disconnect;
prepare + 佔位符 ? 防止 SQL 注入,提升重複執行效能。fetchrow_array 逐列取得陣列,索引 0 對應 id、1 對應 name 等。or die $dbh->errstr 模式,即時捕獲連線/執行異常。