栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

加强版phplib的DB类

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

加强版phplib的DB类

复制代码 代码如下:




class DB_Sql 
{

  
  var $Host     = "";
  var $Database = "";
  var $User     = "";
  var $Password = "";

  
  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";

  
  var $Record   = array();
  var $Row;

  
  var $Errno    = 0;
  var $Error    = "";

  
  var $type     = "mysql";
  //var $revision = "1.2";

  
  var $link_ID  = 0;
  var $Query_ID = 0;

  var $locked   = false;      ## set to true while we have a lock

  
  function DB_Sql() {
    $this->query($query);
  }

  
  function link_id() {
    return $this->link_ID;
  }

  function query_id() {
    return $this->Query_ID;
  }

  
  function connect($Database = "", $Host = "", $User = "", $Password = "") {
    
    if ("" == $Database) 
      $Database = $this->Database;

    if ("" == $Host) 
      $Host     = $this->Host;

    if ("" == $User) 
      $User     = $this->User;

    if ("" == $Password) 
      $Password = $this->Password;

      
    
    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;
  }

  
  function free() {
      @mysql_free_result($this->Query_ID);
      $this->Query_ID = 0;
  }

  
  function query($Query_String) {
    
    if ($Query_String == "")
      
      return 0;

    if (!$this->connect()) {
      return 0; 
    };

    # New query, discard previous result.
    if ($this->Query_ID) {
      $this->free();
    }

    if ($this->Debug)
      printf("Debug: query = %s
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;
  }

  
  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;
  }

  
  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.");

      
      @mysql_data_seek($this->Query_ID, $this->num_rows());
      $this->Row = $this->num_rows();
      return 0;
    }

    return 1;
  }

  
  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;
  }

  
  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);
  }

  
  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];
    }
  }

  
  function nextid($seq_name) {
    
    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;
      }
    }

    
    $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;
    }

    
    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($locked) {
      $this->unlock();
    }

    return $nextid;
  }

  
  function metadata($table = "", $full = false) {
    $count = 0;
    $id    = 0;
    $res   = array();

    

    // 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;
  }

  
  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;
  }

  
  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("Database error: %s
n", $msg);
    printf("MySQL Error: %s (%s)
n",
      $this->Errno,
      $this->Error);
  }

 
 //----------------------------------
 // 模块: 自定义函数
 // 功能: 部分实用的数据库处理方法
 // 作者: heiyeluren
 // 时间: 2005-12-26
 //----------------------------------

 
 function execute($sql)
 {
  if (empty($sql))
  {
   $this->error("Invalid parameter");
  }
  if (!$this->query($sql))
  {
   return false;
  }
  return true;
 }

 
 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;
 }

 
 function get_one($sql)
 {
  $this->query($sql);
  if (!$this->next_record())
  {
   return 0;
  }
  return $this->Record;
 }

 
 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;
 }

 
 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;
 }

 
 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];
 }

 
 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;
 }

 
 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;
 }

 
 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;
 }

 
 function error($msg="")
 {
  echo "Error: $msgn
n";
  exit();
 }

 
 function get_insert_id()
 {
  return mysql_insert_id($this->link_ID);
 }

 
 function close()
 {
  return mysql_close($this->link_ID);
 } 
}
?>

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/53304.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号