基于Web的DBI开发

来源:互联网 发布:藤本壮介 house n知乎 编辑:程序博客网 时间:2024/05/16 17:30

在使用数据库数据时,经常需要使用多条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();


0 0
原创粉丝点击