- 浏览: 114610 次
- 性别:
- 来自: 山东
文章分类
最新评论
-
ly5188:
大虾,例子少了些东西,
javax.mail.Messagin ...
支持邮件群发,多附件发送的javaMail代码 -
DepthJava:
请问楼主,你的就能全部解析?
目前还没找到完全解析的方法,很多 ...
javamail接收邮件的bean,可以正确的解析中文(转)(一)
例子:
#!/usr/bin/perl -w
use DBI;
#此方法创建数据库只执行一条语句
#my $dbh=DBI->connect("DBI:mysql:mysql","root","aqcxxj321");
#$dbh->func('createdb', "Lxp", 'admin');
#$dbh->func("dropdb",'Lxp2', 'admin');
#查询子类函数:DBI->available_drivers
#foreach(DBI->available_drivers){print;}
#
#数据库方法调用:DBI -> install_driver
my $drh=DBI->install_driver("mysql");
#$drh->func("createdb","Lxp" ,"localhost","root","aqcxxj321","admin");
#$drh->func("createdb","Lxp1" ,"localhost","root","aqcxxj321","admin");
#$drh->func("createdb","Lxp2" ,"localhost","root","aqcxxj321","admin");
$drh->func("dropdb", "Lxp","localhost","root","aqcxxj321",'admin');
$drh->func("dropdb", "Lxp1","localhost","root","aqcxxj321",'admin');
$drh->func("dropdb", "Lxp2","localhost","root","aqcxxj321",'admin');
perl DBI使用详解
---------------------------------------------------------------------
use DBI;
---------------------------------------------------------------------
注意:特定的DBD 级的模块不需要包括use 行,因为在与服务器进行连接时, DBI 负责激活相应的模块,比如DBD::mysql。
一、一些变量表达的常用意思
$drh表示驱动程序对象的句柄
$dbh表示针对一个数据库对象的句柄
$sth表示针对一个语句或者一个查询对象的句柄
$fh表示一个打开文件的句柄
$h表示一个通用的句柄,其含意有赖于上下文
$rc表示操作代码返回的布什值(真或假)
$rv表示操作代码返回的整数值
$rows表示操作代码返回的行数值
$str表示操作代码返回的字符串
@ary表示查询返回的一行值的数组(列表)
@row_ary表示从查询中返回的一个行的数组
二、关于DBI的一些驱动对象方法:
查询子类函数:DBI->available_drivers
比如:---------------------------------------------------------------
foreach(DBI->available_drivers){print;}
---------------------------------------------------------------------
结果:DBI::mysql
数据源函数:DBI->data_sources
比如:---------------------------------------------------------------
foreach(DBI->data_sources){print;}
---------------------------------------------------------------------
结果:对于大多数正确的驱动子类来说,返回值一般为空,对于不能连接、用户名或密码为空的驱动子类,返回值不为空
数据库方法调用:DBI -> install_driver
比如:
---------------------------------------------------------------------
my $drh = DBI -> install_driver("mysql");
---------------------------------------------------------------------
结果:提供驱动子类的句柄,可以使用$drh -> func ("createdb", $db_name, $db_host, $username, $password, "admin");来创建数据库
数据库连接:DBI -> connect
比如:---------------------------------------------------------------
my $dsn = "dbi:mysql:database=${db_name};hostname=${db_host};mysql_socket=${db_sock};port=${db_port};mysql_compression=1;mysql_read_default_file=$ENV{HOME}/.my.cnf;mysql_read_default_group=client";
my %attr = ( PrintError => 0, RaiseError => 0);
my $dbh = DBI -> connect ($dsn, $user_name, $password, [,\%attr]);
---------------------------------------------------------------------结果:返回值是针对一个数据库的句柄,提供数据库连接功能,关闭连接使用$dbh -> disconnect,其中很多参数可以省略,包括数据库名称。
三、数据库句柄方法的调用
1,do方法:
my $rows = $dbh -> do ($query[, \%attr[, @bind_values]]);
语法解释:准备并运行$query表示的查询。返回值为受影响的行数—如果不知道行数,则返回-1,如果出现错误,则返回undef。
如果受影响的行数为0,则返回值为字符串“0E0”,作为数值它与0等价,但在判断时它为真。
一般用于非SELECT查询,不检索行的语句,如DELETE、INSERT、REPLACE或UPDATE,主要使用do()。
如果对SELECT语句使用它,则不会获得返回的语句句柄,也不能提取任何行。
当语句包括占位符(在此查询字符串内部由‘?’字母表示)时,使用@bind_values。
@bind_values为给占位符赋值的值的列表。它必须和占位符有一样多的值。如果只指定赋值
的值,但没有指定属性,则将undef作为\%attr参数的值来传递。
与prepare和execute结合使用的功能基本相同。
2,ping方法:
my $rc = $dbh -> ping ();
语法解释:检查与服务器的连接是否仍然有效,并相应返回真或假。
3,prepare方法:
my $sth = $dbh -> prepare ($query[, \%attr]);
语法解释:为以后的执行所准备的由$query表示的查询,并返回一个语句句柄。返回的句柄可用于execute(),以便执行该查询。
4,quote方法:
my $str = $dbh -> quote ($value[, $data_type]);
语法解释:处理字符串以实现SQL语句中特定字符的引用和转义,以便在执行这条语句时,该字符串不引起语法错误。
例如,“‘I \’m happy’”(没有双引号)返回字符串“I ’m happy”。
如果$value为undef,则它返回字符串“NULL”(没有引号)。
一般来说,$data_type参数不是必需的,因为MySQL将查询中指定为字符串的值自动地转换为其他类型。
可以将$data_type指定为特殊类型值的提示————例如,DBI::SQL_INTEGER指出$value表示一个整数。
不要使用具有打算利用占位符插入到查询中的值的quote()。DBI会自动引用这样的值。
5,selectall_arrayref方法
my $ary_ref = $dbh -> selectall_arrayref ($query[, \%attr[, @bind_values]]);
语法解释:执行由$query指定的查询,并结合prepare()、execute()和fetchall_arrayref()返回结果。如果出现错误,则返回undef。
如果$query参数是以前准备的语句,则省略prepare()步骤。
@bind_values参数和do()方法中的该参数具有同样的意义。
比如:
---------------------------------------------------------------------
# fetch all rows into a reference to an array of references
my $matrix_ref = $dbh -> selectall_arrayref ($query);
# determine dimensions of matrix
my $rows = (!defined ($matrix_ref) ? 0 : scalar (@{$matrix_ref}));
my $cols = ($rows == 0 ? 0 : scalar (@{$matrix_ref->[0]}));
for (my $i = 0; $i < $rows; $i ++) # print each row
{
my $delim = "";
for (my $j = 0; $j < $cols; $j ++)
{
$matrix_ref -> [$i][$j] = "" if !defined ($matrix_ref -> [$i][$j]); # NULL?
print $delim . $matrix_ref -> [$i][$j];
$delim = ",";
}
print "\n";
}
---------------------------------------------------------------------
6,selectcol_arrayref方法
my @ary_ref = $dbh -> selectcol_arrayref ($query[, \%attr[, @bind_values]]);
语法解释:执行由$query指定的查询,并通过组合prepare()和execute()返回结果的第一列。返回结果作为对含有每行第一列的数组的引用。如果出现错误,则返回undef。
如果$query参数是以前准备的语句,则省略prepare()步骤。
@bind_values参数和do()方法中的该参数具有同样的意义。
7,selectrow_array方法
my @row_ary = $dbh -> selectrow_array ($query[, \%attr[, @bind_values]]);
语法解释:执行由$query指定的查询,并结合prepare()、execute()和fetchall_arrayref()返回结果的第一行。
如果参数$query是以前准备的语句,则省略prepare()步骤。
如果在列表的上下文中调用时,selectrow_array()返回代表行值的数组,或者,如果出现错误,则返回空数组。在标量的上下文中,selectrow_array()返回这个数组的第一个元素的值(行的第一列)。如果出现错误,则返回undef。
@bind_values参数和do()方法中的相应参数具有同样的意义。
四、语句句柄方法的调用
1,bind_col方法
my $rc = $sth -> bind_col($col_num, \$var_to_bind);
将SELECT查询的给定列与Perl变量相联系,将它作为引用传递。$col_num的范围为1到查询选择的列数。每次提取行时,这个变量用列值自动更新。
bind_col()应该在execute()之前及prepare()之后调用。
如果列号范围不在1到查询选择的列数之间,则bind_col()返回假。
2,bind_columns方法
my $rc = $sth -> bind_columns (\$var_to_bind1, \$var_to_bind2, ...);
将一系列变量与由准备好的SELECT 语句返回的列相联系,请参阅bind_col()方法的说明。
如果引用的数量与查询选择的列数不匹配,则bind_columns() 返回假。
3,bind_param方法
my $rv = $sth -> bind_param ($n, $value[, \%attr]);
my $rv = $sth -> bind_param ($n, $value[, $bind_type]);
在一个语句中,将值与占位符‘?’相联系。应该在execute()之前及prepare()之后调用它。
$n指定了占位符的数量,应该限定$value值,而且该值范围应该为1到占位符的数量。为了限定NULL值,可传递undef。
参数\%attr或者$bind_type可作为要联系的值的类型提示。
4,dump_results方法
my $rows = $sth -> dump_results ([$maxlen[, $line_sep[, $field_sep[, $fh]]]]);
从语句句柄$sth 中提取所有的行,通过调用实用函数DBI::neat_list()将他们格式化,并将他们打印到给定的文件句柄中。返回提取的行数
$maxlen、$line_sep、$field_sep和$fh的缺省值分别为35、“\n”、“,”和STDOUT。
5,execute方法:
my $rows = $sth -> execute ([@bind_values]);
执行准备好的语句。如果该语句执行成功,则返回真,如果发生错误,则返回undef。
参数@bind_values与do()方法中的有相同的意义。
6,fetchall_arrayref方法:
my $tbl_ary_ref = $sth -> fetchall_arrayref ([$slice_array_ref]);
从语句句柄$sth 中提取所有行,并返回数组的引用,这个数组包含提取的每行的一个引用。数组中每个引用的意义取决于所传递的参数。没有参数或者只有数组部分引用参数,则$tbl_ary_ref 的每个元素都是包括结果集的一行值的数组引用。对于散列部分的引用参数,$tbl_ary_ref 的每个元素就是对包含结果集的一行值的散列引用。
7,fetchrow_array方法:
my @ary_ref = $sth -> fetchrow_array ();
当在一个列表的范围中调用时,fetchrow_array()返回包含结果集下一行列值的数组,如果不再有行或者发生错误,则fetchrow_array()返回一个空数组。在标量上下文中,fetchrow_array()返回数组第一个元素的值(那就是说,行的第一列),如果不再有行或者发生错误,则fetchrow_array()返回undef。
通过检查$sth->err(),可以将结果集正常结束与出现错误区分开来。零值表明已经无错误地到达了结果集的末尾。
一般与while使用。
比如:
---------------------------------------------------------------------
while (my @ary = $sth -> fetchrow_array ())
{
@ary = map { defined ($_) ? $_ : "NULL" } @ary;
print join (",", @ary) . "\n";
}
---------------------------------------------------------------------
8,fetch或fetchrow_arrayref方法
my @ary_ref = $sth -> fetchrow_arrayref ();
返回一个包括结果集的下一行列值的数组引用。如果不再有行或者发生错误,则返回undef。
通过检查$sth->err(),可以将结果集正常结束与出现错误区分开来。零值表明已经无错误地到达了结果集的末尾。
一般与while使用。
比如:
-----------------------------------------------------------------------------------
my @matrix = (); # array of array references
while (my @ary = $sth -> fetchrow_array ()) # fetch each row
{
push (@matrix, [ @ary ]); # save reference to just-fetched row
}
# determine dimensions of matrix
my $rows = scalar (@matrix);
my $cols = ($rows == 0 ? 0 : scalar (@{$matrix[0]}));
for (my $i = 0; $i < $rows; $i++) # print each row
{
my $delim = "";
for (my $j = 0; $j < $cols; $j++)
{
$matrix[$i][$j] = "" if !defined ($matrix[$i][$j]); # NULL value?
print $delim . $matrix[$i][$j];
$delim = ",";
}
print "\n";
}
---------------------------------------------------------------------
9,fetchrow_hashref方法
my $hash_ref = $sth -> fetchrow_hashref ([$name]);
返回包括结果集的下一行列值的散列引用。如果不再有行或者发生错误,则返回undef。散列是索引值是列名称,散列的元素是列值。
对于散列的关键值,指定变量$name说明使用的语句句柄属性。缺省值为“NAME”。这可能导致查询中的列名称不区分大小写的问题,但是散列键是区分大小写的。要强迫散列键为大写字母或者小写字母,可以指定“NAME_lc”或“NAME_uc”的$name值。
通过检查$sth->err(),可以将结果集正常结束与出现错误区分开来。零值表明已经无错误地到达了结果集的末尾。
一般与while使用。
比如:
---------------------------------------------------------------------
while (my $hash_ref = $sth -> fetchrow_hashref ())
{
my $delim = "";
foreach my $key (keys (%{$hash_ref}))
{
$hash_ref -> {$key} = "" if !defined ($hash_ref->{$key}); # NULL value?
print $delim . $hash_ref -> {$key};
$delim = ",";
}
print "\n";
}
---------------------------------------------------------------------
10,finish方法
my $rc = $sth -> finish();
释放有关语句句柄的任何资源。通常不必显式地调用这个方法,但是如果只提取部分结果集,则调用finish()使DBI了解已经提取了数据。调用finish()可能使语句属性无效,最好在调用execute()之后立即访问它们。
11,rows方法
my $rv = $sth -> rows();
返回与$sth相关的语句所作用的行数,如果发生错误,则返回-1。使用这个方法主要用于不返回行的语句。对于SELECT语句,不能依赖rows()方法在提取行时统计行数。
五、通用句柄方法
下面的方法不是专用于特定类型的句柄的。可用驱动程序、数据库或语句句柄来调用它们。
1,$h -> err()
返回最近调用的驱动程序操作的数字错误代码。0表示没有错误。
2,$h -> errstr()
返回最近调用的驱动程序操作的字符串错误消息。空字符串表示没有错误。
3,DBI -> trace($trace_level[, $trace_filename]);
$h -> trace($trace_level[, $trace_filename]);
设置跟踪级别。跟踪提供有关DBI操作的信息。跟踪级别的范围从0(关闭)到9(最多信息)。通过作为DBI类方法或独立的句柄调用跟踪,跟踪可以启用脚本内部的所有DBI操作:
DBI->trace(2);打开脚本跟踪
$sth->trace(2);打开句柄跟踪
通过设置DBI_TRACE环境变量,也可以对运行的所有DBI脚本在全局级别启用跟踪。缺省时,跟踪输出到STDERR.。提供的$filename参数可以直接将结果输出到不同的文件。将输出添加到这个文件的任何已有内容后面。
每个跟踪调用导致来自所有跟踪的句柄中的输出进入相同的文件。如果文件已命名,则所有跟踪就输出到那个文件。如果没有命名的文件,则所有跟踪输出到STDERR。
4,DBI -> trace_msg($str[, $min_level])
$h -> trace_msg($str[, $min_level])
如果跟踪这个句柄或如果在DBI级启用跟踪,则编写这个跟踪输出的消息。如果启用DBI级的跟踪,则trace_msg()可以作为DBI->trace_msg()来调用,编写消息。只有在跟踪级别至少为这个级别时,才可以提供$min_level 参数来指定应该编写的消息。
六、MySQL 的特定管理方法
DBI 作为直接访问驱动程序的手段所供的func() 函数方法
---------------------------------------------------------------------
$rc = $drh -> func("createdb", $dbname, [host, user, password,], 'admin');
$rc = $drh -> func("dropdb", $dbname, [host, user, password,], 'admin');
$rc = $drh -> func("shutdown", [host, user, password,], 'admin');
$rc = $drh -> func("reload", [host, user, password,], 'admin');
---------------------------------------------------------------------
or
---------------------------------------------------------------------
$rc = $dbh -> func("createdb", $dbname, 'admin');
$rc = $dbh -> func("dropdb", $dbname, 'admin');
$rc = $dbh -> func("shutdown", 'admin');
$rc = $dbh -> func("reload", 'admin');
---------------------------------------------------------------------通过驱动程序句柄或通过数据库句柄访问func()方法。驱动程序句柄与打开的连接无关,所以,如果以这种方式访问func(),则必须提供允许这个方法创建连接的主机名称、用户名称和口令的参数。如果用数据库句柄访问func(),则不需要那些参数。如果需要,可以像下面这样获得驱动程序句柄:
my $drh = DBI -> install_driver(“mysql”);#(“mysql”mustbelowercase)
createdb创建由$db_name指定的数据库。要这样做,必须对该数据库拥有CREAT权限。
dropdb删除由$db_name指定的数据库。要这样做,必须对该数据库拥有DROP权限。当心,如果删除了一个数据库,则它将会消失,且再也不能恢复。
shutdown关闭服务器。必须具有SHUTDOWN权限。
reload告诉服务器重新加载授权表。如果直接使用DELETE、INSERT或UPDATE而不是使用GRANT或REVOKE来修改这个授权表的内容,则这是必需的。要使用reload,必须具有RELOAD权限。
七、DBI 环境变量
DBI考虑了几个环境变量,如表G-3所示。除了DBI_TRACE之外,所有变量都由connect()方法使用。DBI_TRACE由trace()方法使用。
DBI_DRIVER:DBI级的驱动程序名(MySQL的“mysql”)
DBI_DSN:数据源名
DBI_PASS:口令
DBI_TRACE:跟踪级别和/或跟踪输出文件
DBI_USER:用户名称
---------------------------------------------------------------------$errno = $dbh->{'mysql_errno'};
$error = $dbh->{'mysql_error};
$info = $dbh->{'mysql_hostinfo'};
$info = $dbh->{'mysql_info'};
$insertid = $dbh->{'mysql_insertid'};
$info = $dbh->{'mysql_protoinfo'};
$info = $dbh->{'mysql_serverinfo'};
$info = $dbh->{'mysql_stat'};
$threadId = $dbh->{'mysql_thread_id'};
---------------------------------------------------------------------
八、一个例子
---------------------------------------------------------------------
#!/usr/bin/perl -w
use CGI::Carp "fatalsToBrowser";
use strict;
use warnings;
use DBI;
use CGI qw (:standard escapeHTML escape);
my ($driver_name, $db_name, $db_host, $db_sock, $db_port, $db_user, $db_pswd, $dsn);
$driver_name = 'mysql';
$db_name = 'mydata';
$db_host = 'localhost';
$db_sock = '/tmp/mysql.sock';
$db_port = '3306';
$db_user = 'cnangel';
$db_pswd = 'cnangel';
$dsn = "dbi:mysql:database=${db_name};hostname=${db_host};mysql_socket=${db_sock};port=${db_port}";
# ... set up connection to database (not shown) ...
my $dbh = DBI -> connect ($dsn, $db_user, $db_pswd,
{ RaiseError => 1, PrintError => 0 });
# put out initial part of page
my $title = "$db_name Database Browser";
print header ();
print start_html (-title => $title, -bgcolor => "white");
print h1 ($title);
# parameters to look for in URL
my $tbl_name = param ("tbl_name");
my $sort_col = param ("sort_col");
# If $tbl_name has no value, display a clickable list of tables.
# Otherwise, display contents of the given table. $sort_col, if
# set, indicates which column to sort by.
!defined ($tbl_name) ? display_table_names ($dbh, $db_name) : display_table_contents ($dbh, $tbl_name, $sort_col);
print end_html ();
sub display_table_names
{
my ($dbh, $db_name) = @_;
print p ("Select a table by clicking on its name:");
# retrieve reference to single-column array of table names
my $ary_ref = $dbh -> selectcol_arrayref (qq{ SHOW TABLES FROM $db_name });
# Construct a bullet list using the ul() (unordered list) and
# li() (list item) functions. Each item is a hyperlink that
# re-invokes the script to display a particular table.
my @item;
foreach my $tbl_name (@{$ary_ref})
{
my $url = sprintf ("%s?tbl_name=%s", url (), escape ($tbl_name));
my $link = a ({-href => $url}, escapeHTML ($tbl_name));
push (@item, li ($link));
}
print ul (@item);
}
sub display_table_contents
{
my ($dbh, $tbl_name, $sort_col) = @_;
my @rows;
my @cells;
# if sort column not specified, use first column
$sort_col = "1" if !defined ($sort_col);
# present a link that returns user to table list page
print p (a ({-href => url ()}, "Show Table List"));
print p (strong ("Contents of $tbl_name table:"));
my $sth = $dbh -> prepare (qq{
SELECT * FROM $tbl_name ORDER BY $sort_col
LIMIT 200
});
$sth -> execute ();
# Use the names of the columns in the database table as the
# headings in an HTML table. Make each name a hyperlink that
# causes the script to be reinvoked to redisplay the table,
# sorted by the named column.
foreach my $col_name (@{$sth -> {NAME}})
{
my $url = sprintf ("%s?tbl_name=%s;sort_col=%s",
url (),
escape ($tbl_name),
escape ($col_name));
my $link = a ({-href => $url}, escapeHTML ($col_name));
push (@cells, th ($link));
}
push (@rows, Tr (@cells));
# display table rows
while (my @ary = $sth -> fetchrow_array ())
{
@cells = ();
foreach my $val (@ary)
{
# display value if non-empty, else display non-breaking space
if (defined ($val) && $val ne "")
{
$val = escapeHTML ($val);
}
else
{
$val = " ";
}
push (@cells, td ($val));
}
push (@rows, Tr (@cells));
}
# display table with a border
print table ({-border => "1"}, @rows);
}
#!/usr/bin/perl -w
use DBI;
#此方法创建数据库只执行一条语句
#my $dbh=DBI->connect("DBI:mysql:mysql","root","aqcxxj321");
#$dbh->func('createdb', "Lxp", 'admin');
#$dbh->func("dropdb",'Lxp2', 'admin');
#查询子类函数:DBI->available_drivers
#foreach(DBI->available_drivers){print;}
#
#数据库方法调用:DBI -> install_driver
my $drh=DBI->install_driver("mysql");
#$drh->func("createdb","Lxp" ,"localhost","root","aqcxxj321","admin");
#$drh->func("createdb","Lxp1" ,"localhost","root","aqcxxj321","admin");
#$drh->func("createdb","Lxp2" ,"localhost","root","aqcxxj321","admin");
$drh->func("dropdb", "Lxp","localhost","root","aqcxxj321",'admin');
$drh->func("dropdb", "Lxp1","localhost","root","aqcxxj321",'admin');
$drh->func("dropdb", "Lxp2","localhost","root","aqcxxj321",'admin');
perl DBI使用详解
---------------------------------------------------------------------
use DBI;
---------------------------------------------------------------------
注意:特定的DBD 级的模块不需要包括use 行,因为在与服务器进行连接时, DBI 负责激活相应的模块,比如DBD::mysql。
一、一些变量表达的常用意思
$drh表示驱动程序对象的句柄
$dbh表示针对一个数据库对象的句柄
$sth表示针对一个语句或者一个查询对象的句柄
$fh表示一个打开文件的句柄
$h表示一个通用的句柄,其含意有赖于上下文
$rc表示操作代码返回的布什值(真或假)
$rv表示操作代码返回的整数值
$rows表示操作代码返回的行数值
$str表示操作代码返回的字符串
@ary表示查询返回的一行值的数组(列表)
@row_ary表示从查询中返回的一个行的数组
二、关于DBI的一些驱动对象方法:
查询子类函数:DBI->available_drivers
比如:---------------------------------------------------------------
foreach(DBI->available_drivers){print;}
---------------------------------------------------------------------
结果:DBI::mysql
数据源函数:DBI->data_sources
比如:---------------------------------------------------------------
foreach(DBI->data_sources){print;}
---------------------------------------------------------------------
结果:对于大多数正确的驱动子类来说,返回值一般为空,对于不能连接、用户名或密码为空的驱动子类,返回值不为空
数据库方法调用:DBI -> install_driver
比如:
---------------------------------------------------------------------
my $drh = DBI -> install_driver("mysql");
---------------------------------------------------------------------
结果:提供驱动子类的句柄,可以使用$drh -> func ("createdb", $db_name, $db_host, $username, $password, "admin");来创建数据库
数据库连接:DBI -> connect
比如:---------------------------------------------------------------
my $dsn = "dbi:mysql:database=${db_name};hostname=${db_host};mysql_socket=${db_sock};port=${db_port};mysql_compression=1;mysql_read_default_file=$ENV{HOME}/.my.cnf;mysql_read_default_group=client";
my %attr = ( PrintError => 0, RaiseError => 0);
my $dbh = DBI -> connect ($dsn, $user_name, $password, [,\%attr]);
---------------------------------------------------------------------结果:返回值是针对一个数据库的句柄,提供数据库连接功能,关闭连接使用$dbh -> disconnect,其中很多参数可以省略,包括数据库名称。
三、数据库句柄方法的调用
1,do方法:
my $rows = $dbh -> do ($query[, \%attr[, @bind_values]]);
语法解释:准备并运行$query表示的查询。返回值为受影响的行数—如果不知道行数,则返回-1,如果出现错误,则返回undef。
如果受影响的行数为0,则返回值为字符串“0E0”,作为数值它与0等价,但在判断时它为真。
一般用于非SELECT查询,不检索行的语句,如DELETE、INSERT、REPLACE或UPDATE,主要使用do()。
如果对SELECT语句使用它,则不会获得返回的语句句柄,也不能提取任何行。
当语句包括占位符(在此查询字符串内部由‘?’字母表示)时,使用@bind_values。
@bind_values为给占位符赋值的值的列表。它必须和占位符有一样多的值。如果只指定赋值
的值,但没有指定属性,则将undef作为\%attr参数的值来传递。
与prepare和execute结合使用的功能基本相同。
2,ping方法:
my $rc = $dbh -> ping ();
语法解释:检查与服务器的连接是否仍然有效,并相应返回真或假。
3,prepare方法:
my $sth = $dbh -> prepare ($query[, \%attr]);
语法解释:为以后的执行所准备的由$query表示的查询,并返回一个语句句柄。返回的句柄可用于execute(),以便执行该查询。
4,quote方法:
my $str = $dbh -> quote ($value[, $data_type]);
语法解释:处理字符串以实现SQL语句中特定字符的引用和转义,以便在执行这条语句时,该字符串不引起语法错误。
例如,“‘I \’m happy’”(没有双引号)返回字符串“I ’m happy”。
如果$value为undef,则它返回字符串“NULL”(没有引号)。
一般来说,$data_type参数不是必需的,因为MySQL将查询中指定为字符串的值自动地转换为其他类型。
可以将$data_type指定为特殊类型值的提示————例如,DBI::SQL_INTEGER指出$value表示一个整数。
不要使用具有打算利用占位符插入到查询中的值的quote()。DBI会自动引用这样的值。
5,selectall_arrayref方法
my $ary_ref = $dbh -> selectall_arrayref ($query[, \%attr[, @bind_values]]);
语法解释:执行由$query指定的查询,并结合prepare()、execute()和fetchall_arrayref()返回结果。如果出现错误,则返回undef。
如果$query参数是以前准备的语句,则省略prepare()步骤。
@bind_values参数和do()方法中的该参数具有同样的意义。
比如:
---------------------------------------------------------------------
# fetch all rows into a reference to an array of references
my $matrix_ref = $dbh -> selectall_arrayref ($query);
# determine dimensions of matrix
my $rows = (!defined ($matrix_ref) ? 0 : scalar (@{$matrix_ref}));
my $cols = ($rows == 0 ? 0 : scalar (@{$matrix_ref->[0]}));
for (my $i = 0; $i < $rows; $i ++) # print each row
{
my $delim = "";
for (my $j = 0; $j < $cols; $j ++)
{
$matrix_ref -> [$i][$j] = "" if !defined ($matrix_ref -> [$i][$j]); # NULL?
print $delim . $matrix_ref -> [$i][$j];
$delim = ",";
}
print "\n";
}
---------------------------------------------------------------------
6,selectcol_arrayref方法
my @ary_ref = $dbh -> selectcol_arrayref ($query[, \%attr[, @bind_values]]);
语法解释:执行由$query指定的查询,并通过组合prepare()和execute()返回结果的第一列。返回结果作为对含有每行第一列的数组的引用。如果出现错误,则返回undef。
如果$query参数是以前准备的语句,则省略prepare()步骤。
@bind_values参数和do()方法中的该参数具有同样的意义。
7,selectrow_array方法
my @row_ary = $dbh -> selectrow_array ($query[, \%attr[, @bind_values]]);
语法解释:执行由$query指定的查询,并结合prepare()、execute()和fetchall_arrayref()返回结果的第一行。
如果参数$query是以前准备的语句,则省略prepare()步骤。
如果在列表的上下文中调用时,selectrow_array()返回代表行值的数组,或者,如果出现错误,则返回空数组。在标量的上下文中,selectrow_array()返回这个数组的第一个元素的值(行的第一列)。如果出现错误,则返回undef。
@bind_values参数和do()方法中的相应参数具有同样的意义。
四、语句句柄方法的调用
1,bind_col方法
my $rc = $sth -> bind_col($col_num, \$var_to_bind);
将SELECT查询的给定列与Perl变量相联系,将它作为引用传递。$col_num的范围为1到查询选择的列数。每次提取行时,这个变量用列值自动更新。
bind_col()应该在execute()之前及prepare()之后调用。
如果列号范围不在1到查询选择的列数之间,则bind_col()返回假。
2,bind_columns方法
my $rc = $sth -> bind_columns (\$var_to_bind1, \$var_to_bind2, ...);
将一系列变量与由准备好的SELECT 语句返回的列相联系,请参阅bind_col()方法的说明。
如果引用的数量与查询选择的列数不匹配,则bind_columns() 返回假。
3,bind_param方法
my $rv = $sth -> bind_param ($n, $value[, \%attr]);
my $rv = $sth -> bind_param ($n, $value[, $bind_type]);
在一个语句中,将值与占位符‘?’相联系。应该在execute()之前及prepare()之后调用它。
$n指定了占位符的数量,应该限定$value值,而且该值范围应该为1到占位符的数量。为了限定NULL值,可传递undef。
参数\%attr或者$bind_type可作为要联系的值的类型提示。
4,dump_results方法
my $rows = $sth -> dump_results ([$maxlen[, $line_sep[, $field_sep[, $fh]]]]);
从语句句柄$sth 中提取所有的行,通过调用实用函数DBI::neat_list()将他们格式化,并将他们打印到给定的文件句柄中。返回提取的行数
$maxlen、$line_sep、$field_sep和$fh的缺省值分别为35、“\n”、“,”和STDOUT。
5,execute方法:
my $rows = $sth -> execute ([@bind_values]);
执行准备好的语句。如果该语句执行成功,则返回真,如果发生错误,则返回undef。
参数@bind_values与do()方法中的有相同的意义。
6,fetchall_arrayref方法:
my $tbl_ary_ref = $sth -> fetchall_arrayref ([$slice_array_ref]);
从语句句柄$sth 中提取所有行,并返回数组的引用,这个数组包含提取的每行的一个引用。数组中每个引用的意义取决于所传递的参数。没有参数或者只有数组部分引用参数,则$tbl_ary_ref 的每个元素都是包括结果集的一行值的数组引用。对于散列部分的引用参数,$tbl_ary_ref 的每个元素就是对包含结果集的一行值的散列引用。
7,fetchrow_array方法:
my @ary_ref = $sth -> fetchrow_array ();
当在一个列表的范围中调用时,fetchrow_array()返回包含结果集下一行列值的数组,如果不再有行或者发生错误,则fetchrow_array()返回一个空数组。在标量上下文中,fetchrow_array()返回数组第一个元素的值(那就是说,行的第一列),如果不再有行或者发生错误,则fetchrow_array()返回undef。
通过检查$sth->err(),可以将结果集正常结束与出现错误区分开来。零值表明已经无错误地到达了结果集的末尾。
一般与while使用。
比如:
---------------------------------------------------------------------
while (my @ary = $sth -> fetchrow_array ())
{
@ary = map { defined ($_) ? $_ : "NULL" } @ary;
print join (",", @ary) . "\n";
}
---------------------------------------------------------------------
8,fetch或fetchrow_arrayref方法
my @ary_ref = $sth -> fetchrow_arrayref ();
返回一个包括结果集的下一行列值的数组引用。如果不再有行或者发生错误,则返回undef。
通过检查$sth->err(),可以将结果集正常结束与出现错误区分开来。零值表明已经无错误地到达了结果集的末尾。
一般与while使用。
比如:
-----------------------------------------------------------------------------------
my @matrix = (); # array of array references
while (my @ary = $sth -> fetchrow_array ()) # fetch each row
{
push (@matrix, [ @ary ]); # save reference to just-fetched row
}
# determine dimensions of matrix
my $rows = scalar (@matrix);
my $cols = ($rows == 0 ? 0 : scalar (@{$matrix[0]}));
for (my $i = 0; $i < $rows; $i++) # print each row
{
my $delim = "";
for (my $j = 0; $j < $cols; $j++)
{
$matrix[$i][$j] = "" if !defined ($matrix[$i][$j]); # NULL value?
print $delim . $matrix[$i][$j];
$delim = ",";
}
print "\n";
}
---------------------------------------------------------------------
9,fetchrow_hashref方法
my $hash_ref = $sth -> fetchrow_hashref ([$name]);
返回包括结果集的下一行列值的散列引用。如果不再有行或者发生错误,则返回undef。散列是索引值是列名称,散列的元素是列值。
对于散列的关键值,指定变量$name说明使用的语句句柄属性。缺省值为“NAME”。这可能导致查询中的列名称不区分大小写的问题,但是散列键是区分大小写的。要强迫散列键为大写字母或者小写字母,可以指定“NAME_lc”或“NAME_uc”的$name值。
通过检查$sth->err(),可以将结果集正常结束与出现错误区分开来。零值表明已经无错误地到达了结果集的末尾。
一般与while使用。
比如:
---------------------------------------------------------------------
while (my $hash_ref = $sth -> fetchrow_hashref ())
{
my $delim = "";
foreach my $key (keys (%{$hash_ref}))
{
$hash_ref -> {$key} = "" if !defined ($hash_ref->{$key}); # NULL value?
print $delim . $hash_ref -> {$key};
$delim = ",";
}
print "\n";
}
---------------------------------------------------------------------
10,finish方法
my $rc = $sth -> finish();
释放有关语句句柄的任何资源。通常不必显式地调用这个方法,但是如果只提取部分结果集,则调用finish()使DBI了解已经提取了数据。调用finish()可能使语句属性无效,最好在调用execute()之后立即访问它们。
11,rows方法
my $rv = $sth -> rows();
返回与$sth相关的语句所作用的行数,如果发生错误,则返回-1。使用这个方法主要用于不返回行的语句。对于SELECT语句,不能依赖rows()方法在提取行时统计行数。
五、通用句柄方法
下面的方法不是专用于特定类型的句柄的。可用驱动程序、数据库或语句句柄来调用它们。
1,$h -> err()
返回最近调用的驱动程序操作的数字错误代码。0表示没有错误。
2,$h -> errstr()
返回最近调用的驱动程序操作的字符串错误消息。空字符串表示没有错误。
3,DBI -> trace($trace_level[, $trace_filename]);
$h -> trace($trace_level[, $trace_filename]);
设置跟踪级别。跟踪提供有关DBI操作的信息。跟踪级别的范围从0(关闭)到9(最多信息)。通过作为DBI类方法或独立的句柄调用跟踪,跟踪可以启用脚本内部的所有DBI操作:
DBI->trace(2);打开脚本跟踪
$sth->trace(2);打开句柄跟踪
通过设置DBI_TRACE环境变量,也可以对运行的所有DBI脚本在全局级别启用跟踪。缺省时,跟踪输出到STDERR.。提供的$filename参数可以直接将结果输出到不同的文件。将输出添加到这个文件的任何已有内容后面。
每个跟踪调用导致来自所有跟踪的句柄中的输出进入相同的文件。如果文件已命名,则所有跟踪就输出到那个文件。如果没有命名的文件,则所有跟踪输出到STDERR。
4,DBI -> trace_msg($str[, $min_level])
$h -> trace_msg($str[, $min_level])
如果跟踪这个句柄或如果在DBI级启用跟踪,则编写这个跟踪输出的消息。如果启用DBI级的跟踪,则trace_msg()可以作为DBI->trace_msg()来调用,编写消息。只有在跟踪级别至少为这个级别时,才可以提供$min_level 参数来指定应该编写的消息。
六、MySQL 的特定管理方法
DBI 作为直接访问驱动程序的手段所供的func() 函数方法
---------------------------------------------------------------------
$rc = $drh -> func("createdb", $dbname, [host, user, password,], 'admin');
$rc = $drh -> func("dropdb", $dbname, [host, user, password,], 'admin');
$rc = $drh -> func("shutdown", [host, user, password,], 'admin');
$rc = $drh -> func("reload", [host, user, password,], 'admin');
---------------------------------------------------------------------
or
---------------------------------------------------------------------
$rc = $dbh -> func("createdb", $dbname, 'admin');
$rc = $dbh -> func("dropdb", $dbname, 'admin');
$rc = $dbh -> func("shutdown", 'admin');
$rc = $dbh -> func("reload", 'admin');
---------------------------------------------------------------------通过驱动程序句柄或通过数据库句柄访问func()方法。驱动程序句柄与打开的连接无关,所以,如果以这种方式访问func(),则必须提供允许这个方法创建连接的主机名称、用户名称和口令的参数。如果用数据库句柄访问func(),则不需要那些参数。如果需要,可以像下面这样获得驱动程序句柄:
my $drh = DBI -> install_driver(“mysql”);#(“mysql”mustbelowercase)
createdb创建由$db_name指定的数据库。要这样做,必须对该数据库拥有CREAT权限。
dropdb删除由$db_name指定的数据库。要这样做,必须对该数据库拥有DROP权限。当心,如果删除了一个数据库,则它将会消失,且再也不能恢复。
shutdown关闭服务器。必须具有SHUTDOWN权限。
reload告诉服务器重新加载授权表。如果直接使用DELETE、INSERT或UPDATE而不是使用GRANT或REVOKE来修改这个授权表的内容,则这是必需的。要使用reload,必须具有RELOAD权限。
七、DBI 环境变量
DBI考虑了几个环境变量,如表G-3所示。除了DBI_TRACE之外,所有变量都由connect()方法使用。DBI_TRACE由trace()方法使用。
DBI_DRIVER:DBI级的驱动程序名(MySQL的“mysql”)
DBI_DSN:数据源名
DBI_PASS:口令
DBI_TRACE:跟踪级别和/或跟踪输出文件
DBI_USER:用户名称
---------------------------------------------------------------------$errno = $dbh->{'mysql_errno'};
$error = $dbh->{'mysql_error};
$info = $dbh->{'mysql_hostinfo'};
$info = $dbh->{'mysql_info'};
$insertid = $dbh->{'mysql_insertid'};
$info = $dbh->{'mysql_protoinfo'};
$info = $dbh->{'mysql_serverinfo'};
$info = $dbh->{'mysql_stat'};
$threadId = $dbh->{'mysql_thread_id'};
---------------------------------------------------------------------
八、一个例子
---------------------------------------------------------------------
#!/usr/bin/perl -w
use CGI::Carp "fatalsToBrowser";
use strict;
use warnings;
use DBI;
use CGI qw (:standard escapeHTML escape);
my ($driver_name, $db_name, $db_host, $db_sock, $db_port, $db_user, $db_pswd, $dsn);
$driver_name = 'mysql';
$db_name = 'mydata';
$db_host = 'localhost';
$db_sock = '/tmp/mysql.sock';
$db_port = '3306';
$db_user = 'cnangel';
$db_pswd = 'cnangel';
$dsn = "dbi:mysql:database=${db_name};hostname=${db_host};mysql_socket=${db_sock};port=${db_port}";
# ... set up connection to database (not shown) ...
my $dbh = DBI -> connect ($dsn, $db_user, $db_pswd,
{ RaiseError => 1, PrintError => 0 });
# put out initial part of page
my $title = "$db_name Database Browser";
print header ();
print start_html (-title => $title, -bgcolor => "white");
print h1 ($title);
# parameters to look for in URL
my $tbl_name = param ("tbl_name");
my $sort_col = param ("sort_col");
# If $tbl_name has no value, display a clickable list of tables.
# Otherwise, display contents of the given table. $sort_col, if
# set, indicates which column to sort by.
!defined ($tbl_name) ? display_table_names ($dbh, $db_name) : display_table_contents ($dbh, $tbl_name, $sort_col);
print end_html ();
sub display_table_names
{
my ($dbh, $db_name) = @_;
print p ("Select a table by clicking on its name:");
# retrieve reference to single-column array of table names
my $ary_ref = $dbh -> selectcol_arrayref (qq{ SHOW TABLES FROM $db_name });
# Construct a bullet list using the ul() (unordered list) and
# li() (list item) functions. Each item is a hyperlink that
# re-invokes the script to display a particular table.
my @item;
foreach my $tbl_name (@{$ary_ref})
{
my $url = sprintf ("%s?tbl_name=%s", url (), escape ($tbl_name));
my $link = a ({-href => $url}, escapeHTML ($tbl_name));
push (@item, li ($link));
}
print ul (@item);
}
sub display_table_contents
{
my ($dbh, $tbl_name, $sort_col) = @_;
my @rows;
my @cells;
# if sort column not specified, use first column
$sort_col = "1" if !defined ($sort_col);
# present a link that returns user to table list page
print p (a ({-href => url ()}, "Show Table List"));
print p (strong ("Contents of $tbl_name table:"));
my $sth = $dbh -> prepare (qq{
SELECT * FROM $tbl_name ORDER BY $sort_col
LIMIT 200
});
$sth -> execute ();
# Use the names of the columns in the database table as the
# headings in an HTML table. Make each name a hyperlink that
# causes the script to be reinvoked to redisplay the table,
# sorted by the named column.
foreach my $col_name (@{$sth -> {NAME}})
{
my $url = sprintf ("%s?tbl_name=%s;sort_col=%s",
url (),
escape ($tbl_name),
escape ($col_name));
my $link = a ({-href => $url}, escapeHTML ($col_name));
push (@cells, th ($link));
}
push (@rows, Tr (@cells));
# display table rows
while (my @ary = $sth -> fetchrow_array ())
{
@cells = ();
foreach my $val (@ary)
{
# display value if non-empty, else display non-breaking space
if (defined ($val) && $val ne "")
{
$val = escapeHTML ($val);
}
else
{
$val = " ";
}
push (@cells, td ($val));
}
push (@rows, Tr (@cells));
}
# display table with a border
print table ({-border => "1"}, @rows);
}
发表评论
-
使用SOAP::Lite开发Web services(Perl SOAP)
2012-01-16 16:58 4042简单对象访问协议:SOAP的应用 SOAP,是由万维网联盟( ... -
Perl 一个简单的 GUI 程序,有退出按钮
2011-12-05 13:31 1524#!/usr/bin/perl -w use Tk; ... -
Perl 数据库事务处理(提交和回滚)
2011-12-05 13:24 1082use DBI qw(:sql_types); ... -
Perl 学习笔记
2011-10-27 11:18 1244(一):字符串与排序 处理文本是perl最擅长的工作,而这个能 ... -
perl fork子进程
2011-09-27 14:28 1529Perl fork() Forking in perl is ... -
vsFTPd 服务器初学者指南
2011-09-22 09:56 786作者:北南南北,正在 ... -
[Perl]向syslog写入自定义日志(Sys::Syslog)
2011-09-08 12:05 1922例子1:[Perl]向syslog写入自定义日志(Sys::S ... -
用Perl语言进行Socket编程
2011-09-05 15:31 870网络编程是一门神秘且复杂的艺术,当然也十分有趣。Perl语言提 ... -
PERL与MySQL
2010-08-31 13:50 1103一、简介 PERL应用数据库由两种方法,其一是利用本身所配置 ... -
stat()函数 perl
2010-08-31 13:47 2300stat()函数返回一个数组。下面是数组各元素的含义。 0 d ...
相关推荐
本章节着重讲解了如何使用Perl DBI与MySQL进行交互,并特别提到了由DBD::mysql提供的MySQL数据库驱动程序。 #### 二、Perl DBI API简介 Perl DBI API是一组用于与数据库服务器通信以及从Perl脚本访问数据库的方法...
### Zabbix服务器端安装及MySQL数据库安装与配置详解 #### 一、环境搭建与系统初始化 在进行Zabbix服务器端的安装之前,首先需要确保搭建好相应的基础环境。根据题目中的描述,整个环境将分为两个部分:服务器端...
### 使用ZRM备份MySQL数据库详解 #### 一、ZRM简介 ZRM是Zmanda公司推出的一款用于MySQL数据库备份和恢复的专业工具。该工具由Perl编写而成,具有易用性和高度灵活性的特点。它不仅考虑到了备份与恢复过程中的各种...
### MySQL Perl API 知识点详解 #### 一、引言 MySQL的Perl API主要涉及的是Perl DBI(Database Interface)及其对应的MySQL驱动程序DBD::mysql。这是一套广泛应用于Perl应用程序中的数据库接口标准,使得开发人员...
### Perl大骆驼教程知识点详解 #### 一、Perl大骆驼教程简介 **Perl大骆驼**,作为Perl编程语言的进阶教程,旨在帮助已有基础的开发者深入理解和掌握Perl的各种高级特性和应用场景。Perl,以其强大的文本处理能力...
本文档将引导您完成整个安装流程,包括编译安装MySQL及其相关的配置优化,以及安装DBI和DBD for MySQL以实现Perl对数据库的访问。 ##### 1.1 创建MySQL用户与组 在安装MySQL之前,创建一个专用的MySQL用户和组是...
以上章节介绍了如何使用Perl结合DBI模块操作MySQL数据库,以及如何使用Perl与操作系统进行交互。通过这些知识点的学习,读者可以更加熟练地使用Perl进行实际开发工作,特别是在处理数据库和文件系统方面。同时,通过...
[root@ha1 ~]# yum -y install mysql mysql-server perl-DBI perl-DBD-MySQL ``` 这里采用`yum`命令来安装MySQL及其服务端,以及Perl的DBI和DBD-MySQL模块,便于后续的配置工作。 ### 二、授权用户 为了实现MySQL ...
使用DBI连接MySQL数据库的基本步骤如下: ```perl use DBI; my $dbh = DBI->connect( "DBI:mysqlPP:database=mysql;host=localhost", "root", "275171435", {'RaiseError' => 1} ); ``` 这里的`DBI:mysqlPP:...
1. 安装必要的依赖:在安装MHA之前,确保系统中已安装了Perl、Perl DBI、Perl DBD::MySQL以及MySQL客户端库等依赖。 2. 安装MHA RPM包:使用`rpm`命令分别安装`mha4mysql-manager`和`mha4mysql-node`。 3. 配置MHA...
通过安装Perl模块`DBI`和`DBD::mysql`,可以使用`bin/mysql_setpermission`脚本来方便地设置新的数据库账户权限。 以上知识点涵盖了MySQL开发和管理的基本操作,包括数据库连接、数据管理、服务管理及安全性配置等...
在Linux系统中,MySQL是一种广泛使用的开源关系型数据库管理系统。本文将详细介绍如何在Linux环境下安装和卸载MySQL。 ### 一、安装MySQL 1. **卸载旧版本**: 如果你的Linux系统(例如Redhat Enterprise 5)预装...
1. **安装依赖**:确保系统中安装了Perl、Perl模块(如DBI、DBD::mysql等)、MySQL客户端库等必要的软件包。 2. **下载源码**:从官方网站或者GitHub仓库获取mha4mysql-node-0.53的源代码。 3. **编译与安装**:...
### MySQL安装及配置详解 #### 一、安装前准备与验证 在进行MySQL的安装之前,首先需要确保系统环境满足安装需求,并验证是否已安装MySQL。 **验证已安装的MySQL:** ```bash rpm -qa | grep MySQL ``` 通过上述...
使用Perl的内置模块管理工具Cpanm或通过Cpan shell安装所需的模块,如DBI(用于数据库访问)、CGI(用于Web编程)等。例如: ``` perl -MCPAN -e shell install DBI install CGI ``` 此外,某些特定于数据库的模块...