加强版phplib的DB类


Posted in PHP onMarch 31, 2008
<?php 
/**************************************************************************************************************** 
为了便于自己的开发,又不想使用ADODB、PEAR::DB这样的庞然大物, 
就用在PHPLib DB类的基础上、参考PEAR::DB类,封装的DB类,简单好使,非常方便。 
MySQL有效 [ 连接数据库 ] 
//包含数据库处理类文件 
include_once("database.inc.php"); 
//本地数据库配置 
define("DB_HOST",    "localhost"); //数据库服务器 
define("DB_USER_NAME",   "root");  //数据库用户名 
define("DB_USER_PASS",   "");   //密码 
define("DB_DATABASE",   "test");  //数据库 
//连接本地数据库 
$db = new DB_Sql(); 
$db->connect(DB_DATABASE, DB_HOST, DB_USER_NAME, DB_USER_PASS); 
[ 使用方法 ] 
//获取所有记录 
$sql = "SELECT * FROM table1"; 
$all_record = $db->get_all($sql); 
//获取一条 
$sql = "SELECT * FROM table1 WHERE id = '1'"; 
$one_row = $db->get_one($sql); 
//分页查询,提取20条记录 
$sql = "SELECT * FROM table1"; 
$page_record = $db->limit_query($sql, $start=0, $offset=20, $order="ORDER BY id DESC"); 
//提取指定数目的记录 
$sql = "SELECT * FROM table1"; 
$limit_record = $db->get_limit($sql,10); 
//统计记录数,统计所有类型为学生的 
$count = $db->count("table1", "id", "type = 'student'"); 
//插入一条记录 
$info_array = array( 
  "name"  => "heiyeluren", 
  "type"  => "student", 
  "age"  => "22", 
  "gender" => "boy" 
 ); 
$db->insert("table1", $info_array); 
//更新一条记录 
$info_array = array( 
  "name"  => "heiyeluren", 
  "type"  => "teacher", 
  "age"  => "22", 
  "gender" => "boy" 
 ); 
$db->update("table1", $info_array, "name = 'heiyeluren'"); 
//删除记录 
$db->delete("table1", "name = 'heiyeluren'"); 
//执行一条无结果集的SQL 
$db->execute("DELETE FROM table1 WHERE name = 'heiyeluren'"); 
********************************************************************************************************/ 
/** 
 * 文件: database.inc.php 
 * 描述: 数据库操作类 
 * 说明: 本库使用PHPLib DB库作为核心, 同时增加一些实用方法, 详细参考注释 
 */ 
class DB_Sql  
{ 
  /* public: connection parameters */ 
  var $Host     = ""; 
  var $Database = ""; 
  var $User     = ""; 
  var $Password = ""; 
  /* public: configuration parameters */ 
  var $Auto_Free     = 1;     ## Set to 1 for automatic mysql_free_result() 
  var $Debug         = 0;     ## Set to 1 for debugging messages. 
  var $Halt_On_Error = "yes"; ## "yes" (halt with message), "no" (ignore errors quietly), "report" (ignore errror, but spit a warning) 
  var $PConnect      = 0;     ## Set to 1 to use persistent database connections 
  var $Seq_Table     = "db_sequence"; 
  /* public: result array and current row number */ 
  var $Record   = array(); 
  var $Row; 
  /* public: current error number and error text */ 
  var $Errno    = 0; 
  var $Error    = ""; 
  /* public: this is an api revision, not a CVS revision. */ 
  var $type     = "mysql"; 
  //var $revision = "1.2"; 
  /* private: link and query handles */ 
  var $Link_ID  = 0; 
  var $Query_ID = 0; 
  var $locked   = false;      ## set to true while we have a lock 
  /* public: constructor */ 
  function DB_Sql() { 
    $this->query($query); 
  } 
  /* public: some trivial reporting */ 
  function link_id() { 
    return $this->Link_ID; 
  } 
  function query_id() { 
    return $this->Query_ID; 
  } 
  /* public: connection management */ 
  function connect($Database = "", $Host = "", $User = "", $Password = "") { 
    /* Handle defaults */ 
    if ("" == $Database)  
      $Database = $this->Database; 
    if ("" == $Host)  
      $Host     = $this->Host; 
    if ("" == $User)  
      $User     = $this->User; 
    if ("" == $Password)  
      $Password = $this->Password; 
       
    /* establish connection, select database */ 
    if ( 0 == $this->Link_ID ) { 
      if(!$this->PConnect) { 
        $this->Link_ID = mysql_connect($Host, $User, $Password); 
      } else { 
        $this->Link_ID = mysql_pconnect($Host, $User, $Password);  
      } 
      if (!$this->Link_ID) { 
        $this->halt("connect($Host, $User, \$Password) failed."); 
        return 0; 
      } 
      if (!@mysql_select_db($Database,$this->Link_ID)) { 
        $this->halt("cannot use database ".$Database); 
        return 0; 
      } 
    } 
    return $this->Link_ID; 
  } 
  /* public: discard the query result */ 
  function free() { 
      @mysql_free_result($this->Query_ID); 
      $this->Query_ID = 0; 
  } 
  /* public: perform a query */ 
  function query($Query_String) { 
    /* No empty queries, please, since PHP4 chokes on them. */ 
    if ($Query_String == "") 
      /* The empty query string is passed on from the constructor, 
       * when calling the class without a query, e.g. in situations 
       * like these: '$db = new DB_Sql_Subclass;' 
       */ 
      return 0; 
    if (!$this->connect()) { 
      return 0; /* we already complained in connect() about that. */ 
    }; 
    # New query, discard previous result. 
    if ($this->Query_ID) { 
      $this->free(); 
    } 
    if ($this->Debug) 
      printf("Debug: query = %s<br>\n", $Query_String); 
    $this->Query_ID = @mysql_query($Query_String,$this->Link_ID); 
    $this->Row   = 0; 
    $this->Errno = mysql_errno(); 
    $this->Error = mysql_error(); 
    if (!$this->Query_ID) { 
      $this->halt("Invalid SQL: ".$Query_String); 
    } 
    # Will return nada if it fails. That's fine. 
    return $this->Query_ID; 
  } 
  /* public: walk result set */ 
  function next_record() { 
    if (!$this->Query_ID) { 
      $this->halt("next_record called with no query pending."); 
      return 0; 
    } 
    $this->Record = @mysql_fetch_array($this->Query_ID); 
    $this->Row   += 1; 
    $this->Errno  = mysql_errno(); 
    $this->Error  = mysql_error(); 
    $stat = is_array($this->Record); 
    if (!$stat && $this->Auto_Free) { 
      $this->free(); 
    } 
    return $stat; 
  } 
  /* public: position in result set */ 
  function seek($pos = 0) { 
    $status = @mysql_data_seek($this->Query_ID, $pos); 
    if ($status) 
      $this->Row = $pos; 
    else { 
      $this->halt("seek($pos) failed: result has ".$this->num_rows()." rows."); 
      /* half assed attempt to save the day,  
       * but do not consider this documented or even 
       * desireable behaviour. 
       */ 
      @mysql_data_seek($this->Query_ID, $this->num_rows()); 
      $this->Row = $this->num_rows(); 
      return 0; 
    } 
    return 1; 
  } 
  /* public: table locking */ 
  function lock($table, $mode = "write") { 
    $query = "lock tables "; 
    if(is_array($table)) { 
      while(list($key,$value) = each($table)) { 
        // text keys are "read", "read local", "write", "low priority write" 
        if(is_int($key)) $key = $mode; 
        if(strpos($value, ",")) { 
          $query .= str_replace(",", " $key, ", $value) . " $key, "; 
        } else { 
          $query .= "$value $key, "; 
        } 
      } 
      $query = substr($query, 0, -2); 
    } elseif(strpos($table, ",")) { 
      $query .= str_replace(",", " $mode, ", $table) . " $mode"; 
    } else { 
      $query .= "$table $mode"; 
    } 
    if(!$this->query($query)) { 
      $this->halt("lock() failed."); 
      return false; 
    } 
    $this->locked = true; 
    return true; 
  } 
  function unlock() { 
    // set before unlock to avoid potential loop 
    $this->locked = false; 
    if(!$this->query("unlock tables")) { 
      $this->halt("unlock() failed."); 
      return false; 
    } 
    return true; 
  } 
  /* public: evaluate the result (size, width) */ 
  function affected_rows() { 
    return @mysql_affected_rows($this->Link_ID); 
  } 
  function num_rows() { 
    return @mysql_num_rows($this->Query_ID); 
  } 
  function num_fields() { 
    return @mysql_num_fields($this->Query_ID); 
  } 
  /* public: shorthand notation */ 
  function nf() { 
    return $this->num_rows(); 
  } 
  function np() { 
    print $this->num_rows(); 
  } 
  function f($Name) { 
    if (isset($this->Record[$Name])) { 
      return $this->Record[$Name]; 
    } 
  } 
  function p($Name) { 
    if (isset($this->Record[$Name])) { 
      print $this->Record[$Name]; 
    } 
  } 
  /* public: sequence numbers */ 
  function nextid($seq_name) { 
    /* if no current lock, lock sequence table */ 
    if(!$this->locked) { 
      if($this->lock($this->Seq_Table)) { 
        $locked = true; 
      } else { 
        $this->halt("cannot lock ".$this->Seq_Table." - has it been created?"); 
        return 0; 
      } 
    } 
    /* get sequence number and increment */ 
    $q = sprintf("select nextid from %s where seq_name = '%s'", 
               $this->Seq_Table, 
               $seq_name); 
    if(!$this->query($q)) { 
      $this->halt('query failed in nextid: '.$q); 
      return 0; 
    } 
    /* No current value, make one */ 
    if(!$this->next_record()) { 
      $currentid = 0; 
      $q = sprintf("insert into %s values('%s', %s)", 
                 $this->Seq_Table, 
                 $seq_name, 
                 $currentid); 
      if(!$this->query($q)) { 
        $this->halt('query failed in nextid: '.$q); 
        return 0; 
      } 
    } else { 
      $currentid = $this->f("nextid"); 
    } 
    $nextid = $currentid + 1; 
    $q = sprintf("update %s set nextid = '%s' where seq_name = '%s'", 
               $this->Seq_Table, 
               $nextid, 
               $seq_name); 
    if(!$this->query($q)) { 
      $this->halt('query failed in nextid: '.$q); 
      return 0; 
    } 
    /* if nextid() locked the sequence table, unlock it */ 
    if($locked) { 
      $this->unlock(); 
    } 
    return $nextid; 
  } 
  /* public: return table metadata */ 
  function metadata($table = "", $full = false) { 
    $count = 0; 
    $id    = 0; 
    $res   = array(); 
    /* 
     * Due to compatibility problems with Table we changed the behavior 
     * of metadata(); 
     * depending on $full, metadata returns the following values: 
     * 
     * - full is false (default): 
     * $result[]: 
     *   [0]["table"]  table name 
     *   [0]["name"]   field name 
     *   [0]["type"]   field type 
     *   [0]["len"]    field length 
     *   [0]["flags"]  field flags 
     * 
     * - full is true 
     * $result[]: 
     *   ["num_fields"] number of metadata records 
     *   [0]["table"]  table name 
     *   [0]["name"]   field name 
     *   [0]["type"]   field type 
     *   [0]["len"]    field length 
     *   [0]["flags"]  field flags 
     *   ["meta"][field name]  index of field named "field name" 
     *   This last one could be used if you have a field name, but no index. 
     *   Test:  if (isset($result['meta']['myfield'])) { ... 
     */ 
    // if no $table specified, assume that we are working with a query 
    // result 
    if ($table) { 
      $this->connect(); 
      $id = @mysql_list_fields($this->Database, $table); 
      if (!$id) { 
        $this->halt("Metadata query failed."); 
        return false; 
      } 
    } else { 
      $id = $this->Query_ID;  
      if (!$id) { 
        $this->halt("No query specified."); 
        return false; 
      } 
    } 
    $count = @mysql_num_fields($id); 
    // made this IF due to performance (one if is faster than $count if's) 
    if (!$full) { 
      for ($i=0; $i<$count; $i++) { 
        $res[$i]["table"] = @mysql_field_table ($id, $i); 
        $res[$i]["name"]  = @mysql_field_name  ($id, $i); 
        $res[$i]["type"]  = @mysql_field_type  ($id, $i); 
        $res[$i]["len"]   = @mysql_field_len   ($id, $i); 
        $res[$i]["flags"] = @mysql_field_flags ($id, $i); 
      } 
    } else { // full 
      $res["num_fields"]= $count; 
      for ($i=0; $i<$count; $i++) { 
        $res[$i]["table"] = @mysql_field_table ($id, $i); 
        $res[$i]["name"]  = @mysql_field_name  ($id, $i); 
        $res[$i]["type"]  = @mysql_field_type  ($id, $i); 
        $res[$i]["len"]   = @mysql_field_len   ($id, $i); 
        $res[$i]["flags"] = @mysql_field_flags ($id, $i); 
        $res["meta"][$res[$i]["name"]] = $i; 
      } 
    } 
    // free the result only if we were called on a table 
    if ($table) { 
      @mysql_free_result($id); 
    } 
    return $res; 
  } 
  /* public: find available table names */ 
  function table_names() { 
    $this->connect(); 
    $h = @mysql_query("show tables", $this->Link_ID); 
    $i = 0; 
    while ($info = @mysql_fetch_row($h)) { 
      $return[$i]["table_name"]      = $info[0]; 
      $return[$i]["tablespace_name"] = $this->Database; 
      $return[$i]["database"]        = $this->Database; 
      $i++; 
    } 
    @mysql_free_result($h); 
    return $return; 
  } 
  /* private: error handling */ 
  function halt($msg) { 
    $this->Error = @mysql_error($this->Link_ID); 
    $this->Errno = @mysql_errno($this->Link_ID); 
    if ($this->locked) { 
      $this->unlock(); 
    } 
    if ($this->Halt_On_Error == "no") 
      return; 
    $this->haltmsg($msg); 
    if ($this->Halt_On_Error != "report") 
      die("Session halted."); 
  } 
  function haltmsg($msg) { 
    printf("</td></tr></table><b>Database error:</b> %s<br>\n", $msg); 
    printf("<b>MySQL Error</b>: %s (%s)<br>\n", 
      $this->Errno, 
      $this->Error); 
  } 
  
 //---------------------------------- 
 // 模块: 自定义函数 
 // 功能: 部分实用的数据库处理方法 
 // 作者: heiyeluren 
 // 时间: 2005-12-26 
 //---------------------------------- 
 /** 
  * 方法: execute($sql) 
  * 功能: 执行一条SQL语句,主要针对没有结果集返回的SQL 
  * 参数: $sql 需要执行的SQL语句,例如:execute("DELETE FROM table1 WHERE id = '1'") 
  * 返回: 更新成功返回True,失败返回False 
  */ 
 function execute($sql) 
 { 
  if (empty($sql)) 
  { 
   $this->error("Invalid parameter"); 
  } 
  if (!$this->query($sql)) 
  { 
   return false; 
  } 
  return true; 
 } 
 /** 
  * 方法: get_all($sql) 
  * 功能: 获取SQL执行的所有记录 
  * 参数: $sql  需要执行的SQL,例如: get_all("SELECT * FROM Table1") 
  * 返回: 返回包含所有查询结果的二维数组 
  */ 
 function get_all($sql) 
 { 
  $this->query($sql); 
  $result_array = array(); 
  while($this->next_record()) 
  { 
   $result_array[] = $this->Record; 
  } 
  if (count($result_array)<=0) 
  { 
   return 0; 
  } 
  return $result_array; 
 } 
 /** 
  * 方法: get_one($sql) 
  * 功能: 获取SQL执行的一条记录 
  * 参数: $sql 需要执行的SQL,例如: get_one("SELECT * FROM Table1 WHERE id = '1'") 
  * 返回: 返回包含一条查询结果的一维数组 
  */ 
 function get_one($sql) 
 { 
  $this->query($sql); 
  if (!$this->next_record()) 
  { 
   return 0; 
  } 
  return $this->Record; 
 } 
 /** 
  * 方法: get_limit($sql, $limit) 
  * 功能: 获取SQL执行的指定数量的记录 
  * 参数:  
  * $sql  需要执行的SQL,例如: SELECT * FROM Table1 
  * $limit 需要限制的记录数 
  * 例如  需要获取10条记录, get_limit("SELECT * FROM Table1", 10); 
  * 
  * 返回: 返回包含所有查询结果的二维数组 
  */ 
 function get_limit($sql, $limit) 
 { 
  $this->query($sql); 
  $result_array = array(); 
  for ($i=0; $i<$limit&&$this->next_record(); $i++) 
  { 
   $result_array[] = $this->Record; 
  } 
  if (count($result_array) <= 0) 
  { 
   return 0; 
  } 
  return $result_array; 
 } 
 /** 
  * 方法: limit_query($sql, $start=0, $offset=20, $order="") 
  * 功能: 为分页的获取SQL执行的指定数量的记录 
  * 参数:  
  * $sql  需要执行的SQL,例如: SELECT * FROM Table1 
  * $start 记录的开始数, 缺省为0 
  * $offset 记录的偏移量,缺省为20 
  * $order 排序方式,缺省为空,例如:ORDER BY id DESC 
  * 例如  需要获取从0到10的记录并且按照ID号倒排, get_limit("SELECT * FROM Table1", 0, 10, "ORDER BY id DESC"); 
  * 
  * 返回: 返回包含所有查询结果的二维数组 
  */ 
 function limit_query($sql, $start=0, $offset=20, $order="") 
 { 
  $sql = $sql ." $order  LIMIT $start,$offset"; 
  $this->query($sql); 
  $result = array(); 
  while($this->next_record()) 
  { 
   $result[] = $this->Record; 
  } 
  if (count($result) <=0 ) 
  { 
   return 0; 
  } 
  return $result; 
 } 
 /** 
  * 方法: count($table,$field="*", $where="") 
  * 功能: 统计表中数据总数 
  * 参数:  
  * $table 需要统计的表名 
  * $field 需要统计的字段,默认为* 
  * $where 条件语句,缺省为空 
  * 例如  按照ID统计所有年龄小于20岁的用户, count("user_table", "id", "user_age < 20") 
  * 
  * 返回: 返回统计结果的数字 
  */ 
 function count($table,$field="*", $where="") 
 { 
  $sql = (empty($where) ? "SELECT COUNT($field) FROM $table" : "SELECT COUNT($field) FROM $table WHERE $where"); 
  $result = $this->get_one($sql); 
  if (!is_array($result)) 
  { 
   return 0; 
  } 
  return $result[0]; 
 } 
 /** 
  * 方法: insert($table,$dataArray) 
  * 功能: 插入一条记录到表里 
  * 参数:  
  * $table  需要插入的表名 
  * $dataArray 需要插入字段和值的数组,键为字段名,值为字段值,例如:array("user_name"=>"张三", "user_age"=>"20岁"); 
  * 例如   比如插入用户张三,年龄为20, insert("users", array("user_name"=>"张三", "user_age"=>"20岁")) 
  * 
  * 返回: 插入记录成功返回True,失败返回False 
  */ 
 function insert($table,$dataArray) 
 { 
  if (!is_array($dataArray) || count($dataArray)<=0) 
  { 
   $this->error("Invalid parameter"); 
  } 
  while(list($key,$val) = each($dataArray)) 
  { 
   $field .= "$key,"; 
   $value .= "'$val',"; 
  } 
  $field = substr($field, 0, -1); 
  $value = substr($value, 0, -1); 
  $sql = "INSERT INTO $table ($field) VALUES ($value)"; 
  if (!$this->query($sql)) 
  { 
   return false; 
  } 
  return true; 
 } 
 /** 
  * 方法: update($talbe, $dataArray, $where) 
  * 功能: 更新一条记录 
  * 参数:  
  * $table  需要更新的表名 
  * $dataArray 需要更新字段和值的数组,键为字段名,值为字段值,例如:array("user_name"=>"张三", "user_age"=>"20岁"); 
  * $where  条件语句 
  * 例如   比如更新姓名为张三的用户为李四,年龄为21 
  *    update("users",  array("user_name"=>"张三", "user_age"=>"20岁"),  "user_name='张三'") 
  * 
  * 返回: 更新成功返回True,失败返回False 
  */ 
 function update($talbe, $dataArray, $where) 
 { 
  if (!is_array($dataArray) || count($dataArray)<=0) 
  { 
   $this->error("Invalid parameter"); 
  } 
  while(list($key,$val) = each($dataArray)) 
  { 
   $value .= "$key = '$val',"; 
  } 
  $value = substr($value, 0, -1); 
  $sql = "UPDATE $talbe SET $value WHERE $where"; 
  if (!$this->query($sql)) 
  { 
   return false; 
  } 
  return true; 
 } 
 /** 
  * 方法: delete($table, $where) 
  * 功能: 删除一条记录 
  * 参数:  
  * $table  需要删除记录的表名 
  * $where  需要删除记录的条件语句 
  * 例如   比如要删除用户名为张三的用户,delete("users",  "user_name='张三'") 
  * 
  * 返回: 更新成功返回True,失败返回False 
  */ 
 function delete($table, $where) 
 { 
  if (empty($where)) 
  { 
   $this->error("Invalid parameter"); 
  } 
  $sql = "DELETE FROM $table WHERE $where"; 
  if (!$this->query($sql)) 
  { 
   return false; 
  } 
  return true; 
 } 
 /** 
  * 方法: error($msg="") 
  * 功能: 显示错误信息后中止脚本 
  * 参数: $msg 需要显示的错误信息 
  * 返回: 无返回 
  */ 
 function error($msg="") 
 { 
  echo "<strong>Error</strong>: $msg\n<br>\n"; 
  exit(); 
 } 
 /** 
  * 方法:get_insert_id() 
  * 功能:获取最后插入的ID 
  * 参数: 无参数 
  * 返回:关闭成功返回ID,失败返回0 
  */ 
 function get_insert_id() 
 { 
  return mysql_insert_id($this->Link_ID); 
 } 
 /** 
  * 方法:close() 
  * 功能:关闭当前数据库连接 
  * 参数: 无参数 
  * 返回:关闭成功返回true,失败返回false 
  */ 
 function close() 
 { 
  return mysql_close($this->Link_ID); 
 }  
} 
?>
PHP 相关文章推荐
简单的php 验证图片生成函数
May 21 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
Feb 01 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
Aug 09 PHP
php生成excel列名超过26列大于Z时的解决方法
Dec 29 PHP
php+mysql查询优化简单实例
Jan 13 PHP
php实现的简单日志写入函数
Mar 31 PHP
PHP+Javascript实现在线拍照功能实例
Jul 18 PHP
php 从一个数组中随机的取出若干个不同的数实例
Dec 31 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
Jul 21 PHP
PHP CURL与java http使用方法详解
Jan 26 PHP
PHP设计模式之单例模式定义与用法分析
Mar 26 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 PHP
PHP截取汉字乱码问题解决方法mb_substr函数的应用
Mar 30 #PHP
PHP5中的时间相差8小时的解决办法
Mar 28 #PHP
php heredoc和phpwind的模板技术使用方法小结
Mar 28 #PHP
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
Mar 28 #PHP
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 #PHP
php中文字符截取防乱码
Mar 28 #PHP
关于Intype一些小问题的解决办法
Mar 28 #PHP
You might like
全国FM电台频率大全 - 4 山西省
2020/03/11 无线电
PHP 编程的 5个良好习惯
2009/02/20 PHP
PHP Ajax中文乱码问题解决方法
2009/02/27 PHP
laravel安装和配置教程
2014/10/29 PHP
PHP入门教程之会话控制技巧(cookie与session)
2016/09/11 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
jQuery 性能优化指南(2)
2009/05/21 Javascript
js 学习笔记(三)
2009/12/29 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
关于query Javascript CSS Selector engine
2013/04/12 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
nodejs之koa2请求示例(GET,POST)
2018/08/07 NodeJs
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
Python列表推导式实现代码实例
2020/09/09 Python
详解HTML5表单新增属性
2016/12/21 HTML / CSS
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
经典优秀个人求职自荐信格式
2013/09/25 职场文书
中文专业毕业生自荐信
2013/10/28 职场文书
遗体告别仪式答谢词
2014/01/23 职场文书
班主任工作经验材料
2014/02/02 职场文书
欢迎横幅标语
2014/06/17 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
就业指导讲座心得体会
2016/01/15 职场文书