11. 如何从一个字符串中过滤特别字符?
答: 用$dbh->quote()方法.
quote()方法可从字符串中提取特别字符(如:引号等),然后自动加上右边的引号. 但不能处理所有的输入(如二进制数据).
#!/usr/local/bin use DBI;
# 连接SQL服务器 ....
# 从网页表单中取得字符信息.
my $string = $cgi_data{''user_input''};
$string = $dbh->quote($string);
# 因为quote已经加上了右边的引号,所以你不必在加上.
my $sql_q = "SELECT * FROM $table WHERE field = $string ";
12. 有没有可能在$sth中查出SQL语句的类型?
答:可试下这个:
if ($sql_statement =~ /^s*(insert|update|delete)/i) { # do something }
elsif ($sql_statement =~ /^s*select/i) { # do something }
else { # do something }
13. 如何加密一个密码,并将来和输入密码向相比较?
答: 保存一个密码(即从网页上输入的),首先要对密码加密然后再把它保存在数据库中.MySQL已经有一个加密函数来对一个字符串加密.
# 连接sql server
# 从表单中取得user id 和 password
# 你可能要通过$dbh->quote()函数来确定输入中没有会破坏SQL语句的字符
my $insert_user = "INSERT INTO $user_table (user_id,password) VALUES(''$user_id'',PASSWORD(''$password'')";
my $insert_sth = $dbh->prepare($insert_user);
$insert_sth->execute() or die "Error : $dbh->errstr";
# 检查用户是否输入了正确的字符
# 注意 : 又必须先运行dbh->quote()
my $check_sql = "SELECT * FROM $user_table WHERE user_id = $user_id AND passwordfield = PASSWORD(''$password_entered'')";
如果你不想用Mysql的PASSWORD函数, 你可以在保存前用perl的crypt 函数来加密. 进行比较时,先对输入密码crypt,然后与保存在数据库中的已加密密码进行比较。
14. 如何在mysql中创建表 ?
答:试下这个 ..
CREATE TABLE pictures( picture_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
category_id SMALLINT UNSIGNED NOT NULL,
location VARCHAR(40),
thumb VARCHAR(40),
title VARCHAR(80) NOT NULL,
description TINYTEXT,
last_modified DATE,
last_viwed DATE,
view_count INT UNSIGNED,
user_id VARCHAR(20) NOT NULL,
colour ENUM(''true'',''false'') NOT NULL DEFAULT ''true'',
PRIMARY KEY (picture_id),
INDEX (title),
INDEX (user_id),
INDEX (category_id),
INDEX (colour) );
15. 如何在M个纪录中只列出N个,并用翻页的方法列出其它?
答:可以采用MYSQL的LIMIT函数.
注意:下面的代码用了cgi-lib.pl的函数来获取网页输入数据.
sub List_Result{
my ($user_action) = @_;
my %cgi_data;
&ReadParse(%cgi_data);
my $limit = 10 ;
my $offset = $cgi_data{''offset''};
my $printed = $cgi_data{''printed''};
my $prev_offset = $cgi_data{''prev_offset''};
my $next_action = $cgi_data{''next_action''};
my $print_cnt = 0;
$new_prev_offset = $offset;
#下面的代码取得用户的操作
if ($next_action eq "Next"){
$offset += $limit;
}
elsif($next_action eq "Previous"){
if ($printed < $limit){
$offset = $prev_offset;
}else{
$offset -= $printed;
}
}
else { $offset = 0 ; }
}
my $SELECT ;
my $LIMIT = " LIMIT $offset,$limit";
# 如果$KEEP_SQL 为空,则表示重新开始,用旧的sql语句
if ($KEEP_SQL eq ""){
if($user_action eq "list_all"){
$SELECT = "SELECT * FROM mytable ";
}
else{
$SELECT = "SELECT * FROM mytable WHERE rec_id = $rec_id ";
}
}else{
$SELECT = $KEEP_SQL;
}
my $SQL = $SELECT.$LIMIT;
# KEEP_SQL将被保存在一个隐含的表段输入中,这个变量保证每次都用一个sql语句.
my $KEEP_SQL = $SELECT;
my $sth = $dbh->prepare($SQL);
$sth->execute() or die "Can''t execute:";
# 做你想做的事情.
print " [form method=post action=$this_cgi] ...
... 列出结果 ..
[input type=hidden name=offset value=$offset]
[input type=hidden name=printed value=$printed]
[input type=hidden name=prev_offset value=$new_prev_offset]
[input type=hidden name=user_action value=viewing_result]
[input type=hidden name=KEEP_SQL value=$KEEP_SQL] ";
if ($offset > 0 ) {print "[input type=submit name=next_action width=100 value="Previous"]n"; }
if ($printed == $limit){ print "[input type=submit name=next_action width=100 value="Previous"n"]; }
print "[/form]";
16. 如何获得表的字段信息?
答:
#!/usr/bin/perl
# connect to db
my $dbh = DBI->connect(bla..bla..bla);
my $sql_q = "SHOW COLUMNS FROM $table";
my $sth = $dbh->prepare($sql_q);
$sth->execute;
while (@row = $sth->fetchrow_array){
print"Field Type Null Key Default Extran";
print"---------------------------------------------------------------n";
print"$row[0] $row[1] $row[2] $row[3] $row[4] $row[5]n";
}
17. 如何添加一个超级用户 ?
答: 你可以用GRANT语句:
shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY ''something'' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%" IDENTIFIED BY ''something'' WITH GRANT OPTION;
超级用户可以从任何地方连接服务器,但必须使用一个密码(''something'').
请注意我们同时对monty@localhost和monty@"%"用了GRANT语句.如果不加上localhost,当我们(超级用户)从本机上连接时,localhost上mysql_install_db创建的匿名用户会取得更高的优先权,因为它有更特别的Host字段值,使得在用户列表中占据靠前的位置.
18.如何知道Mysql服务器中所有可供使用的数据库?
答: 用data_sources($driver_name)方法.
这个方法返回SQL服务器中数据库名字列表
例: $db_names = DBI->data_sources("mysql");
19. 如何连接SQL服务器?
答:
#!/usr/bin/perl
use DBI;
my $database_name = "db_name";
my $location = "localhost";
my $port_num = "3306"; # 这是mysql的缺省
值 # 定义SQL服务器的位置.
my $database = "DBI:mysql:$database_name:$location:$port_num";
my $db_user = "user_name";
my $db_password = "user_password";
# 连接.
my $dbh = DBI->connect($database,$db_user,$db_password);
# 做你要做的事情.. ... ...
$dbh->disconnect;
$exit;
20. 如何从SQL服务器上获取记录数据?
答:从SQL服务器上获取记录数据,必须先连接服务器,然后提交SQL查询语句,服务器则返回结果
#!/usr/bin/perl
# 连接服务器 (见22)
my $sql_statement = "SELECT first_name,last_name FROM $table ORDER BY first_name";
my $sth = $dbh->prepare($sql_statement);
my ($first, $last);
# 结果保存在$sth中 $sth->execute() or die "无法执行SQL语句:
$dbh->errstr"; $sth->bind_columns(undef, $first, $last);
my $row; while ($row = $sth->fetchrow_arrayref) {
print "$first $lastn";
# 或者
print "$row->[0] $row[1]n";
}
以上的程序将列出结果中的每一行,打印出first name和last name.这是最快的提取数据的方法之一.