在使用数据库数据时,经常需要使用多条SQL语句才能得到相应的数据,无法在一条语句实现 或者实现起来非常复杂,而且直接在用SQL语句获取的数据可读性也比较差 。我们可以通过脚本语言结合web开发来查询和呈现数据。
以perl(本人比较熟悉perl)为例, 用perl 来写CGI脚本查询数据库并把数据呈现在网页上。
准备工作,确保Linux服务器上安装了DBD::mysql 和 CGI Perl 模块
1. perl DBI
连接参数变量
my $dsn="DBI:mysql:prictice";
my $user="root";
my $password="";
my %conn_attr=(RaiseError => 1, PrintError => 0, AutoCommit => 1);
my $dbh = DBI->connect ($dsn,$user,$password,\%conn_attr);
重点介绍一下 %conn_attr
RaisError:当某个DBI方法里出现错误时, DBI就会发出异常消息,默认时它会调用die()来显示错误并退出
PrintError: 当某个DBI方法里出现错误时, DBI就会调用warn()来显示错误信息但不会退出
AutoCommit: 脚本会在自动提交模式下进行事务处理
DBI->connect() 连接数据库并且返回数据库对象的句柄。
查询数据库:
my $sth = $dbh->prepare("select last_name,first_name,"
."city,state,street,email from member ORDER by last_name")
or die "cannot connect to database";
$sth->execute();
获取查询的数据:
while(my @ary = $sth->fetchrow_array())
{
my $delin = "";
for ( my $i =0; $i < @ary; $i++)
{
$ary[$i] = "NULL" if !defined ($ary[$i]);
print $delin, $ary[$i];
$delin = "\t";
}
print "\n";
}
逐行获取查询的数据。
用来取回数据行的DBI方法,除了上边的fetchrow_array(), 还有3中方法
fetchrow_array() 元素是数据行的值得数值
fetchrow_arrayref() 对于数据行的值构成的数组的yinyong
fetch() 与fetchrow_arrayref() 相同
fetchrow_hashref() 对由数据行的值构成的数组的引用,键是数据列的名字
获取晚数据后,释放掉SQL句柄和数据库句柄
$sth->finish();
$dbh->disconnect() or die"cannot disconnect from database";
2. Perl Web 开发
首先在脚本里面使用 CGI 模块
use CGI qw(:standard);
在CGI模块里面有相应的函数帮我打印出http的开头部分,不用我们自己来写开头部分。
print header();
print start_html(-title=>"member", -bgcolor=> "white");
上面我们从数据库里面获取的数据在网页中以表的形式呈现出来,对获取数据部分进行了修改,加入了html表格的信息。
while(my @ary = $sth->fetchrow_array())
{
@cell=();
my $delin = "";
for ( my $i =0; $i < @ary; $i++)
{
$ary[$i] = "NULL" if !defined ($ary[$i]);
push (@cell, td($ary[$i]));
}
push (@row, Tr(@cell));
}
3. 全部代码
下面是全部的代码,将脚本放到cgi-bin目录下面。就可以通过网页看到我们查询的数据。
#!/usr/bin/perl -w
#
use strict;
use diagnostics;
use DBI;
use CGI qw(:standard);
my $dsn="DBI:mysql:prictice";
my $user="root";
my $password="";
my %conn_attr=(RaiseError => 1, PrintError => 0, AutoCommit => 1);
my @cell;
my @row;
print header();
print start_html(-title=>"member", -bgcolor=> "white");
my $dbh = DBI->connect ($dsn,$user,$password,\%conn_attr);
my $sth = $dbh->prepare("select last_name,first_name,"
."city,state,street,email from member ORDER by last_name")
or die "cannot connect to database";
$sth->execute();
my @title=("last_name","first_name","city","state","street","email");
foreach my $t (@title)
{
push (@cell, th($t));
}
push (@row, Tr(@cell));
while(my @ary = $sth->fetchrow_array())
{
@cell=();
my $delin = "";
for ( my $i =0; $i < @ary; $i++)
{
$ary[$i] = "NULL" if !defined ($ary[$i]);
push (@cell, td($ary[$i]));
}
push (@row, Tr(@cell));
}
!DBI::err
or die "Error during retreive";
$sth->finish();
$dbh->disconnect() or die"cannot disconnect from database";
print table({-border => "1"}, @row);
print end_html();