本文記錄 Windows 下使用 ActivePerl ppm 安裝 DBI 與 DBD::mysql,建立測試庫表,演示預處理批量插入與參數化查詢的完整流程,代碼採用嚴格的錯誤檢查模式,可直接用於生產腳本。
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)
);
mysql> INSERT INTO address VALUES (1, 'Nighthawk', 'nighthawk@163.net', 92384092);
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
# 連接數據庫(RaiseError 自動拋出異常)
my $dbh = DBI->connect('DBI:mysql:mydata', undef, undef, {
RaiseError => 1,
PrintError => 0,
AutoCommit => 1,
}) or die "連接失敗: $DBI::errstr";
print "開始批量插入...\n";
# 預處理插入語句
my $sth_ins = $dbh->prepare(q{
INSERT INTO address (id, name, email, telephone) VALUES (?, ?, ?, ?)
});
print "請輸入記錄 (id,name,email,tel),空行結束:\n";
while (my $input = ) {
chomp $input;
last unless $input;
my ($id, $name, $email, $tel) = split /,/, $input;
$sth_ins->execute($id, $name, $email, $tel);
print "已插入: $name\n";
}
print "\n按姓名查詢郵箱和電話:\n";
my $sth_sel = $dbh->prepare('SELECT * FROM address WHERE name = ?');
while (1) {
print "請輸入姓名: ";
my $name = ;
last unless defined $name;
chomp $name;
last unless $name;
$sth_sel->execute($name);
while (my @row = $sth_sel->fetchrow_array()) {
printf "Email: %-30s Tel: %s\n", $row[2], $row[3];
}
}
$dbh->disconnect;
print "完成。\n";
| 實踐 | 代碼體現 | 效果 |
|---|---|---|
| RaiseError | connect({RaiseError=>1}) | SQL 錯誤自動 die,無需手動檢查 |
| 預處理 | prepare + execute(@params) | 防 SQL 注入、重複執行高效 |
| 佔位符 ? | VALUES (?, ?, ?, ?) | 驅動層自動轉義、類型轉換 |
| fetchrow_array | @row = $sth->fetchrow_array() | 按列順序返回陣列,性能最佳 |
| 嚴格模式 | use strict; use warnings; | 編譯期捕獲變量拼寫錯誤 |
$dbh->{AutoCommit}=0; ... $dbh->commit();$sth->bind_param_array($idx, \@values); $sth->execute_array({ArrayTupleStatus=>\@status});