23. 連接MySQL

本章介紹 Perl 搭配 MySQL 的方法

Perl 要搭配資料庫,必須安裝以下模組:

1. DBI : Perl 的 DataBase Interface 的簡稱,

請至 

ftp2.tnc.edu.tw/pub/unix/perl/CPAN/modules/by-module/DBI

抓取:DBI-1.37.tar.gz

tar xvzf DBI-1.37.tar.gz

cd DBI-1.37

perl Makefile.PL
make
make test
make install

2. Data-ShowTable

請至 

ftp2.tnc.edu.tw/pub/unix/perl/CPAN/modules/by-module/Data 

抓取:Data-ShowTable-3.3.tar.gz

安裝方法同 DBI。

3. DBD::資料庫driver

因為我想和 MySQL 搭配,所以必須安裝 DBD::mysql 的驅動程式

請至 

ftp2.tnc.edu.tw/pub/unix/perl/CPAN/modules/by-module/DBD

抓取:Msql-Mysql-modules-1.2219.tar.gz 或 DBD-mysql*.tar.gz

安裝方法同 DBI。

至此,Perl 即可和 MySQL 一起運作了! 注意:通常,若您使用的是套件版的 Perl/MySQL,通常系統中已有相關的 DBI/DBD 了,比如:perl-DBI-1.32*.rpm (即 DBI)/ perl-Mysql-1.22_19*.rpm(即 DBD::mysql),因此,您不一定要安裝上面這些 tarbll 模組。

#! /usr/bin/perl

use DBI;
use strict;

my $db="test";
my $host='localhost';
my $user='root';
my $password='ppp123';

my $dbh = DBI->connect("DBI:mysql:database=$db;host=$host",
                     $user, $password, {RaiseError => 1});

open(FHD, "stu.csv") or die;
while (my $line=<FHD>) {
	chomp($line);
    my ($f1, $f2, $f3, $f4, $f5)=split(/\,/,$line);
    if ($f1) {
 	my $q=qq[ INSERT INTO stu_table VALUES ("$f1", "$f2", "$f3", "$f4", "$f5") ];
    	my $sth=$dbh->prepare($q);
    	unless($sth->execute) {die "$!\n";}
    }
}
close(FHD);

實例:


我在 test 這個資料庫中開了一個 table 叫 aaa,其結構如下:

CREATE TABLE `aaa` (
  `no` varchar(10) NOT NULL default '',
  `name` varchar(12) NOT NULL default ''
)

其中 no 代表身份證字號,name 代表姓名。

我準備用它來儲存 studdemo.csv 中的學生身份證及姓名!

程式如下:

#! /usr/bin/perl

use DBI;
use strict;

my $db="test";
my $host='localhost';
my $user='root';
my $password='1234';

my $dbh = DBI->connect("DBI:mysql:database=$db;host=$host",
                     $user, $password, {RaiseError => 1});

open(FHD, "stu.csv") or die;
while (my $line=<FHD>) {
	chomp($line);
    my ($f1, $name, $f3, $f4, $f5, $f6, $f7, $pslno, $f9)=split(/\,/,$line);
    if ($f1) {
 	my $q=qq[ INSERT INTO aaa VALUES ("$pslno", "$name") ];
    	my $sth=$dbh->prepare($q);
    	unless($sth->execute) {die "$!\n";}
    }
}
close(FHD);