1,CI框架開發(fā),mvc思想還不錯,其自己實現(xiàn)的cookie,session脫離框架之后使用起來不方便;
          2,當心mysql_pconnect[持久連接,不建議使用],mysql_connect的釋放結(jié)果集,釋放連接。
          3,  apache,php配置,數(shù)據(jù)庫是否使用持久連接。
          4,  firefox的中文cookie問題,使用php的escape。

          文件包介紹:
          db : php mysql封裝數(shù)據(jù)庫訪問;
          smtp:建立smtp發(fā)送mail,不用安裝smtp server;
          template:smary6.2使用;
          xml:解析xml。

          /Files/xiaomage234/php-tools.rar
          posted @ 2009-02-25 11:35 小馬歌 閱讀(83) | 評論 (0)編輯 收藏
           

          processlist命令的輸出結(jié)果顯示了有哪些線程在運行,可以幫助識別出有問題的查詢語句,兩種方式使用這個命令。

          1.       進入mysql/bin目錄下輸入mysqladmin processlist;

          2.       啟動mysql,輸入show processlist;

          如果有 SUPER 權(quán)限,則可以看到全部的線程,否則,只能看到自己發(fā)起的線程(這是指,當前對應的MySQL帳戶運行的線程)。

          得到數(shù)據(jù)形式如下(只截取了三條):

          mysql> show processlist;

          +-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

          | Id | User| Host            | db| Command | Time| State    | Info                                                                                           

          +-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

          |207|root |192.168.0.20:51718 |mytest | Sleep  | 5  |       | NULL                                                                                                 

          |208|root |192.168.0.20:51719 |mytest | Sleep    | 5    |        | NULL        

          |220|root|192.168.0.20:51731 |mytest |Query    | 84   | Locked|

          select bookname,culture,value,typefrom book where id=001

          先簡單說一下各列的含義和用途,第一列,id,不用說了吧,一個標識,你要kill一個語句的時候很有用。user列,顯示單前用戶,如果不是root,這個命令就只顯示你權(quán)限范圍內(nèi)的sql語句。host列,顯示這個語句是從哪個ip的哪個端口上發(fā)出的。呵呵,可以用來追蹤出問題語句的用戶。db列,顯示這個進程目前連接的是哪個數(shù)據(jù)庫command列,顯示當前連接的執(zhí)行的命令,一般就是休眠(sleep),查詢(query),連接(connect)。time列,此這個狀態(tài)持續(xù)的時間,單位是秒。state列,顯示使用當前連接的sql語句的狀態(tài),很重要的列,后續(xù)會有所有的狀態(tài)的描述,請注意,state只是語句執(zhí)行中的某一個狀態(tài),一個sql語句,已查詢?yōu)槔赡苄枰?jīng)過copying to tmp tableSorting resultSending data等狀態(tài)才可以完成,info列,顯示這個sql語句,因為長度有限,所以長的sql語句就顯示不全,但是一個判斷問題語句的重要依據(jù)。

          這個命令中最關鍵的就是state列,mysql列出的狀態(tài)主要有以下幾種:

            Checking table
           正在檢查數(shù)據(jù)表(這是自動的)。

           Closing tables
           正在將表中修改的數(shù)據(jù)刷新到磁盤中,同時正在關閉已經(jīng)用完的表。這是一個很快的操作,如果不是這樣的話,就應該確認磁盤空間是否已經(jīng)滿了或者磁盤是否正處于重負中。

           Connect Out
           復制從服務器正在連接主服務器。

           Copying to tmp table on disk
           由于臨時結(jié)果集大于 tmp_table_size,正在將臨時表從內(nèi)存存儲轉(zhuǎn)為磁盤存儲以此節(jié)省內(nèi)存。

           Creating tmp table
           正在創(chuàng)建臨時表以存放部分查詢結(jié)果。

           deleting from main table
           服務器正在執(zhí)行多表刪除中的第一部分,剛刪除第一個表。

           deleting from reference tables
           服務器正在執(zhí)行多表刪除中的第二部分,正在刪除其他表的記錄。

           Flushing tables
           正在執(zhí)行 FLUSH TABLES,等待其他線程關閉數(shù)據(jù)表。

           Killed
           發(fā)送了一個kill請求給某線程,那么這個線程將會檢查kill標志位,同時會放棄下一個kill請求。MySQL會在每次的主循環(huán)中檢查kill標志位,不過有些情況下該線程可能會過一小段才能死掉。如果該線程程被其他線程鎖住了,那么kill請求會在鎖釋放時馬上生效。

           Locked
           被其他查詢鎖住了。

           Sending data
           正在處理 SELECT 查詢的記錄,同時正在把結(jié)果發(fā)送給客戶端。

           Sorting for group
           正在為 GROUP BY 做排序。

           Sorting for order
           正在為 ORDER BY 做排序。

           Opening tables
           這個過程應該會很快,除非受到其他因素的干擾。例如,在執(zhí) ALTER TABLE LOCK TABLE 語句行完以前,數(shù)據(jù)表無法被其他線程打開。正嘗試打開一個表。

           Removing duplicates
           正在執(zhí)行一個 SELECT DISTINCT 方式的查詢,但是MySQL無法在前一個階段優(yōu)化掉那些重復的記錄。因此,MySQL需要再次去掉重復的記錄,然后再把結(jié)果發(fā)送給客戶端。

           Reopen table
           獲得了對一個表的鎖,但是必須在表結(jié)構(gòu)修改之后才能獲得這個鎖。已經(jīng)釋放鎖,關閉數(shù)據(jù)表,正嘗試重新打開數(shù)據(jù)表。

           Repair by sorting
           修復指令正在排序以創(chuàng)建索引。

           Repair with keycache
           修復指令正在利用索引緩存一個一個地創(chuàng)建新索引。它會比 Repair by sorting 慢些。

           Searching rows for update
           正在講符合條件的記錄找出來以備更新。它必須在 UPDATE 要修改相關的記錄之前就完成了。

           Sleeping
           正在等待客戶端發(fā)送新請求
          .
           
          System lock
           正在等待取得一個外部的系統(tǒng)鎖。如果當前沒有運行多個 mysqld 服務器同時請求同一個表,那么可以通過增加 --skip-external-locking參數(shù)來禁止外部系統(tǒng)鎖。

           Upgrading lock
           INSERT DELAYED 正在嘗試取得一個鎖表以插入新記錄。

           Updating
           正在搜索匹配的記錄,并且修改它們。

           User Lock
           正在等待 GET_LOCK()

           Waiting for tables
           該線程得到通知,數(shù)據(jù)表結(jié)構(gòu)已經(jīng)被修改了,需要重新打開數(shù)據(jù)表以取得新的結(jié)構(gòu)。然后,為了能的重新打開數(shù)據(jù)表,必須等到所有其他線程關閉這個表。以下幾種情況下會產(chǎn)生這個通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE

           waiting for handler insert
           INSERT DELAYED 已經(jīng)處理完了所有待處理的插入操作,正在等待新的請求。

           大部分狀態(tài)對應很快的操作,只要有一個線程保持同一個狀態(tài)好幾秒鐘,那么可能是有問題發(fā)生了,需要檢查一下。
           還有其他的狀態(tài)沒在上面中列出來,不過它們大部分只是在查看服務器是否有存在錯誤是才用得著。

          posted @ 2009-02-25 11:23 小馬歌 閱讀(137) | 評論 (0)編輯 收藏
           
          $array 是存儲返回內(nèi)容集得變量名字

          mysql_fetch_row返回得要用
          $array[0],$array[1]…… 這樣得格式調(diào)用

          mysql_fetch_array(返回索引數(shù)組+關聯(lián)數(shù)組)
          即可以用 $array[0],$array[1]…… 這樣得格式調(diào)用
          也可以用 $array['字段名1'],$array['字段名2']…… 這樣得格式調(diào)用

          mysql_fetch_object 返回對象格式
          $array->字段名1,$array->字段名2…… 這樣調(diào)用

          以下是摘自官網(wǎng)的詳細說明:
          1、
          mysql_fetch_object
          返回類資料。

          語法: object mysql_fetch_object(int result, int [result_typ]);

          返回值: 類

          函數(shù)種類: 數(shù)據(jù)庫功能

          內(nèi)容說明 

          本函數(shù)用來將查詢結(jié)果 result 拆到類變量中。使用方法和 mysql_fetch_array() 幾乎相同,不同的地方在于本函數(shù)返回資料是類而不是數(shù)組。若 result 沒有資料,則返回 false 值。另外治募 注意的地方是,取回的類資料的索引只能是文字而不能用數(shù)字,這是因為類的特性。類資料的特性中所有的屬性 (property) 名稱都不能是數(shù)字,因此只好乖乖使用文字字符串當索引了。參數(shù) result_typ是一個常量值,有以下幾種常量 MYSQL_ASSOC、MYSQL_NUM 與 MYSQL_BOTH。關于速度方面,本函數(shù)的處理速度幾乎和 mysql_fetch_row() 及 mysql_fetch_array() 二函數(shù)差不多,要用哪個函數(shù)還是看使用的需求決定。

          使用范例 

          下面的例子示范如使用返回的類。

          <?php 
          mysql_connect($host,$user,$password);
          $result = mysql_db_query("MyDatabase","select * from test");
          while($row = mysql_fetch_object($result)) {
              echo $row->user_id;
              echo $row->fullname;
          }
          mysql_free_result($result);
          ?> 

          2、
          mysql_fetch_array
          返回數(shù)組資料。

          語法: array mysql_fetch_array(int result, int [result_typ]);

          返回值: 數(shù)組

          函數(shù)種類: 數(shù)據(jù)庫功能

          內(nèi)容說明 

          本函數(shù)用來將查詢結(jié)果 result 拆到數(shù)組變量中。若 result 沒有資料,則返回 false 值。而本函數(shù)可以說是 mysql_fetch_row() 的加強函數(shù),除可以將返回列及數(shù)字索引放入數(shù)組之外,還可以將文字索引放入數(shù)組中。若是好幾個返回字段都是相同的文字名稱,則最后一個置入的字段有效,解決方法是使用數(shù)字索引或者為這些同名的字段 (column) 取別名 (alias)。治募 注意的是使用本函數(shù)的處理速度其實不會比 mysql_fetch_row() 函數(shù)慢,要用哪個函數(shù)還是看使用的需求決定。參數(shù) result_typ 是一個常量值,有以下幾種常量 MYSQL_ASSOC、MYSQL_NUM 與 MYSQL_BOTH。

          使用范例 

          <?php
          mysql_connect($host,$user,$password);
          $result = mysql_db_query("database","select * from table");
          while($row = mysql_fetch_array($result)) {
          echo $row["user_id"];
          echo $row["fullname"];
          }
          mysql_free_result($result);
          ?>

          3、
          MySQL 數(shù)據(jù)庫函數(shù)庫

          mysql_fetch_row
          返回單列的各字段。

          語法: array mysql_fetch_row(int result);

          返回值: 數(shù)組

          函數(shù)種類: 數(shù)據(jù)庫功能

          內(nèi)容說明 

          本函數(shù)用來將查詢結(jié)果 result 之單列拆到數(shù)組變量中。數(shù)組的索引是數(shù)字索引,第一個的索引值是 0。若 result 沒有資料,則返回 false 值。
          posted @ 2009-02-25 11:21 小馬歌 閱讀(605) | 評論 (0)編輯 收藏
           

          from  :  http://gudai.cnblogs.com/articles/294580.html
          2005-12-10。從下午12點奮斗到晚上9點。
          2005-12-11。根據(jù)嘮叨的回帖,更新了轉(zhuǎn)換的算法。對于那篇unicode編碼的faq.我總算理解了整個轉(zhuǎn)換的過程。理解了這個公式。

          參考文章http://tech.163.com/05/0516/10/1JS9KEGA00091589.html
          UTF編碼

            UTF-8就是以8位為單元對UCS進行編碼。從UCS-2到UTF-8的編碼方式如下:

          UCS-2編碼(16進制) UTF-8 字節(jié)流(二進制)
          0000 - 007F 0xxxxxxx
          0080 - 07FF 110xxxxx 10xxxxxx
          0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

            例如“漢”字的Unicode編碼是6C49。6C49在0800-FFFF之間,所以肯定要用3字節(jié)模板了:1110xxxx 10xxxxxx 10xxxxxx。將6C49寫成二進制是:0110 110001 001001, 用這個比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。




          終于將unicode和utf8互轉(zhuǎn)搞定。


          如果utf-8編碼的字符ch是3個字節(jié)。xx yy zz
          將xx和1F AND 操作得到 a
          將yy和7F AND 操作得到 b
          將zz和7F AND 操作得到 c

          (64a+b)*64+c = ch(unicode編碼)

          echo.php沒什么。就是幾個函數(shù)。

          <?php
          require_once("echo.php");

          $data = "大鬧西奴xx x8890.-_奴";
          echo(urlencode($data));echo("<br/>");
          //寫入unicode文件
          $ucs2data = utf8ToUnicode($data,"little");
          $endian = chr(0xFE).chr(0xFF);
          $endian =  chr(0xFF).chr(0xFE);
          $rt = file_put_contents ( "ucs2.txt", $endian.$ucs2data);
                          //19:32,utf8toUnicode函數(shù)ok.
                          //20:09。發(fā)現(xiàn)little endian 和big endian問題。并解決。
                          //big endian 方式存入的unicode字符串,ue和editplus均不能
                          //識別。只有notepad正常識別。

          $rt = file_put_contents ( "usc2ys_data.txt", $ucs2_ysdata);
          //寫入utf8文件
          $utf8data = unicodeToUtf8($ucs2data);   // 20:52. 將字串轉(zhuǎn)回utf8碼ok.
          $rt = file_put_contents ( "utf8.txt", $utf8data);
          echo(urlencode($utf8data));echo("<br/>");

          $esc = utf8Escape($data);
          echot($esc);
          $esc = phpEscape($data);
          echot($esc);
          $unesc = phpUnescape($esc);
          echot($unesc);


          /**
          * 此函數(shù)將utf8編碼字串轉(zhuǎn)為unicode編碼字符串
          * 參數(shù) str ,utf8編碼的字符串。
          * 參數(shù) order,存放數(shù)據(jù)格式,是big endian還是little endian,默認的unicode存放次序是little.
          * 如:"大"的unicode碼是 5927。little方式存放即為:27 59 。big方式則順序不變:59 27.
          * little 存放格式文件的開頭均需有FF FE。big 存放方式的文件開頭為 FE FF。否則。將會產(chǎn)生嚴重混亂。
          * 本函數(shù)只轉(zhuǎn)換字符,不負責增加頭部。
          * iconv轉(zhuǎn)換過來的字符串是 big endian存放的。
          * 返回 ucs2string , 轉(zhuǎn)換過的字符串。
          * 感謝嘮叨(xuzuning)
          */
          function utf8ToUnicode($str,$order="little")
          {
            $ucs2string ="";
              $n=strlen($str);
              for ($i=0;$i<$n ;$i++ ) {
            $v = $str[$i];
            $ord = ord($v);
            if( $ord<=0x7F){ //  0xxxxxxx 
               if ($order=="little") {
                 $ucs2string .= $v.chr(0); 
             }
             else {
                 $ucs2string .= chr(0).$v; 
             }
            }
            elseif ($ord<0xE0 && ord($str[$i+1])>0x80) {  //110xxxxx 10xxxxxx
             $a = (ord($str[$i]) & 0x3F )<<6;
             $b =  ord($str[$i+1]) & 0x3F ;
             $ucsCode = dechex($a+$b);   //echot($ucsCode);
             $h = intval(substr($ucsCode,0,2),16);
             $l  =  intval(substr($ucsCode,2,2),16);
             if ($order=="little") {
                 $ucs2string   .= chr($l).chr($h);
             }
             else {
                  $ucs2string   .= chr($h).chr($l);
             }
             $i++;
            }elseif ($ord<0xF0  && ord($str[$i+1])>0x80  && ord($str[$i+2])>0x80) { //1110xxxx 10xxxxxx 10xxxxxx
                $a = (ord($str[$i]) & 0x1F)<<12;    
             $b = (ord($str[$i+1]) & 0x3F )<<6;
             $c =  ord($str[$i+2]) & 0x3F ;
             $ucsCode = dechex($a+$b+$c);   //echot($ucsCode);
             $h = intval(substr($ucsCode,0,2),16);
             $l  =  intval(substr($ucsCode,2,2),16);
             if ($order=="little") {
                 $ucs2string   .= chr($l).chr($h);
             }
             else {
                  $ucs2string   .= chr($h).chr($l);
             }   
             $i +=2;
            }
              }
           return $ucs2string;  
          } // end func

          /*
          * 此函數(shù)將unicode編碼字串轉(zhuǎn)為utf8編碼字符串
          * 參數(shù) str ,unicode編碼的字符串。
          * 參數(shù) order ,unicode字串的存放次序,為big endian還是little endian.
          * 返回 utf8string , 轉(zhuǎn)換過的字符串。
          *
          */
          function unicodeToUtf8($str,$order="little")
          {
           $utf8string ="";
              $n=strlen($str);
              for ($i=0;$i<$n ;$i++ ) {
            if ($order=="little") {
                $val = dechex(ord($str[$i+1])).dechex(ord($str[$i]));
            }
            else {
             $val = dechex(ord($str[$i])).dechex(ord($str[$i+1]));
            }
            $val = intval($val,16); //由于上次的.連接,導致$val變?yōu)樽址@里得轉(zhuǎn)回來。
            $i++; //兩個字節(jié)表示一個unicode字符。
            $c = "";
            if($val < 0x7F){        // 0000-007F
             $c .= chr($val);
            }elseif($val < 0x800) { // 0080-0800
             $c .= chr(0xC0 | ($val / 64));
             $c .= chr(0x80 | ($val % 64));
            }else{                // 0800-FFFF
             $c .= chr(0xE0 | (($val / 64) / 64));
             $c .= chr(0x80 | (($val / 64) % 64));
             $c .= chr(0x80 | ($val % 64));
             //echot($c);
            }  
            $utf8string .= $c;
              }
           return $utf8string;
          } // end func

           

          /*
          * 將utf8編碼的字符串編碼為unicode 碼型,等同escape
          * 之所以只接受utf8碼,因為只有utf8碼和unicode之間有公式轉(zhuǎn)換,其他的編碼都得查碼表來轉(zhuǎn)換。
          * 不知道查找utf8碼的正則是否完全正確。迷茫ing
          * 雖然調(diào)用utf2ucs對每個字符進行碼值計算。效率過低。然而,代碼清晰,要是把那個計算過程嵌入。
          * 代碼就不太容易閱讀了。
          */
          function utf8Escape($str) {
            preg_match_all("/[\xC0-\xE0].|[\xE0-\xF0]..|[\x01-\x7f]+/",$str,$r);
            //prt($r);
            $ar = $r[0];
            foreach($ar as $k=>$v) {
           $ord = ord($v[0]);
              if( $ord<=0x7F)
                $ar[$k] = rawurlencode($v);
              elseif ($ord<0xE0) { //雙字節(jié)utf8碼
                $ar[$k] = "%u".utf2ucs($v);
              }
            elseif ($ord<0xF0) { //三字節(jié)utf8碼
                $ar[$k] = "%u".utf2ucs($v);
           }
            }//foreach
            return join("",$ar);
          }

          /**
          *
          * 把utf8編碼字符轉(zhuǎn)為ucs-2編碼
          * 參數(shù) utf8編碼的字符。
          * 返回 該字符的unicode碼值。知道了碼值,你就可以使用chr將字符弄出來了。
          *
          *  原理:unicode轉(zhuǎn)為utf-8碼的算法是。頭部固定位或。
           該過程的逆向算法就是這個函數(shù)了,頭部固定位反位與。
          */

          function utf2ucs($str){
           $n=strlen($str);
           if ($n=3) {
               $highCode = ord($str[0]);    
            $midCode = ord($str[1]);
               $lowCode = ord($str[2]);
            $a   = 0x1F & $highCode;
            $b   = 0x7F & $midCode;
            $c   = 0x7F & $lowCode;
            $ucsCode = (64*$a + $b)*64 + $c; 
           }
           elseif ($n==2) {
              $highCode = ord($str[0]);    
               $lowCode = ord($str[1]);
            $a   = 0x3F & $highCode;  //0x3F是0xC0的補數(shù)
            $b   = 0x7F & $lowCode;  //0x7F是0x80的補數(shù)
            $ucsCode = 64*$a + $b; 
           }
           elseif($n==1) {
               $ucscode = ord($str);
           }
           return dechex($ucsCode);
          }

           


          /*
          * 用處 :此函數(shù)用來逆轉(zhuǎn)javascript的escape函數(shù)編碼后的字符。
          * 關鍵的正則查找我不知道有沒有問題.
          * 參數(shù):javascript編碼過的字符串。
          * 如:unicodeToUtf8("%u5927")= 大
          * 2005-12-10
          *
          */
          function phpUnescape($escstr){
            preg_match_all("/%u[0-9A-Za-z]{4}|%.{2}|[0-9a-zA-Z.+-_]+/",$escstr,$matches); //prt($matches);
            $ar = &$matches[0];
            $c = "";
            foreach($ar as $val){
           if (substr($val,0,1)!="%") { //如果是字母數(shù)字+-_.的ascii碼
               $c .=$val;
           }
           elseif (substr($val,1,1)!="u") { //如果是非字母數(shù)字+-_.的ascii碼
            $x = hexdec(substr($val,1,2));
               $c .=chr($x);
           }
           else { //如果是大于0xFF的碼
            $val = intval(substr($val,2),16);
            if($val < 0x7F){        // 0000-007F
             $c .= chr($val);
            }elseif($val < 0x800) { // 0080-0800
             $c .= chr(0xC0 | ($val / 64));
             $c .= chr(0x80 | ($val % 64));
            }else{                // 0800-FFFF
             $c .= chr(0xE0 | (($val / 64) / 64));
             $c .= chr(0x80 | (($val / 64) % 64));
             $c .= chr(0x80 | ($val % 64));
            }
           }
            }
            return $c;
          }

           

          /*
          * 等同escape
          * 來自網(wǎng)上。本文件其他幾個函數(shù)都參考了這個函數(shù)里面的關鍵算法。
          */
          function phpEscape($str,$encode="") {
            if ($encode=="" && !(function_exists("mb_detect_encoding"))) {
                echo "error You must enter the string's encoding or extend the php for mb_string";
             return ;
            }
            elseif($encode=="") {
             echo "Use mb_string function to detect the string's encoding <br/>";
                $encode = mb_detect_encoding($str);
            }
            preg_match_all("/[\xC0-\xE0].|[\xE0-\xF0]..|[\x01-\x7f]+/",$str,$r);
            //prt($r);
            $ar = $r[0];
            foreach($ar as $k=>$v) {
           $ord = ord($v[0]);
              if( $ord<=0x7F)
                $ar[$k] = rawurlencode($v);
              elseif ($ord<0xE0) {
                $ar[$k] = "%u".bin2hex(iconv($encode,"UCS-2",$v));
              }
            elseif ($ord<0xF0) {
                $ar[$k] = "%u".bin2hex(iconv($encode,"UCS-2",$v));
           }
            }//foreach
            return join("",$ar);
          }

          ?>

          Posted on 2005-12-10 20:54 古代 閱讀(698) 評論(2)  編輯 收藏 網(wǎng)摘 所屬分類: wapphp

          Feedback

          #1樓 [樓主]   回復  引用  查看    

          2006-09-12 22:24 by 古代的專欄      
          上文的phpescape函數(shù)是錯的,補上正確的

          /*
          * 等同escape , 只能轉(zhuǎn)gbk編碼的漢字并在gb2312的網(wǎng)頁中被unescape
          * gbk漢字: 第一:0x81-0xFE 第二:0x40-0xFE
          */
          function phpEscape( $str )
          {
          $chars = preg_split('//', $str, -1 ) ; //pr($chars);
          $n = count( $chars )-1 ;
          for($i=1;$i<$n ;$i++ ) {
          $char = $chars[$i];
          $ord = ord( $char ); //echo $ord . " -- ".chr($ord)." -- $i<br>";
          if( $ord<=0x7F){
          $ar .= rawurlencode( $char );
          }else{
          $ar .= "%u".bin2hex( iconv( 'gbk' ,"UCS-2",$chars[$i].$chars[$i+1] ) );
          $i++;
          }
          }//foreach
          return $ar;
          }
          posted @ 2009-02-25 11:19 小馬歌 閱讀(1016) | 評論 (0)編輯 收藏
           
          AddSlashes: 字符串加入斜線。
          bin2hex: 二進位轉(zhuǎn)成十六進位。
          Chop: 去除連續(xù)空白。
          Chr: 返回序數(shù)值的字符。
          chunk_split: 將字符串分成小段。
          convert_cyr_string: 轉(zhuǎn)換古斯拉夫字符串成其它字符串。
          crypt: 將字符串用 DES 編碼加密。
          echo: 輸出字符串。
          explode: 切開字符串。
          flush: 清出輸出緩沖區(qū)。
          get_meta_tags: 抽出文件所有 meta 標記的資料。
          htmlspecialchars: 將特殊字符轉(zhuǎn)成 HTML 格式。
          htmlentities: 將所有的字符都轉(zhuǎn)成 HTML 字符串。
          implode: 將數(shù)組變成字符串。
          join: 將數(shù)組變成字符串。
          ltrim: 去除連續(xù)空白。
          md5: 計算字符串的 MD5 哈稀。
          nl2br: 將換行字符轉(zhuǎn)成

          Ord: 返回字符的序數(shù)值。
          parse_str: 解析 query 字符串成變量。
          print: 輸出字符串。
          printf: 輸出格式化字符串。
          quoted_printable_decode: 將 qp 編碼字符串轉(zhuǎn)成 8 位字符串。
          QuoteMeta: 加入引用符號。
          rawurldecode: 從 URL 專用格式字符串還原成普通字符串。
          rawurlencode: 將字符串編碼成 URL 專用格式。
          setlocale: 配置地域化信息。
          similar_text: 計算字符串相似度。
          soundex: 計算字符串的讀音值
          sprintf: 將字符串格式化。
          strchr: 尋找第一個出現(xiàn)的字符。
          strcmp: 字符串比較。
          strcspn: 不同字符串的長度。
          strip_tags: 去掉 HTML 及 PHP 的標記。
          StripSlashes: 去掉反斜線字符。
          strlen: 取得字符串長度。
          strrpos: 尋找字符串中某字符最后出現(xiàn)處。
          strpos: 尋找字符串中某字符最先出現(xiàn)處。
          strrchr: 取得某字符最后出現(xiàn)處起的字符串。
          strrev: 顛倒字符串。
          strspn: 找出某字符串落在另一字符串遮罩的數(shù)目。
          strstr: 返回字符串中某字符串開始處至結(jié)束的字符串。
          strtok: 切開字符串。
          strtolower: 字符串全轉(zhuǎn)為小寫。
          strtoupper: 字符串全轉(zhuǎn)為大寫。
          str_replace: 字符串取代。
          strtr: 轉(zhuǎn)換某些字符。
          substr: 取部份字符串。
          trim: 截去字符串首尾的空格。
          ucfirst: 將字符串第一個字符改大寫。
          ucwords: 將字符串每個字第一個字母改大寫。
          posted @ 2009-02-19 12:53 小馬歌 閱讀(132) | 評論 (0)編輯 收藏
           

          今天寫了一段代碼,出現(xiàn)錯誤Cannot modify header information - headers already sent by
          代碼結(jié)構(gòu)如下:
          //一些數(shù)據(jù)庫查詢的操作之后,有一個redirect跳轉(zhuǎn)

          $class->load->model('shop/muser');
          $id=$class->muser->getUserId($user,$pwd); //這里出了點問題
          redirect('index');

          codeigniter里的redirect()執(zhí)行一個指定的利用header頭文件實現(xiàn)跳轉(zhuǎn)本地網(wǎng)址URL的操作,也就是類似header()的功能。
          google之:“所有對header()函數(shù)有了解的人都知道,這個函數(shù)會發(fā)送一段文件頭給瀏覽器,但是如果在使用這個函數(shù)之前已經(jīng)有了任何輸出(包括空輸出 ,如空格,回車和換行)就會提示出錯:”Header had all ready send by”!”
          這種錯誤的原因是發(fā)送http頭之前有輸出。迷惑了,我的代碼并沒有任何輸出呀?仔細檢查了一下之前的操作,發(fā)現(xiàn)數(shù)據(jù)庫查詢是出了點問題,原因就在這,因為出問題后,會輸出一些錯誤提示。在網(wǎng)上找的解決辦法是在程序前面使用ob_start()函數(shù),ob_start打開了緩沖區(qū),要輸出的內(nèi)容就不會出現(xiàn)到瀏覽器,而是保留在服務器,直到你使用flush或者ob_end_flush才會輸出,所以并不會有任何文件頭輸出的錯誤!
          ob_start確實管用,但是要知道它同時欺騙了我,我認為我的程序很完美,根本意識不到自己犯下的錯誤,因為沒有錯誤提示。


          from:http://www.tonsh.net/blog/?p=24#more-24

          posted @ 2009-02-18 16:15 小馬歌 閱讀(411) | 評論 (0)編輯 收藏
           
          第一次看到中央三臺的著名企業(yè)音樂電視展播是五糧液的《愛到春潮滾滾來》,當時的感覺就是三個字--太美了!后來又陸續(xù)看到了《仙林青梅》和康美制藥拍的《康美之戀》,個人覺得已經(jīng)遠超過了廣告本身的含義,達到了一種藝術的美的享受。且不管一個已經(jīng)如此大牌的企業(yè)花巨資拍這樣奢侈的廣告片是否值得,也不管這些資金是否可以有更好的別的用武之地,做為觀眾,這幾個音樂電視絕對值得我們用心去欣賞,感受唯美……
          《愛到春潮滾滾來》
          在線播放地址:http://vzone.xunlei.com/brand/29/opus/content622.html [提供.flv格式下載]
          一江春水情不盡,我夢繞魂牽,一夜春雨夢不停,你多情纏綿
          一朝春露萬花開,我美麗無限,一日春風人心暖,你風情萬千……
          下載地址:http://www.ybtv.cc/xz/bong/wly/adccggl.rmvb

          《康美之戀》
          在線播放地址:http://vzone.xunlei.com/brand/28/opus/content621.html [提供.flv格式下載]
          一條路,海角天涯,兩顆心相依相伴
          風吹不走誓言,雨打不濕浪漫……
          下載地址:http://podcache.cctv.com/published1/2007/05/11/pub1178846647864.rmvb

          《仙林青梅》
          在線播放地址:http://vzone.xunlei.com/brand/29/opus/content623.html [提供.flv格式下載]
          青山高,云水長,仙林青梅心兒醉
          山山水水永不分,風風雨雨長相隨……
          下載地址:http://zhumin.chc.edu.cn/gq/仙林青梅(楊竹青).avi
          posted @ 2009-02-07 10:35 小馬歌 閱讀(1851) | 評論 (1)編輯 收藏
           
          描述:Blackbird是一個用于記錄log信息的工具,有了它,你可以拋棄alert提示,你能方便的將它插入頁面中,支持多瀏覽器。
          地址:http://www.gscottolson.com/blackbirdjs/



          下載包:/Files/xiaomage234/blackbirdjs.rar
          posted @ 2009-02-06 10:14 小馬歌 閱讀(702) | 評論 (1)編輯 收藏
           

          以前寫過一個刷校內(nèi)網(wǎng)的人氣的工具,Java的(以后再也不行Java程序了),里面用到了驗證碼識別,那段代碼不是我自己寫的:-) 校內(nèi)的驗證是完全單色沒有任何干撓的驗證碼,識別起來比較容易,不過從那段代碼中可以看到基本的驗證碼識別方式。這幾天在寫一個程序的時候需要識別驗證碼,因為程序是Python寫的自然打算用Python進行驗證碼的識別。
          以前沒用Python處理過圖像,不太了解PIL(Python Image Library)的用法,這幾天看了看PIL,發(fā)現(xiàn)它太強大了,簡直和ImageMagic,PS可以相比了。(這里有PIL不錯的文檔)
          由于上面的驗證碼是24位的jpeg圖像,并且包含了噪點,所以我們要做的就是去噪和去色,我拿PS找了張驗證碼試了試,使用PS濾鏡中的去噪效果還行,但是沒有在PIL找到去噪的函數(shù),后來發(fā)現(xiàn)中值過濾后可以去掉大部分的噪點,而且PIL里有現(xiàn)成的函數(shù),接下來我試著直接把圖像轉(zhuǎn)換為單色,結(jié)果發(fā)現(xiàn)還是會有不過的噪點留了下來,因為中值過濾時把不少噪點淡化了,但轉(zhuǎn)換為音色時這些噪點又被強化顯示了,于是在中值過濾后對圖像亮度進行加強處理,然后再轉(zhuǎn)換為單色,這樣驗證碼圖片就變得比較容易識別了:


          上面這些處理使用Python才幾行:
          PYTHON:
          im = Image.open(image_name)
              im = im.filter(ImageFilter.MedianFilter())
              enhancer = ImageEnhance.Contrast(im)
              im = enhancer.enhance(2)
              im = im.convert('1')
              im.show()
          接下來就是提取這些數(shù)字的字模,使用shell腳本下載100幅圖片,抽出三張圖片獲取字模:
          PYTHON:
          #!/usr/bin/env python
          #encoding=utf-8
           
          import Image,ImageEnhance,ImageFilter
          import sys
           
          image_name = "./images/81.jpeg"
          im = Image.open(image_name)
          im = im.filter(ImageFilter.MedianFilter())
          enhancer = ImageEnhance.Contrast(im)
          im = enhancer.enhance(2)
          im = im.convert('1')
          #im.show()
                          #all by pixel
          s = 12          #start postion of first number
          w = 10          #width of each number
          h = 15          #end postion from top
          t = 2           #start postion of top
           
          im_new = []
          #split four numbers in the picture
          for i in range(4):
              im1 = im.crop((s+w*i+i*2,t,s+w*(i+1)+i*2,h))
              im_new.append(im1)
           
          f = file("data.txt","a")
          for k in range(4):
              l = []
              #im_new[k].show()
              for i in range(13):
                  for j in range(10):
                      if (im_new[k].getpixel((j,i)) == 255):
                          l.append(0)
                      else:
                          l.append(1)
           
              f.write("l=[")
                 
              n = 0
              for i in l:
                  if (n%10==0):
                      f.write("\n")
                  f.write(str(i)+",")
                  n+=1
              f.write("]\n")
          把字模保存為list,用于接下來的匹配;
          提取完字模后剩下來的就是對需要處理的圖片進行與數(shù)據(jù)庫中的字模進行匹配了,基本的思路就是看相應點的重合率,但是由于噪點的影響在對(6,8)(8,3)(5,9)的匹配時容易出錯,俺自己針對已有的100幅圖片數(shù)據(jù)采集進行分析,采用了雙向匹配(圖片與字模分別作為基點),做了半天的測試終于可以實現(xiàn)100%的識別率。
          PYTHON:
          #!/usr/bin/env python
          #encoding=utf-8
           
          import Image,ImageEnhance,ImageFilter
          import Data
           
          DEBUG = False
           
          def d_print(*msg):
              global DEBUG
              if DEBUG:
                  for i in msg:
                      print i,
                  print
              else:
                  pass
           
           
          def Get_Num(l=[]):
              min1 = []
              min2 = []
              for n in Data.N:
                  count1=count2=count3=count4=0
                  if (len(l) != len(n)):
                      print "Wrong pic"
                      exit()
                  for i in range(len(l)):
                      if (l[i] == 1):
                          count1+=1
                          if (n[i] == 1):
                              count2+=1
                  for i in range(len(l)):
                      if (n[i] == 1):
                          count3+=1
                          if (l[i] == 1):
                              count4+=1
                  d_print(count1,count2,count3,count4)
           
                  min1.append(count1-count2)
                  min2.append(count3-count4)
              d_print(min1,"\n",min2)
              for i in range(10):
                  if (min1[i] <= 2 or min2[i] <= 2):
                      if ((abs(min1[i] - min2[i])) <10):
                          return i
              for i in range(10):           
                  if (min1[i] <= 4 or min2[i] <= 4):
                      if (abs(min1[i] - min2[i]) <= 2):
                          return i
           
              for i in range(10):
                  flag = False
                  if (min1[i] <= 3 or min2[i] <= 3):
                      for j in range(10):
                          if (j != i and (min1[j] <5 or min2[j] &lt;5)):
                              flag = True
                          else:
                              pass
                      if (not flag):
                          return i
              for i in range(10):           
                  if (min1[i] <= 5 or min2[i] <= 5):
                      if (abs(min1[i] - min2[i]) <= 10):
                          return i
              for i in range(10):
                  if (min1[i] <= 10 or min2[i] <= 10):
                      if (abs(min1[i] - min2[i]) <= 3):
                          return i
           
          #end of function Get_Num
           
          def Pic_Reg(image_name=None):
              im = Image.open(image_name)
              im = im.filter(ImageFilter.MedianFilter())
              enhancer = ImageEnhance.Contrast(im)
              im = enhancer.enhance(2)
              im = im.convert('1')
              im.show()
                              #all by pixel
              s = 12          #start postion of first number
              w = 10          #width of each number
              h = 15          #end postion from top
              t = 2           #start postion of top
              im_new = []
              #split four numbers in the picture
              for i in range(4):
                  im1 = im.crop((s+w*i+i*2,t,s+w*(i+1)+i*2,h))
                  im_new.append(im1)
           
              s = ""
              for k in range(4):
                  l = []
                  #im_new[k].show()
                  for i in range(13):
                      for j in range(10):
                          if (im_new[k].getpixel((j,i)) == 255):
                              l.append(0)
                          else:
                              l.append(1)
                 
                  s+=str(Get_Num(l))
              return s
          print Pic_Reg("./images/22.jpeg")
          這里再提一下驗證碼識別的基本方法:截圖,二值化、中值濾波去噪、分割、緊縮重排(讓高矮統(tǒng)一)、字庫特征匹配識別。
          這里只是針對一般的驗證碼,高級驗證碼的識別這里有篇不錯的文章,太復雜的話涉及的東西就多了,那俺就沒興趣了,人工智能(好恐怖),俺只喜歡簡單的東西。
          本文來源于可可熊的窩 http://cocobear.info/blog , 原文地址: http://cocobear.info/blog/2008/08/04/python-pic-recognize/

          posted @ 2009-02-04 11:32 小馬歌 閱讀(2755) | 評論 (0)編輯 收藏
           
          什么是 Groovy?
            Groovy 是 JVM 的一個替代語言 — 替代 是指可以用 Groovy 在 Java 平臺上進行 Java 編程,使用方式基本與使用 Java 代碼的方式相同。在編寫新應用程序時,Groovy 代碼能夠與 Java 代碼很好地結(jié)合,也能用于擴展現(xiàn)有代碼。目前的 Groovy 版本是 1.5.4,在 Java 1.4 和 Java 5 平臺上都能使用,也能在 Java 6 上使用。
            Groovy 的一個好處是,它的語法與 Java 語言的語法很相似。雖然 Groovy 的語法源于 Smalltalk 和 Ruby 這類語言的理念,但是可以將它想像成 Java 語言的一種更加簡單、表達能力更強的變體。(在這點上,Ruby 與 Groovy 不同,因為它的語法與 Java 語法差異很大。)
            許多 Java 開發(fā)人員非常喜歡 Groovy 代碼和 Java 代碼的相似性。從學習的角度看,如果知道如何編寫 Java 代碼,那就已經(jīng)了解 Groovy 了。Groovy 和 Java 語言的主要區(qū)別是:完成同樣的任務所需的 Groovy 代碼比 Java 代碼更少。(有時候會少很多!)
          Groovy 快捷方式
            開始使用 Groovy 時,您會發(fā)現(xiàn)它使日常的編程活動變得快了許多。完成本教程之后,您會了解更多的 Groovy 語法快捷方式。不過現(xiàn)在只需知道以下這些要點:
            Groovy 的松散的 Java 語法允許省略分號和修改符。
            除非另行指定,Groovy 的所有內(nèi)容都為 public。
            Groovy 允許定義簡單腳本,同時無需定義正規(guī)的class 對象。
            Groovy 在普通的常用 Java 對象上增加了一些獨特的方法和快捷方式,使得它們更容易使用。
            Groovy 語法還允許省略變量類型。
          Groovy 的新增特性
            雖然 Groovy 允許省略 Java 語法中的一些元素,但也增加了一些新特性,例如本地集合、內(nèi)置的正則表達式和閉包。在標準的 Java 代碼中,如果想要創(chuàng)建一個項列表,首先要導入<code>java.util.ArrayList</code>,然后程序化地初始化 <code>ArrayList</code> 實例,然后 再向?qū)嵗刑砑禹棥T?Groovy 中,列表和映射都內(nèi)置在語法中 — 無需導入任何內(nèi)容。正則表達式也不需要額外的導入或?qū)ο螅凰鼈兛梢酝ㄟ^特殊的 Groovy 語法來創(chuàng)建。
          關于閉包
            對于任何 Java 開發(fā)人員來說,閉包都是一個令人興奮的新技巧。這些神奇的構(gòu)造將會包含在未來的 Java 發(fā)行版(很可能是 Java 7)中,成為正式的 Java 語法,但現(xiàn)在已經(jīng)可以在 Groovy 中使用了。可以將閉包 想像為一個代碼塊,可以現(xiàn)在定義,以后再執(zhí)行。可以使用這些強大的構(gòu)造做許多漂亮的事,不過最著名的是簡化迭代。使用 Groovy 之后,就有可能再也不需要編寫Iterator 實例了。
            [table][tbody][/tbody][/table]
          動態(tài)的 Groovy
            從技術上講,Groovy 可能是您最近聽說過的類型最松散的動態(tài)語言之一。從這個角度講,Groovy 與 Java 語言的區(qū)別很大,Java 語言是一種固定類型語言。在 Groovy 中,類型是可選的,所以您不必輸入String myStr = "Hello"; 來聲明 String 變量。
            除此之外,Groovy 代碼還能在運行時輕松地改變自己。這實際上意味著,能夠在運行時輕松地為對象指定新方法和屬性。這一編程領域稱為元編程,Groovy 能夠很好地支持這種編程方式。在學習本教程的過程中,您將了解到關于 Groovy 的動態(tài)性質(zhì)的更多內(nèi)容。現(xiàn)在惟一要補充的是,您會驚訝地發(fā)現(xiàn),在 Groovy 會使操作 XML 或普通的 java.io.File 實例變得非常輕松。
          一體兩面
            用 Groovy 編寫的任何內(nèi)容都可以編譯成標準的 Java 類文件并在 Java 代碼中重用。類似地,用標準 Java 代碼編寫的內(nèi)容也可以在 Groovy 中重用。所以,可以輕易地使用 Groovy 為 Java 代碼編寫單元測試。而且,如果用 Groovy 編寫一個方便的小工具,那么也可以在 Java 程序中使用這個小工具。
            Groovy是用Java實現(xiàn)的開源腳本語言并且和它聯(lián)系緊密.它需要JDK 1.4. Groovy向Java添加了許多Ruby和Python腳本語言的特性. Groovy的特性包括動態(tài)類型(dynamic typing), 閉包(closures),簡單對象導航( easy object navigation)和更加簡潔的Lists和Maps語法.
            Groovy是由James Strachan和Bob McWhirter創(chuàng)造的. James還參與了許多其他開源項目的開發(fā),其中包括Jelly, dom4j, Jaxen, Betwixt和Maven. Bob是Jaxen和Drools (一個開源的面向?qū)ο蟮腏AVA規(guī)則引擎) 的創(chuàng)始人.
            目前最新穩(wěn)定版為Groovy1.5。這個Groovy版本包含了很多Java5的特性(Annotation,泛型,Enum...),并修正了很多錯誤。
          posted @ 2009-02-04 10:47 小馬歌 閱讀(275) | 評論 (0)編輯 收藏
          僅列出標題
          共95頁: First 上一頁 72 73 74 75 76 77 78 79 80 下一頁 Last 
           
          主站蜘蛛池模板: 临泽县| 古浪县| 巴林右旗| 大洼县| 思南县| 尉氏县| 克东县| 荃湾区| 南昌市| 南川市| 元谋县| 文安县| 田林县| 建水县| 静宁县| 保定市| 高碑店市| 新巴尔虎右旗| 霍城县| 临夏市| 涪陵区| 广丰县| 迁西县| 当雄县| 广昌县| 读书| 泸西县| 蒙城县| 朔州市| 汝州市| 大庆市| 凤山县| 苗栗县| 江西省| 景宁| 香港 | 宕昌县| 宁陕县| 旌德县| 甘孜县| 阜康市|