服务器 频道

DBI/MYSQL FAQ

  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@localhostmonty@"%"用了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.这是最快的提取数据的方法之一.

   

  

0
相关文章