/*mysql 簡單類 by joffe q89949401 圍脖@狂code詩人;
本類別全靜態 使用的時候直接include後 用mysql::方法()名即可 由於類別在php5裡面全域可視,所以不必擔心變數範圍的問題.如果有什麼意見 請圍脖私訊||qq郵件;
目前沒有與預存程序有關的方法,當然預存程序一般是創建資料庫的時候做的.
config檔需要設定以下常數資訊:
LIB:類存放位置
DEBUG:是否開啟debug(如果開啟會輸出錯誤訊息追蹤)
TB_EX:資料庫表前綴;
增加了select del update insert big_select big_del函數
*/
-
/*mysql 簡單類別by joffe q89949401 圍脖>/*mysql 簡單類別by joffe q89949401 圍脖@狂code詩人;
- 本類全靜態使用的時候直接include後用mysql::@狂code詩人;
- 本類全靜態使用的時候直接用mysql::@方法狂code方法()名即可由於類別在php5裡面全局可視,所以不必擔心變數範圍的問題.如果有什麼意見請圍脖私訊||qq郵件;
- 目前沒有與預存程序有關的方法,當然預存程序一般是建立資料庫的時候做的.
- config檔需要設定以下常數資訊:
- LIB:類別存放位置
- DEBUG:是否開啟debug(如果開啟會輸出錯誤訊息追蹤)
- TB_EX:資料庫錶字首;
- */
- defined('LIB') 或 die('Missing config!!');
- final class mysql {
- /**
- * 查詢總數
- *
- * @var int
- */
- publicsql {
- /**
- * 連接句柄
- *
- * @var object
- */
- public static $querynum = 0;
- /**
- * 建構子
- *
- * @param string $dbhost 主機名稱
- * @param string $dbuser 使用者
- * @param string $dbpw 密碼
- @param string $資料庫名稱
- * @param int $pconnect 是否持續連線
- */
- public static $link;
- /*
- 表前綴
- @var string 下列方法需要在設定檔中設定TB_EX作為表的前綴
- */
-
- static function add_ex($tb){
- return TB_EX.$tb_ex.$tb;
- }
- /*mysql資料庫是否使用嚴格的類型(mysql類型沒開啟自動轉換)預設為false,表示mysql有開啟類型轉換,這個變數目前只要是用於insert函數的單引號在沒有自動轉換的mysql裡面的問題,可能將來會增加相關函數
-
- */
- public static $is_type_tight=false;
-
- /**
- * 選擇資料庫
- *
- * @param string $dbname
- * @return
- */
- static function connent($dbhost, $dbuser, $dbpw, $dbname = " ",$dbcharset, $pconnect = 0) {
- if($pconnect) {
- if(!self::$link = @mysql_pconnect($dbhost, $dbuser, $dbpw)) {
- self ::halt("Can not connect to MySQL server");
- }
- } else {
- if(!self::$link = @mysql_connect($dbhost, $dbuser, $dbpw)) {
- self::halt("Can not connect to MySQL server");
- }
- }
- if(self::version() > "4.1") {
- if($dbcharset ) {
- mysql_query("SET character_set_connection={$dbcharset}, character_set_results=$dbcharset, character_set_client=binary", self::$link);
- } 5.0.1") {
- mysql_query("SET sql_mode=''", self::$link);
- }
- }
- if($dbname) {
- mysql_select_db($dbname , self::$link);
- }
- }
- /**
- * 取出結果集中一筆記錄
- *
- * @param object $query
- * @param int $result_type
- * @return array
- */
- static function select_db($dbname) {
- ::return mysql_select_db($dbname, self $link);
- }
- /**
- * QuerySQL
- *
- * @param string $sql
- * @param string $type
- * @return object
- */
- static function fetch_array($query, $result_type = MYSQL_ASSOC) { //預設只取關聯數組不取數字數組.
- return mysql_fetch_array($query, $result_type);
- }
-
- /**
- * 取影響條數
- *
- * @return int
- */
- static function query($sql, $type = "") {
- $func = $type == "UNBUFFERED" && @function_exists("mysql_unbuffered_query") ?
- "mysql_unbuffered_query" : "mysql_query";
- if(!($query = $func($link($link)($link) ) && $type != "SILENT") {
- self::halt("MySQL Query Error", $sql);
- }
- self::$querynum++;
- return $query;
- }
- /**
- * 回傳錯誤訊息
- *
- * @return array
- */
- static function affected_rows() {
- return mysql_affected_rows(self::$link);
- }
- ** /
- static function error() {
- return ((self::$link) ? mysql_error(self::$link) : mysql_error());
- }
- /**
- * 回傳錯誤碼
- *
- * @return int
- */
- static function errno() {
- return intval((self::$link) ? mysql_errno(self::$link) : mysql_errno());
- }
- /**
- * 回傳查詢結果
- *
- * @param object $query
- * @param string $row
- * @return mixed
- */
- static function result($query, $row,$flname=0) {
- $query = @mysql_result($query, $row,$flname);
- return $query;
- }
- /**
- * 結果條數
- *
- * @param object $query
- * @return int
- */
- static function num_rows($query) {
- $query = mysql_num_rows($query);
- return $query;
- }
- /**
- * 取總欄位
- *
- * @param object $query
- * @return int
- */
- static function num_fields($query) {
- return mysql_num_fields($query);
- }
- /**
- * 釋放結果集
- *
- * @param object $query
- * @return bool
- */ staticunction free_result($query) { return @mysql_free_result($query); }
- /**
- * 回傳自增ID
- *
- * @return int
- */
- 靜態函數insert_id() {
- return ($id = mysql_insert_id(self::$link)) >= 0 ? $id : self::$result( self::$query("SELECT last_insert_id()"), 0);
- }
- /**
- * 從結果集中取得一行作為枚舉數組
- *
- * @param object $query
- * @return array
- */
- 靜態函數fetch_row($query) {
- $query = mysql_fetch_row ($query);
- 回傳$query;
- }
- /**
- * 從結果集中取得列資訊並作為物件回傳
- *
- * @param object $query
- * @return object
- */
- 靜態函數fetch_fields($query) {
- return mysql_fetch_field($query);
- }
-
- 靜態函式select_affectedt_rows($rs){
- return mysql_affected_rows($rs,self::$link);
-
- }
- /**
- * 回傳mysql版本
- *
- * @return string
- */
- 靜態函式version() {
- return mysql_get_server_info(self::$link);
- }
- /**
- * 關閉連線
- *
- * @return bool
- */
- 靜態函式close() {
- return mysql_close(self::$link);
- }
- /**
- * 輸出錯誤訊息
- *
- * @param string $message
- * @param string $sql
- */
- 靜態函數halt($message = "", $sql = "") {
- @header( "內容類型:text/html; charset=utf-8");
-
- if (DEBUG==1){
- $debug = debug_backtrace();
- echo $message 。 “rn
SQL-->”。 $sql."rn ERROR_MESSAGE-->".self::error().
- "rn
--------------調試- --- ----------rn ";
- self::echoarray($debug);
- echo "rn
------ ----- --調試結束----------------";
-
- }else{
- echo 'SQL 錯誤';
- }
- @self: :rollback();
- exit;
- }
- ///// ////////////////////////以下是擴充的sql方法.//////
- /* 把佇列依照key value value的對應關係插入資料表表中
- table要插入的資料表
- 要注意這些擴充方法是沒自己給表有加外接的。
- */
- static function insert($table,$array ){
- $temp="";$temp2='';
- foreach($array as $key=>$value){
- if(self::$is_type_tight){
- if (is_string($value)){
- $temp .="$key,";$temp2 .="'$value',";
- }elseif(is_int($value||is_null($value)) ||is_float($value))){
- $value+=0;
- $temp .="$key,";$temp2 .="'$value',";
- }
- }else{
- $temp .="$key,";$temp2 .="'$value',";
- }
- }
- $temp = substr($temp,0,strlen ($temp)-1);
- $temp2 = substr($temp2,0,strlen($temp2)-1);
-
- $sql = "插入$table ($temp) VALUE( $temp2)";
- return self::query($sql);
- }
-
-
- 靜態函數del ($table,$where){
- $sql = "刪除FROM {$table} where {$where}";
- return self::query($sql);
- }
-
- 靜態函數update($table,$array,$where){
- foreach ($array as $key=>$value){
- $temp .= "$key='$value',";
- }
- $temp = substr($temp,0 ,strlen($temp)-1);
- $sql = "update {$table} set ($temp) where {$where} ";
- return self::query($sql);
- }
-
- /*進行資料庫查詢選擇參數不定
- 參數說明:所有參數必須是字串
- 第一個參數必須是表名;
- 從第二個參數開始,
- 如果是寫上"where:XXX" 則認為是where條件;
- 如果寫上"xxx" 則認為是鍵值
- 如果寫上"by:XXX" 則認為是排序
- 如果寫上"limit:xxx,xxx" 則認為是分頁
-
- #參數不正確則傳回false; 成功回傳查詢後的佇列;
- */
- static function select(){
- $numargs = func_num_args();//取得參數個數;
- $where = "";$key ="";$limit=" ";$by="";
- if($numargs==0){return false;}
- //echo $numargs;
- if($numargs>= 2){
- $arg_list = func_get_args();
- $table = $arg_list[0];
- unset($arg_list[0]);
- // print_r($arg_list);
- foreach($arg_list as $k =>$value){
- if(preg_match("#^(where:)w#",$value)){
- $temp =explode(":", $value);
- $where = "WHERE {$temp[1]} " ;
- }elseif(preg_match("#^by:w#",$value)){
- $temp = 爆炸(":",$value);
- $by = "依{$temp[1]} 排序" ;
- }elseif(preg_match("#^limit:w#",$value)){
- $temp =explode(": ",$value);
- $limit = "limit {$temp[1]}";
- }else{
- $key .= "$value," ;
- }
- }
-
- if($key==""){
- $key = "*";
- }else{
- $key =substr($鍵,0,strlen($key) -1);
- }
-
- $sql_base="SELECT $key FROM $table";
- }
- if(!empty($where)){
- $sql_base .= " $where" ;
- }
- if(!empty($by)){
- $sql_base .= " $by";
- }
- if(!empty($limit)){
- $sql_base .= " $limit";
- }
- //echo $sql_base;
- //echo $by ;
- $rs = self::query($sql_base);
- $re=array();
- if(self::num_rows($rs)>=1){
- while($info = self : :fetch_array($rs)){
- $re[]=$info;
- }
- }
- self::free_result($rs);
- return $re;
- }
-
-
- /*回滾事務*/
- static function rollback(){
- self::query('rollback');
- }
- /*開始事務* /
- static function begin(){
- self::query('SET AUTOCOMMIT =0'); //失效自動提交;
- self::query('BEGIN') ;//開始一個事務;
- }
-
- /*提交事務*/
- static function commit() {
- self::query('commit');
- }
-
-
- 靜態函數echoarray($array){
- foreach($array as $k=>$v ){
- if(is_array($v)){
- if(is_array($v)){
- echo "
------------- ------------------- ";
- self::echoarray($v);
- }
- }else{
- if($k==='line')
- echo "$k -> " .$v." ";
- else
- echo "$k -> " .$v." ";
- }
- }
- }
-
- function get_server_info(){
- return mysql_get_server_info() ;
- }
-
-
- //是下面應付大數據的表的最佳化查詢
-
- //是下面應付大數據的表的最佳化查詢
-
-
-
- big_select 適合大規模的查詢,利用覆蓋索引實現忽略的偏移活動窗口,令查詢在覆蓋索引上偏移而不是在所有數據上,減少msql在數據上檢查,再把其他數據加入進來這樣更高效。但對於小規模數據,這種查詢反而相反地增加複雜度,增加優化器壓力。 舉個例子,如果你是limit 10000,20;mysql會先查出10020條資料重新丟棄10000這樣的操作成本非常大,利用這個函數可以有效提升效率,但如果是limit 20,那就會比直接select慢了一些
- @table string要查詢的表如"table1"
- @keys string要查詢的鍵值,多個鍵值用","分割如" key1,key2,key3"結束清晰", "學少用"*"且一些關鍵字請加上`;
- @Index string 主索引鍵或唯一索引鍵名,只需要一個如"id";
- @pagesize int 分頁大小,必須,你不會想那麼多資料全部出來吧
- @pageNo 頁碼,從0開始
- @orderby string 排序如"id desc";可空,但不建議空
- @where string 條件如"date >122424533"可空
- #回傳記憶體
- */
- static function big_select($table,$keys,$index,$pagesize,$pageNo,$ orderby=NULL,$where=NULL){
- $start=$pageNo*$pagesize;
- if($where){
- $sqlIndex="從{$table} 選擇{$index} where { $where}";
- }else {
- $sqlIndex="從{$table} 選擇{$index}";
- }
- if($orderby){
- $sqlIndex .= " ORDER BY {$orderby} 限制$start ,$pagesize";
- }else{
- $sqlIndex .=" ORDER BY Limit $start,$pagesize";
- }
- $sql = "從{$table} INNER JOIN 選擇$keys ({$sqlIndex} ) AS lim USING({$index})";
-
- $rs = self::query($sql);
-
- $re=array();
- if(self: :num_rows($rs)>=1){
- while($info = self::fetch_array($rs)){
- $re[]=$info;
- }
- }
- self::free_result($rs);
- return $re;
-
- }
- /* 如果一個很大的資料(預計最大萬行)刪除的工作週期會比較長,會長時間鎖住不應該鎖住的表或行,令一些不該打斷的數據被打斷方法如下是把一個大的sql任務分小(分成一次5000行)但次操作可能會造成刪除空白期間插入了新的數據,而新的數據可能會因滿足條件而被刪除。本方法很容易因為超時而失敗。
- @table string 要刪除資料的表名
- @where string 條件可省略
- #int 刪除掉的行數
- */
- static function big_del($table,$where){
- set_time_limit(0);
- $sql="delete from {$table}其中{$where} 限制5000";
- $rows = 0;
- $eff=0;
- do {
- self::query($sql);
- $rows=self: :affected_rows();
- $eff += $rows;
- }while($rows>0);
- return $eff;
- }
- }
-
?>
| 複製代碼