基于Web的DBI开发

在使用数据库数据时,经常需要使用多条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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值