服务器 频道

DBI/MYSQL FAQ

  21. 如何从服务器随机地提取记录?
  答: 用Mysql的LIMIT函数.
  $Query = "SELECT * FROM Table";
  $sth = $dbh->prepare($Query);
  $numrows = $sth->execute;
  $randomrow = int(rand($numrows));
  $sth = $dbh->prepare("$Query LIMIT $randomrow,1");
  $sth->execute;
  @arr = $sth->fetchrow;

  
  22. 插入记录后,如何获得自动增加的主键值?
  答: insertid方法是MySQL特有的,也许不能在其它SQL server上工作

  #!/usr/bin/perl
  # 连接数据库 ....
  my $sql_statement = "INSERT INTO $table (field1,field2) VALUES($value1,$value2)";
  my $sth = $dbh->prepare($sql_statement);
  $sth->execute or die "无法添加数据 :
  $dbh->errstr";

  # 现在我们可以取回刚刚插入后生成的主键.
  my $table_key = $sth->{insertid};
  # 也可以用这种方法(标准的DBI方法)
  my $table_key = $dbh->{''mysql_insertid''};
  $sth->finish;

  
  23. 执行SELECT查询以后,如何获得记录行数?
  答:有好几种方法可以做到.这是其中的一种:

  # 文档中说这种方法不行,但对我来说却可以,你或许也行.
  my $mysql_q = "SELECT field1,field2 FROM $table WHERE field1=$value1";
  my $sth = $dbh->prepare($mysql_q);
  my $found = $sth->execute or die "无法执行 :
  $dbh->errstr";
  $sth->finish;

  # 这是一种较慢的方法,而且做SELECT查询时还不太可靠.
  my $sql = q(select * from $table where field = ? );
  my $sth = $dbh->prepare($sql);
  $sth->execute(''$value'');
  my $rows = $sth->rows;
  $sth->finish;

  # 这是一种较快的方法.
  my $sql = q(select count(*) from $table where field = ? );
  my $sth = $dbh->prepare($sql); $sth->execute(''$value'');
  my $rows = $sth->fetchrow_arrayref->[0];
  $sth->finish;

  
  24. 为什么SELECT LAST_INSERT_ID(USER_ID) FROM User返回的是所有的user id而不是最后一个?
  答: 摘自手册:

  "在服务器上最后创建的ID是根据每个连接来单独管理的.也就是说,它不能被另外一个客户端改变. 甚至你用一个非空和非零的值来更新另外一个AUTO_INCREMENT字段,它也不会改变. 如果算式做为一个参量赋给UPDATE语句中的LAST_INSERT_ID(),则参量会返回LAST_INSERT_ID()的值."

  你真正需要的是: SELECT USER_ID FROM User ORDER BY USER_ID DESC LIMIT 1

   

  25. WHERE语句中可否使用两个条件?
  答: 可以

  my $sql_statment = "SELECT * FROM $table WHERE $field1=''$value1'' AND $field2=''$value2''";

   

  26. 如何在多个字段中查找一个关键字?
  答: 试下这个:

  SELECT concat(last,'' '',first,'' '',suffix,'' '',year,'' '',phone,'' '',email) AS COMPLEAT, last, first, suffix, year, dorm, phone, box, email
  FROM Student HAVING COMPLEAT
  LIKE ''%value1%'' AND COMPLEAT LIKE ''%value2%'' AND COMPLEAT LIKE ''%value3%''

   

  27.如何找到一个星期前创建的记录?
  答: 我们需要用DATE函数来做sql查询:

  DATE_ADD(date,INTERVAL expr type)
  DATE_SUB(date,INTERVAL expr type)
  ADDDATE(date,INTERVAL expr type)
  SUBDATE(date,INTERVAL expr type)

  例如 : # 这个查询语句返回所有"年龄"小于或等于7天的记录

  my $sql_q = "SELECT * FROM $database WHERE DATE_ADD(create_date,INTERVAL 7 DAY) >= NOW() ORDER BY create_date DESC";

  
  28.如何取回所有字段的数据并用"column_name" => value来放入一个相关的数组中?
  答:用$sth->fetchrow_hashref 方法.

  
  $SQL = "SELECT * FROM members";
  my $sth = $dbh->prepare($SQL);
  $sth->execute or die "sql语句错误 ".
  $dbh->errstr;
  my $record_hash;
  while ($record_hash = $sth->fetchrow_hashref){
  print "$record_hash->{first_name} $record_hash->{last_name}n";
  }
  $sth->finish;

  
  29.如何保存一个图像文件(JPG和GIF)到数据库中?

  
  答:

  file: test_insert_jpg.pl
  -------------------------
  #! /usr/bin/perl
  use DBI;
  open(IN,"/imgdir/bird.jpg");
  $gfx_file=join('''',);
  close(IN);

  $database="speedy";
  $table="archive";
  $user="stephen";
  $password="none";
  $dsn="DBI:mysql:$database";
  $dbh=DBI->connect($dsn, $user, $password);
  $sql_statement=<<"__EOS__";
  insert into $table (id, date, category, caption, content, picture1, picture2,
  picture3, picture4, picture5, source, _show) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

  __EOS__

  # uncomment to debug sql statement
  # --------------------------------
  #open(SQLLOG,">>sql_log_file");
  #print SQLLOG scalar(localtime)."t$sql_statementn";
  #close(SQLLOG);
  $sth=$dbh->prepare($sql_statement);
  $sth->execute(NULL,NULL,"car|sports","Porsche Boxster S","German excellence",$gfx_file,NULL,NULL,NULL,NULL,"European Car","Y");
  $sth->finish(); $sth=$dbh->prepare("SELECT * FROM $table");
  $sth->execute();

  while($ref=$sth->fetchrow_hashref()){
  print "id = $ref->{''id''}tcategory = $ref->{''category''}tcaption = $ref->{''caption''}n";
  }

  $numRows=$sth->rows;
  $sth->finish();
  $dbh->disconnect();

  file: serve_gfx.cgi
  -----------------------------------------------------
  #!/usr/bin/perl
  $|=1;
  use DBI;
  $database="speedy";
  $table="archive";
  $user="stephen";
  $password="none";
  $dsn="DBI:mysql:$database";
  $dbh=DBI->connect($dsn, $user,$password);
  $sth=$dbh->prepare("select * from $table where id=1");
  $sth->execute();
  $ref=$sth->fetchrow_hashref();
  print "content-type: image/jpgnn";
  print $ref->{''picture1''};
  $numRows=$sth->rows;
  $sth->finish();
  $dbh->disconnect();

  
  30. 如何插入N个记录?
  答:

  # 让我们插入10000个记录
  my $rec_num = 10000;
  my $PRODUCT_TB = "products";
  my $dbh = DBI->connect($database,$db_user,$db_password) or die "无法连接数据库n";
  my $sth = $dbh->prepare("INSERT INTO $PRODUCT_TB (name,price,description,pic_location) VALUES (?,?,?,?)");

  for ($i = 1; $i <= $rec_num; $i++){
  my $name = "Product $i";
  my $price = rand 350;
  my $desc = "Desccription of product $i";
  my $pic = "images/product/product".$i.".jpg";
  $sth->execute($name,$price,$desc,$pic);
  }
  $sth->finish();
  print "完成插入$rec_num个记录到表$PRODUCT_TBn";
  $dbh->disconnect;
  exit;

  31.如何创建一个date字段,使其缺省值是新记录创建时的日期?
  答:有很多种方法可以做到:

  (1) 用TIMESTAMP

  Create Table mytable( table_id INT NOT NULL AUTO_INCREMENT,
  value VARCHAR(25),
  date TIMESTAMP(14),
  PRIMARY KEY (table_id) );

  当插入或更新记录时,TIMESTAMP字段将自动地设置成当前日期.如果你不想更新时改变日期,可在用UPDATE语句时,把日期字段设置成原来的(插入日期).

  (2) 用NOW()函数.

  Create Table mytable( table_id INT NOT NULL AUTO_INCREMENT,
  value VARCHAR(25),
  date DATE,
  PRIMARY KEY (table_id) );

  在insert语句中设置date=NOW().
  

0
相关文章