DBM数据库的操作例程

这篇文章是自己从国外网站翻译过来并加了些注释的
<?php
// 文件存放目录
$dbm dbmopen(  "guestbook",   "c");
// 这个目录必须有写入的权限
// 文件头
$field_separator =   ":" ;
$fields = array ( "topic",  "talker",  "email","body");

//显示单条记录
function print_one_record($w_mykey,$w_fields) {
    global 
$fields;
    if( 
$w_mykey)print(  "<H3>Modify Record</H3>\n");
    print(  
"<FORM NAME=entdetails ACTION=\"$PHP_SELF\" METHOD=\"POST\">\n");
    print(  
"<TABLE BORDER=\"0\" CELLSPACING=\"1\" CELLPADDING=\"0\">\n");
      
/* 假如没有定义主键的话的话,则。。。*/
    
if ( $w_mykey )
        print(  
"<TR><TH><B>Key</B></TH>\n<TH>".
          
"<INPUT NAME=\"mykey\" TYPE=\"HIDDEN\" VALUE=\"$w_mykey\"><B>".
          
"$w_mykey</B></TH></TR>\n");
    else
        print(  
"<TR><TH><B>Key</B></TH>\n<TD>".
          
"<INPUT NAME=\"mykey\" TYPE=\"TEXT\"  VALUE=\"\" SIZE=35>".
          
"</TD>\n</TR>\n");
    for (
$I=0;$I count($fields) ; $I++) {
        print(  
"<TR>\n".
                  
"<TH>$fields[$I]</TH>\n".
                  
"<TD>".
                  
"<INPUT NAME=\"$fields[$I]\" TYPE=\"TEXT\" VALUE=\"");
                if (
$w_fields[$I] !=   "")
                    print (  
"$w_fields[$I]");
                else
                    print (  
"");
                print(  
"\" SIZE=35></TD>\n".
                  
"</TR>\n");
    }
        print(  
"<TR><TD COLSPAN=\"2\">");
        print(  
"<INPUT TYPE=\"RESET\" NAME=\"reset\" VALUE=\"Clear\">\n");
        if ( !
$w_mykey ) {
            print(  
"<INPUT TYPE=\"SUBMIT\" NAME=\"sub\" VALUE=\"Add\">\n");
        } else {
            print(  
"<INPUT TYPE=\"SUBMIT\" NAME=\"del\" VALUE=\"Delete\">\n");
            print(  
"<INPUT TYPE=\"SUBMIT\" NAME=\"sub\" VALUE=\"Update\">\n");
        }
        print (  
"</TD></TR></TABLE></FORM>\n");
        return;
    }
function 
verify_data(&$w_mykey,&$w_fields){
      
/* 发现错误时报告给用户 */
    
global  $field_separator;
    global  
$fields;
    
chop($w_mykey); ereg_replace(  "\n",  "",$w_mykey);
    
ereg_replace($field_separator,  " ",$w_mykey);
    for (
$I=0;$I count($fields) ; $I++)  {
    
chop($w_fields[$I]);ereg_replace(  "\n",  "",$w_fields[$I]);
    
ereg_replace($field_separator,  " ",$w_fields[$I]);
    }
      
// 自定义检查错误例程
    
if ( $w_mykey ==   "") {
        
$err 1;
        echo   
"ERROR : Key cannot be null\n";
    }
  return 
$err;
}
/*
开始时显示所有记录
 */
function print_front_page($mydbm) {
      
/* may be some header here? */
    
global $field_separator;
    global 
$fields;
    print(  
"<small><I>Click on # to  edit/delete.</I></small>\n");
    print(  
"<TABLE WIDTH=\"100%\" BORDER=\"0\" CELLSPACING=\"1\"".
          
"CELLPADDING=\"0\">\n");
    print(  
"<TR><TH><B>#</B></TH><TH><B>Key</B></TH>\n");
    for (
$I=0;$I count($fields) ; $I++)
        print(  
"<TH><B>$fields[$I]</B></TH>\n");
    print(  
"</TR>\n");
    
$mykey dbmfirstkey($mydbm);
    
$recno=0;
    while (
$mykey) {
        
$record[$mykey]=dbmfetch($mydbm,$mykey);
        
$mykey dbmnextkey($mydbm,$mykey);
    }
    if ( 
count($record) > ) {
    
asort($record);
    for(
reset($record);$mykey=key($record); next($record)){
        
$recno++;
        
$w_fieldsexplode($field_separator,$record[$mykey]);
        print(  
"<TR><TH><A HREF=\"$PHP_SELF?mykey=$mykey\"><B>$recno</B></A></TH>\n");
        print(  
"<TD><B>$mykey</B></TH>\n");
      for (
$I=0;$I count($fields) ; $I++)
            print(  
"<TD> $w_fields[$I] </TD>\n");
        print(  
"</TR>\n");
    }
    }
    print(  
"</TABLE>\n");
    print(  
"<A NAME=\"addit\"></A><BR><BR><BR><H3>Add Record</H3>\n");
    
print_one_record(  "",  "");
    return;
}
// 主程序段
// 限制页面有效时间
header(  "Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header(  "Last-Modified: " Gmdate(  "D, d M Y H:I:s") .   "GMT");
header(  "Cache-Control: no-cache, must-revalidate");
header(  "Pragma: no-cache");

/*
 * 如果不存在主键则只显示增加表单
 * 如果存在主键则显示记录和增加记录表单
 * 如果是动作是增加/删除数据则回到第一页
*/
    
$to_print_frontpage 1;
    if ( 
$del $action =   "delete";
    if ( 
$sub ==   "Add" $action =   "add";
    if ( 
$sub ==   "Update" $action =   "update";
    if( 
$mykey )  {
      for (
$I=0;$I count($fields) ; $I++)
            
$w_fields[$I] = ${$fields[$I]};
        if( 
$action==  "update") {
              
/* 修改数据 */
            
if (0==verify_data($mykey,$w_fields)) {
                
$record=implode($field_separator,$w_fields);
                
dbmreplace($dbm,$mykey,$record);
            } else {
                
print_one_record($mykey,$w_fields);
                
$to_print_frontpage=0;
            }
        } elseif ( 
$action==  "delete") {
              
/* 删除数据 */
            
if (dbmdelete($dbm,$mykey)){
                print(  
"<B>Record for $mykey could not be deleted</B>\n");
            }
        } elseif ( 
$action==  "add") {
              
/* 插入数据 */
              /* 最好先校验数据*/
            
if (0==verify_data($mykey,$w_fields)) {
                
$record=implode($field_separator,$w_fields);
                if (
1==dbminsert($dbm,$mykey,$record)){
                    print(  
"<B>Key $mykey already exists with these values</B>\n");
                    
$record=dbmfetch($dbm,$mykey);
                    
$w_fieldsexplode($field_separator,$record);
                    
print_one_record($mykey,$w_fields);
                    
$to_print_frontpage=0;
                }
            } else {
                
print_one_record($mykey,$w_fields);
                
$to_print_frontpage=0;
            }
        } else {
              
/* 没有任何操作,则显示所有记录 */
            
$record=dbmfetch($dbm,$mykey);
            
$w_fieldsexplode($field_separator,$record);
            
print_one_record($mykey,$w_fields);
            
$to_print_frontpage=0;
        }
    }
    if( 
$to_print_frontpage==)print_front_page($dbm);
    
dbmclose($dbm);
?>