2012-1-30 18:31 Monday  
usleep() 函数延迟代码执行若干微秒。

  unpack() 函数从二进制字符串对数据进行解包。

  uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。

  time_sleep_until() 函数延迟代码执行直到指定的时间。

  PHP5常用函数之time_nanosleep() 函数延迟代码执行若干秒和纳秒。

  sleep() 函数延迟代码执行若干秒。

  show_source() 函数对文件进行语法高亮显示。

  strip_whitespace() 函数返回已删除 PHP 注释以及空白字符的源代码文件。

  pack() 函数把数据装入一个二进制字符串。

  ignore_user_abort() 函数设置与客户机断开是否会终止脚本的执行。

  highlight_string() 函数对字符串进行语法高亮显示。

  highlight_file() 函数对文件进行语法高亮显示。

  PHP5常用函数之get_browser() 函数返回用户浏览器的性能。

  exit() 函数输出一条消息,并退出当前脚本。

  eval() 函数把字符串按照 PHP 代码来计算。

  die() 函数输出一条消息,并退出当前脚本。

  defined() 函数检查某常量是否存在。

  define() 函数定义一个常量。

  constant() 函数返回常量的值。

  PHP5常用函数之connection_status() 函数返回当前的连接状态。

  connection_aborted() 函数检查是否断开客户机。

  zip_read() 函数读取打开的 zip 档案中的下一个文件。

  zip_open() 函数打开 ZIP 文件以供读取。

  zip_entry_read() 函数从打开的 zip 档案项目中获取内容。

  zip_entry_open() 函数打开一个 ZIP 档案项目以供读取。

  PHP5常用函数之zip_entry_name() 函数返回 zip 档案项目的名称。

  zip_entry_filesize() 函数返回 zip 档案项目的原始大小(在压缩之前)。

  zip_entry_compressionmethod() 函数返回 zip 档案项目的压缩方法。

  zip_entry_compressedsize() 函数返回 zip 档案项目的压缩文件尺寸。

  zip_entry_close() 函数关闭由 zip_entry_open() 函数打开的 zip 档案文件。

  zip_close() 函数关闭由 zip_open() 函数打开的 zip 档案文件。

  xml_set_unparsed_entity_decl_handler() 函数规定在遇到无法解析的实体名称(NDATA)声明时被调用的函数。

  xml_set_processing_instruction_handler() 函数规定当解析器在 XML 文档中找到处理指令时所调用的函数。

  xml_set_object() 函数允许在对象中使用 XML 解析器。

  PHP5常用函数之xml_set_notation_decl_handler() 函数规定当解析器在 XML 文档中找到符号声明时被调用的函数。

  xml_set_external_entity_ref_handler() 函数规定当解析器在 XML 文档中找到外部实体时被调用的函数。

  xml_set_element_handler() 函数建立起始和终止元素处理器。

  xml_set_default_handler() 函数为 XML 解析器建立默认的数据处理器。

  xml_set_character_data_handler() 函数建立字符数据处理器。

  xml_parser_set_option() 函数为 XML 解析器进行选项设置。

  xml_parser_get_option() 函数从 XML 解析器获取选项设置信息。

  xml_parser_free() 函数释放 XML 解析器。

  PHP5常用函数之xml_parser_create() 函数创建 XML 解析器。

  xml_parser_create_ns() 函数创建带有命名空间支持的 XML 解析器。

  xml_parse_into_struct() 函数把 XML 数据解析到数组中。

  xml_parse() 函数解析 XML 文档。

  xml_get_error_code() 函数获取 XML 解析器错误代码。

  xml_get_current_line_number() 函数获取 XML 解析器的当前行号。

  xml_get_current_column_number() 函数获取 XML 解析器的当前列号。

  PHP5常用函数之xml_get_current_byte_index() 函数获取 XML 解析器的当前字节索引。

  xml_error_string() 函数获取 XML 解析器的错误描述。

  utf8_encode() 函数把 ISO-8859-1 字符串编码为 UTF-8。

  utf8_decode() 函数把 UTF-8 字符串解码为 ISO-8859-1。

  wordwrap() 函数按照指定长度对字符串进行折行处理。

  vsprintf() 函数把格式化字符串写入变量中。

  vprintf() 函数输出格式化的字符串。

  vfprintf() 函数把格式化的字符串写到指定的输出流。

  PHP5常用函数之ucwords() 函数把字符串中每个单词的首字符转换为大写。

  ucfirst() 函数把字符串中的首字符转换为大写。

  trim() 函数从字符串的两端删除空白字符和其他预定义字符。

  substr_replace() 函数把字符串的一部分替换为另一个字符串。

  substr_count() 函数计算子串在字符串中出现的次数。

  substr_compare() 函数从指定的开始长度比较两个字符串。

  substr() 函数返回字符串的一部分。

  strtr() 函数转换字符串中特定的字符。

  strtoupper() 函数把字符串转换为大写。

  strtolower() 函数把字符串转换为小写。

  PHP5常用函数之strtok() 函数把字符串分割为更小的字符串。

  strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。

  strspn() 函数返回在字符串中包含的特定字符的数目。

  strrpos() 函数查找字符串在另一个字符串中最后一次出现的位置。

  strripos() 函数查找字符串在另一个字符串中最后一次出现的位置。

  strrev() 函数反转字符串。

  strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。

  strpos() 函数返回字符串在另一个字符串中第一次出现的位置。

  PHP5常用函数之strpbrk() 函数在字符串中搜索指定字符中的任意一个。

  strncmp() 函数比较两个字符串。

  strncasecmp() 函数比较两个字符串。

  strnatcmp() 函数使用一种“自然”算法来比较两个字符串。

  strnatcasecmp() 函数使用一种“自然”算法来比较两个字符串。

  strlen() 函数返回字符串的长度。

  stristr() 函数查找字符串在另一个字符串中第一次出现的位置。

  stripos() 函数返回字符串在另一个字符串中第一次出现的位置。

  stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。

  stripcslashes() 函数删除由 addcslashes() 函数添加的反斜杠。

  strip_tags() 函数剥去 HTML、XML 以及 PHP 的标签。

  strcspn() 函数返回在找到任何指定的字符之前,在字符串查找的字符数。

  PHP5常用函数之strcoll() 函数比较两个字符串。

  strcmp() 函数比较两个字符串。

  strchr() 函数搜索一个字符串在另一个字符串中的第一次出现。

  strcasecmp() 函数比较两个字符串。

  str_word_count() 函数计算字符串中的单词数。

  str_split() 函数把字符串分割到数组中。

  str_shuffle() 函数随机地打乱字符串中的所有字符。

  str_rot13() 函数对字符串执行 ROT13 编码。

  str_replace() 函数使用一个字符串替换字符串中的另一些字符。

  str_repeat() 函数把字符串重复指定的次数。

  str_pad() 函数把字符串填充为指定的长度。

  str_ireplace() 函数使用一个字符串替换字符串中的另一些字符。

  PHP5常用函数之sscanf() 函数根据指定的格式解析来自一个字符串的输入。

  sprintf() 函数把格式化的字符串写写入一个变量中。

  soundex() 函数计算字符串的 soundex 键。

  similar_text() 函数计算两个字符串的匹配字符的数目。

  sha1_file() 函数计算文件的 SHA-1 散列。

  sha1() 函数计算字符串的 SHA-1 散列。

  setlocale() 函数设置地区信息(地域信息)。

  PHP5常用函数之rtrim() P rtrim() 函数

来源:http://phpec.com/?action=show&id=33

一直以来,由于php本身的session机制不能跨机,令很多phper感到不爽,现在流行的解决方案主要有:
1)使用数据库来实现
2)自己写server端,通过改写session处理函数来请求
3)使用nfs等跨机存储来保存session
4)使用memcache来保存
5)使用zend platform提供的解决方案

其中的1-4都是通过改用可以跨机的储存机制,再使用session_set_save_handler()来实现,5是zend公司的商业产品(不过据之前在使用的同事反映,效果不太满意),以上的方案,各有利弊,不在本文讨论范围

无论是用memcache,还是db,nfs,其原理是一样的,都是通过session_set_save_handler函数来改变默认的处理方式,通 过指定回调函数来自定义处理,可以参考手册的session_set_save_handler()函数部分,有例子,比较容易明白

以下是一些我在使用memcache来实现时的一些记录:
1)使用类来实现时,各回调函数都定义为静态方法,在类的构造中使用session_set_save_handler注册回调函数, 如:
session_set_save_handler(
                array('memSession', 'open'),
                array('memSession', 'close'),
                array('memSession', 'read'),
                array('memSession', 'write'),
                array('memSession', 'destroy'),
                array('memSession', 'gc')
          );
memSession为类名,要使用session,则先new memSession,再session_start();


2)生存期和垃圾回收
memCache的set命令有生存期,即使用set命令添加值时,可加上lifetime,此时间可以作为session的生存期,用户在此时间内没有 动作,则会失效,但有动作则不会失效(因为每一个脚本结束时,都会执行write和close,此时lifetime就会被更新了),当然,如果使用 cookie传递SID,则控制SESSION生存期可以用:ini_set('session.cookie_lifetime',time)来设定, 这其实是控制cookie的有效时间,如果session赖以生存的cookie消失了,当然session也就活不了,使用 cookie_lifetime来控制的话,无论有无动作,都将在指定的时间后过时

gc是指垃圾回收,在session中是指清理过期的session数据,影响的参数有:
session.gc_maxlifetime 被视为垃圾前的生存期,超过此时间没有动作,数据会被清走
注意的是,gc不是每次启动会话都会被执行,而是由session.gc_probability 和 session.gc_divisor的比率决定的

结论:控制SESSION的生存期有几种方法
一是cookie_lifttime,这种方式无论有无动作,都会在指定时间内销毁
二是在read中根椐保存时间控制,此方法在有动作时时间会一直有效
三设定session.gc_probability 和 session.gc_divisor的比率为1(即每次会话都会启用gc),再设定gc.maxlifetime来指定生存期,此方法也是在用户有动作时时间一直有效

3)回调函数的执行时机
open 在运行session_start()时执行
read 在运行session_start()时执行,因为在session_start时,会去read当前session数据并写入$_SESSION变量
destroy 在运行session_destroy()时执行
close 在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完成后被执行
gc 执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,即session_start会相继执行open,read和gc
write 此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行

结论:
session_start //执行open(启动会话),read(读取session数据至$_SESSION),gc(清理垃圾)
脚本中间所有对$_SESSION的操作均不会调用这些回调函数
session_destroy //执行destroy,销毁当前session(一般是删除相应的记录或文件),相应地,此回调函数销毁的只是session的数据,但此时

var_dump一下$_SESSION变量,仍然有值的,但此值不会在close后被write回去
session_write_close() //执行write和close,保存$_SESSION至存储,如不手工使用此方法,则会在脚本结束时被自动执行

清晰了以上信息,将对你清楚了解SESSION的工作原理有很大的帮助...

4)直接使用memcache作session处理
在我写了一系列的memcache来保存session的代码后,无意中发现,可以直接在php.ini中设定使用memcache作为session处理,而无须另外编码,方法是:
修改php.ini中的以下值
session.save_handler = memcache
session.save_path = 'tcp://host1:11211' #有多个时直接用","分隔即可
如果只想在特定的应用里使用memcache储存session,可以使用ini_set的方法对以上两个参数进行设定

要测试一下是否真正用上了memcache,可以先捕足到使用的PHPSESSID,再作为KEY用memcach去读一下,就清楚了

<?php
    /**
     * session使用memcached Aboc QQ:9986584
     */


     class Session{

          //过期时间
          private $_LEFT_TIME = 3600;
          
          //当前时间
          private $_nowtime = 0;
          
          //过期的确切时间
          private $_expiry = 0;

          private $_sessionid = '';
          
          private $_memcached_host = MEMCACHEDHOST;
          private $_memcached_port = MEMCACHEDPORT;
          public $mem;
          
          public function open() {
              $this->_nowtime = time();
              $this->_expiry = $this->_nowtime+$this->_LEFT_TIME;
              if (isset($_COOKIE['PHPSESSID'])){
                $this->_sessionid = $_COOKIE['PHPSESSID'];
                //session_id($this->_sessionid);
                $this->write_sessionid($this->_sessionid);
            } else {
                /**
                 * 要弄一个唯一的值才可以
                 */
                $tempsessionid = md5($_SERVER['REMOTE_ADDR'].$this->getIp().$_SERVER['HTTP_USER_AGENT'].rand(100000,999999));
                $this->write_sessionid($tempsessionid);
                $this->_sessionid = $tempsessionid;
                session_id($this->_sessionid);
            }
            $this->mem = new Memcache;
            $this->mem->connect($this->_memcached_host,$this->_memcached_port);      
         }
         
         /**
          * 设置过期时间,秒
          * Enter description here ...
          * @param unknown_type $seconds
          */
        public function setLefttime($seconds=3600){
            $this->_LEFT_TIME = $seconds;
        }
          
         private function getIp() {
        if (isset ( $_SERVER )) {
            if (isset ( $_SERVER ["HTTP_X_FORWARDED_FOR"] )) {
                $realip = $_SERVER ["HTTP_X_FORWARDED_FOR"];
            } else if (isset ( $_SERVER ["HTTP_CLIENT_IP"] )) {
                $realip = $_SERVER ["HTTP_CLIENT_IP"];
            } else {
                $realip = $_SERVER ["REMOTE_ADDR"];
            }
        } else {
            if (getenv ( "HTTP_X_FORWARDED_FOR" )) {
                $realip = getenv ( "HTTP_X_FORWARDED_FOR" );
            } else if (getenv ( "HTTP_CLIENT_IP" )) {
                $realip = getenv ( "HTTP_CLIENT_IP" );
            } else {
                $realip = getenv ( "REMOTE_ADDR" );
            }
        }
        if(isset($realip[16]))$realip = substr($realip,0,15);
        return $realip;
        }
          
          /**
           * 将自定义的sessionid写入cookie
           *
           * @param unknown_type $sessionid
           */
          private function write_sessionid($sessionid){
              setcookie('PHPSESSID',$sessionid,$this->_expiry,'/');              
          }

          public function close(){

          }

          /**
           * 读
           */
          public function read() {
              //echo $this->_sessionid;
              $content =$this->mem->get($this->_sessionid);
              if ($content){
                  return $content;
              }else{
                  $this->mem->set($this->_sessionid,'',0,$this->_LEFT_TIME);
                  return false;
              }
          }

          /**
           * 写
           */
          public function write( $sessionid , $sessdata ) {
             $this->mem->replace($this->_sessionid,$sessdata,0,$this->_LEFT_TIME);
               return true;
          }
          
          /**
           * 指定销毁
           */
          public function destroy() {
              $this->mem->delete($this->_sessionid);
          }

          /**
           * 销毁过期的数据
           */
          public function gc() {
                  //         
          }
          
          
          public function __destruct(){
              //$this->gc();
          }

     }

     $session  = new Session();
     session_set_save_handler(
                 array(&$session,'open'),
                 array(&$session,'close'),
                 array(&$session,'read'),
                 array(&$session,'write'),
                 array(&$session,'destroy'),
                 array(&$session,'gc')
     );
     session_start();
?>

2012-1-30 18:24 Monday  

今天更新了一下smarty到3.0,结果发现项目中的__autoload()不能用了,原来是因为smarty改变了autoload的方式。

解决方法如下:

function autoload($className){
    if (file_exists(SITEROOT.'include/module/'.$className.'.class.php'))
    include SITEROOT.'include/module/'.$className.'.class.php';
    else
    die('类'.$className.'文件不存在');
}
spl_autoload_register("autoload");

用上面的方式还可以依顺序同时载入几个autoload方法哦

<?php
/**
 * PHP操作mssql数据库类,含分页类
 * Enter description here ...
 * @author aboc 9986584 2011-04-09
 *
 */
class DB_Handle{
var $ClassName = "DB_Handle";

var $Server;
var $UserName;
var $Password;
var $Database;

var $LinkID=0;
var $QueryResult="";
var $LastInsertID = "";

//* private ignore=>ignore the error and continue, halt=>report the error and halt, report=>report the error and continue
var $Halt_On_Error = "report";

var $Error = "";
var $ErrNo = 0;

var $total = 0;
var $page = 0;
var $page_num = 10;
var $page_size = 10;
var $page_name = 'page';

//* remark: This is the db_mysql_class's structure     * function: Set the server,username,password,database variable.
function DB_Handle($server="",$username="",$password="",$database=""){
    $this->Server = $server;
    $this->UserName = $username;
    $this->Password = $password;
    $this->Database = $database;    
}

    //* function: Connect database and select database    * success: retun 1    * failed: return 0
function connect(){
    $this->LinkID = @mssql_pconnect($this->Server,$this->UserName,$this->Password);
    if(!$this->LinkID){
    $this->halt("mssql_pconnect($this->Server,$this->UserName,$this->Password): Failed");
    return 0;
    }
    if(!@mssql_select_db($this->Database)){
    $this->halt("mssql_select_db($this->Database) Failed.");
    return 0;
    }
    return 1;
}
//* function: Check the database, if exist then select        * exist: return 1        * not exist: return 0
function selectDatabase(){
    if(@mssql_select_db($this->Database))
    return 1;
    else
    return 0;
}
//* function: Execute SQL instruction    * success: return SQL Result.    * failed: return 0;
function execQuery($sql=""){
    if($this->LinkID == 0){
    $this->halt("Execute SQL Failed: Hava not valid database connect.");
    return 0;
    }
    ob_start();
    $this->QueryResult = mssql_query($sql,$this->LinkID);
    $error = ob_get_contents();
    ob_end_clean();
    if($error){
    $this->halt("Execute SQL: mssql_query($sql,$this->LinkID) failed.");
    return 0;
    }
    $reg = "#insert into#";
    if(preg_match($reg,$sql)){
    $sql = "select @@IDENTITY as id";
    $res = mssql_query($sql,$this->LinkID);
    $this->LastInsertID = mssql_result($res,0,id);
    }
    return $this->QueryResult;
}
//* function: Get the query result's row number//* success: return the row fo the Result//* failed: return 0
function getTotalRowNum($result=""){
    if($result != "") $this->QueryResult = $result;
    $row = @mssql_num_rows($this->QueryResult);
    if($row >= 0) return $row;
    $this->halt("Get a row of result Failed: Result $result is invalid.");
    return 0;
}
//* function: Get the last insert record's id    //* success: return id        //* failed: return 0
function lastInsertID(){
    return $this->LastInsertID;
}
//* function: Get a field's value    * success: return value of the field        * failed: return 0
function getField($result="",$row=0,$field=0){
    if($result != "") $this->QueryResult = $result;
    $fieldvalue = @mssql_result($this->QueryResult,$row,$field);
    if($fieldvalue != "") return $fieldvalue;
    $this->halt("Get field: mssql_result($this->QueryResult,$row,$field) failed.");
    return 0;
   //Here should have error handle
}
//* function: Get next record    * success: return a array of the record's value            * failed: return 0
function nextRecord($result=""){
    if($result != "") $this->QueryResult = $result;
    $record = @mssql_fetch_array($this->QueryResult);
    if(is_array($record)){
        foreach ($record as $key=>$row)
        $record[$key] = trim($row);
        return $record;
    }
    //$this->halt("Get the next record Failed: the Result $result is invalid.");
    return 0;
}
//* function: Free the Query Result    * success return 1   * failed: return 0
function freeResult($result=""){
    if($result != "") $this->QueryResult = $result;
    return @mssql_free_result($this->QueryResult);
}
//* function: Set the Halt_On_Error's state     * success: return 1    * failed: return 0
function setHaltOnError($state="ignore"){
    if(!($state == "ignore" || $state == "report" || $state == "halt")){
    $this->halt("Set the Halt_On_Error Fail: There is no state value $state");
    return 0;       
    }
    $this->Halt_On_Error = $state;
    return 1;
}
//* function: Get the Halt_On_Error's state
function getHaltOnError(){
    return $this->Halt_On_Error;
}
//* function: Get the class's name
function toString(){
    return $this->ClassName;
}
//* function: Error handle
function halt($msg){
    $this->Error = @mysql_error($this->LinkID);
    $this->ErrNo = @mysql_errno($this->LinkID);
    if ($this->Halt_On_Error == "ignore") return;
    $this->makeMsg($msg);
    if ($this->Halt_On_Error == "halt") die("Session halted");
}

//* function: Make error information and print
function makeMsg($msg){
    printf("Database error: %s
\n", $msg);
    printf("MySQL Error: %s (%s)
\n",$this->ErrNo,$this->Error);
}
/**
 * 以下为分页类
 */

    private function getQuery(){
        $query = '';
        if( isset($_GET) && is_array($_GET)){
            foreach ($_GET as $key=>$value){
                if ($key == 'page')continue;
                $query .= !empty($query)?'&'.$key.'='.$value:$key.'='.$value;
            }
        }
        $query .= empty($query)?'':'&';
        return $this->getFilename().$query;
    }
    
    /**
     * 获取当前的url文件名并带上?
     */
    private function getFilename() {
        //$filename = str_replace($_SERVER['QUERY_STRING'],'',basename($_SERVER["REQUEST_URI"]));
        $filename = str_replace('?'.$_SERVER['QUERY_STRING'],'',basename($_SERVER["REQUEST_URI"])).'?';
        return $filename;
    }
    
    /**
     * 返回带分页名的连接字符
     */
    private function returnPageLink( $page ){
        return $this->getQuery().$this->page_name.'='.$page;
    }

    /**
     * 下一页链接
     */
    function nextPageLink(){
        if( $this->page != $this->page_num )
        return $this->returnPageLink($this->page+1);
        else
        return '#';
    }    

   function getListData($sql,$num=10){
       $this->execQuery($sql);
       $this->page_num = $this->getTotalRowNum();
       if (!$this->page_num || !$num )return array();
       $this->page_size = $num;
       $this->page = isset($_GET[$this->page_name])?intval($_GET[$this->page_name]):1;
       $pageTotal = ceil($this->page_num/$num);
       if ($this->page < 0)$this->page = 0;
       if ($this->page > $pageTotal) $this->page = $pageTotal;
       $list = array();
       if (mssql_data_seek($this->QueryResult, ($this->page-1)*$this->page_size)){
           for ($i=0;$i<$num;$i++){
               $list[] = $this->nextRecord();
           }           
       }
       return $list;
   }


    /**
     * 输出中文分页链接 上一页,下一页
     *
     * @return unknown
     */
    function pagelist( $total='总共',$dataname='条',$now='当前',$page='页',$first='第一页',$last='尾页',$prev='上一页',$next='下一页' ){
        $total='<span>'.$total.$this->page_size.$dataname.' '.$now.($this->page).'/'.($this->page_num).$page.'</span>';
        $startpage='<a href="'.$this->returnPageLink(1).'">'.$first.'</a>';
        $endpage='<a href="'.$this->returnPageLink($this->page_num).'">'.$last.'</a>';
        if($this->page == 1){
            $prepage='<span>'.$prev.'</span>';
        }else{
            $prepage='<a href="'.$this->returnPageLink($this->page-1).'">'.$prev.'</a>';
        }
        if($this->page==$this->page_num){
            $nextpage='<span>'.$next.'</span>';
        }else{
            $nextpage='<a href="'.$this->returnPageLink($this->page+1).'">'.$next.'</a>';
        }
        if($this->page_size == 0)return '';
        return $total.' '.$startpage.' '.$prepage.' '.$nextpage.' '.$endpage;
    }
    
    /**
     * 输出下拉框的列表
     *
     */
    function select() {
        $select = '<select name="pageselect" id="pageselect"  onchange="window.location=\''.$this->getQuery().$this->page_name.'=\'+pageselect.value">';
        $totalnum = $this->page_num;
        for($i=1;$i<=$totalnum;$i++) {
            if($this->page == $i){
                $str = ' selected="selected"';
            } else {
                $str = '';
            }
            $select .= '<option value="'.$i.'"'.$str.'>'.$i.'</option>';
        }
        $select .= '</select>';
        if($this->page_size == 0)$select = '';
        return $select;        
    }

    /**
     * 输入页数到多少页
     *
     */
    function gotoPage($buttonname='到'){
        $string = '<input type="text" size="3" name="dm_pagenum"><input type="button" value="'.$buttonname.'" onclick="window.location=\''.$this->getQuery().$this->page_name.'=\'+dm_pagenum.value"> ';
        if($this->page_size == 0)$string = '';
        return $string;
    }
    
    function pageListBaidu($first='首页',$pre_page='上一页',$next_page='下一页',$last='尾页' ,$shownum=6) {
        if($this->page_num == 1) return;
        $pagelink = '';
        if($this->page != 1) {
            $pagelink .= '[<a href="'.$this->returnPageLink(1).'">'.$first.'</a>]&nbsp;';
            $pagelink .= '[<a href="'.$this->returnPageLink($this->page-1).'">'.$pre_page.'</a>]&nbsp;';
        }
        for ($i=$shownum;$i>=1;$i--) {
            $tmp_page = $this->page - $i;
            if( $tmp_page >= 1 ) {
                $pagelink .= '[<a href="'.$this->returnPageLink($tmp_page).'">'.$tmp_page.'</a>]&nbsp;';
            }
        }
        $pagelink .= '<span>'.$this->page.'</span>';
        for ($i=1;$i<=$shownum;$i++) {
            $tmp_page = $this->page + $i;
            if( $tmp_page <= $this->page_num ) {
                $pagelink .= '[<a href="'.$this->returnPageLink($tmp_page).'">'.$tmp_page.'</a>]&nbsp;';
            }
        }        
        
        if( $this->page != $this->page_num ){
            $pagelink .= '[<a href="'.$this->returnPageLink($this->page+1).'">'.$next_page.'</a>]&nbsp;';
            $pagelink .= '[<a href="'.$this->returnPageLink($this->page_num).'">'.$last.'</a>]';
        }
        if($this->num == 0)$pagelink = '';
        return $pagelink;   
    }


}

一,getimagesize不知道为什么在本地会很慢,注释掉就可以了

二,关于这个用网上说的方法吧

php环境兼容性问题--
内容编码错误
无法显示您尝试查看的页面,因为它使用了无效或者不支持的压缩格式。
请联系网站的所有者以告知此问题。

以前也遇到过同样的问题,记得是PHP代码ob_start('ob_gzhandler')导致的,导致的原因有两种,

1. 服务器不支持这种压缩格式,可使用function_exists('ob_gzhandler')判断,解决方法 ob_start('ob_gzhandler')改为ob_start();
2. 使用ob_start('ob_gzhandler')时候前面已经有内容输出,检查前面内容以及require include调用文件的内容。若无法找到可以在调用其它文件前使用ob_start(),调用之后使用 ob_end_clean () 来清除输出的内容;

在 调用ob_start();前加入 ob_end_clean () 

   还有一点需要注意的是,PHP5.30版本,默认不再支持<?=$username;?>这样的语法,输出变量需使用& lt;?php echo $username;?>语法才可以。你可以通过将 php.ini 中的 short_open_tag 设置为 On,这样就可以兼容原来的语法。

2012-1-30 18:02 Monday  
基本上导出的文件分为两种:
1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已。修改这种文件后再保存,通常会提示你是否要转换成Excel文件。
优点:简单。
缺点:难以生成格式,如果用来导入需要自己分别编写相应的程序。
2:Excel格式,与类Excel相对应,这种方法生成的文件更接近于真正的Excel格式。

如果导出中文时出现乱码,可以尝试将字符串转换成gb2312,例如下面就把$yourStr从utf-8转换成了gb2312:
$yourStr = mb_convert_encoding("gb2312", "UTF-8", $yourStr);

一、PHP导入Excel

1:还是用PHPExcel,官方网站: http://www.codeplex.com/PHPExcel。

2:使用PHP-ExcelReader,下载地址: http://sourceforge.net/projects/phpexcelreader
举例:
<?php
require_once 'Excel/reader.php';

// ExcelFile($filename, $encoding);
$data = new Spreadsheet_Excel_Reader();

// Set output Encoding.
$data->setOutputEncoding('utf8');

$data->read(' jxlrwtest.xls');


error_reporting(E_ALL ^ E_NOTICE);

for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
    for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
        echo "\"".$data->sheets[0]['cells'][$i][$j]."\",";
    }
    echo "\n";
}

?>

总结 php导出Excel php导入Excel PhpExcel使用说明 PhpExcel使用手册

方法一:特点,简单,省心,制表符"\t"用户分割同一行中的列,换行符"\t\n"可以开启下一行,还能够自动识别日期格式,货币格式等!

<?php
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename=test_data.xls");
//输出内容如下:
echo   "姓名"."\t";
echo   "年龄"."\t";
echo   "学历"."\t";
echo   "\n";
echo   "张三"."\t";
echo   "25"."\t";
echo   "本科"."\t";
?>
动态版
<?
$sql = "SELECT * FROM " .$ecs->table('member'). " ";
$classres = $db->Execute($sql);
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment; filename=test_data.xls");
echo 'ID'.chr(9);
echo 'txtPEOClientCode'.chr(9);
echo 'jcompany'.chr(9);
echo 'fcompany'.chr(9);
echo 'ecompany'.chr(9);
echo 'rcompany'.chr(9);
echo 'txtAddress'.chr(9);
echo 'txtCompanyTel'.chr(9);
echo 'txtFax'.chr(9);
echo 'txtPostCode'.chr(9);
echo chr(13);
while ($classrow = $classres->FetchRow())
{
//输出到xls
     echo $classrow['id'].chr(9);
     echo $classrow['txtPEOClientCode'].chr(9);
     echo $classrow['jcompany'].chr(9);
     echo $classrow['fcompany'].chr(9);
     echo $classrow['ecompany'].chr(9);
     echo $classrow['rcompany'].chr(9);
     echo $classrow['txtAddress'].chr(9);
     echo $classrow['txtCompanyTel'].chr(9);
     echo $classrow['txtFax'].chr(9);
     echo $classrow['txtPostCode'].chr(9);
     echo chr(13);
}

现在用的Php-excel(http://code.google.com/p/php-excel/downloads/list),代码也很简单:

require (dirname (__FILE__) . "./class-excel-xml.inc.php");
$sql = "SELECT * FROM " .$ecs->table('member'). " ";
$classres = $db->Execute($sql);

while($classrow = $classres->FetchRow())
{
$doc[] =   array ($classrow['txtPEOClientCode'], $classrow['jcompany'], $classrow['txtBillTo']);
}


$xls = new Excel_XML;
$xls->addArray($doc);
$xls->generateXML("mytest");

我用的utf-8,结果有乱码问题,把class-excel-xml.inc.php utf8_encode($v) 替换成$v就没有乱码问题了。


1:第一推荐无比风骚的PHPExcel,官方网站: http://www.codeplex.com/PHPExcel
导入导出都成,可以导出office2007格式,同时兼容2003。
下载下来的包中有文档和例子,大家可以自行研究。
抄段例子出来:

http://www.codeplex.com/PHPExcel

<?php
ini_set("display_errors",1);//是否显示报错信息
ini_set('include_path', ini_get('include_path').';D:\\PHP\\PHPExcel 1.6.6\\Tests\\classes\\');//设置此页面包含路径

include "classes/PHPExcel.php";
include "classes/PHPExcel/Writer/Excel5.php";

//创建一个excel
$objPHPExcel = new PHPExcel();
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);

$objWriter->save("xxx.xls");
?>

--------------------------------------------------------------------------------------
<?
//设置PHPExcel类库的include path
set_include_path('.'. PATH_SEPARATOR .'D:\workspace\biznaligy_eh\dev_src\includes\PHPExcel' . PATH_SEPARATOR . get_include_path());
   
/**
    * 以下是使用示例,对于以 //// 开头的行是不同的可选方式,请根据实际需要
   * 打开对应行的注释。
* 如果使用 Excel5 ,输出的内容应该是GBK编码。
   */
   require_once 'PHPExcel.php';
   require_once 'PHPExcel/Writer/Excel5.php';     // 用于其他低版本xls

   require_once 'PHPExcel/Writer/Excel2007.php'; // 用于 excel-2007 格式

// 创建一个处理对象实例
   $objExcel = new PHPExcel();

// 创建文件格式写入对象实例, uncomment
   $objWriter = new PHPExcel_Writer_Excel5($objExcel);     // 用于其他版本格式
   //or
//$objWriter = new PHPExcel_Writer_Excel2007($objExcel); // 用于 2007 格式
//$objWriter->setOffice2003Compatibility(true);


//设置文档基本属性
   $objProps = $objExcel->getProperties();
   $objProps->setCreator("Zeal Li");
   $objProps->setLastModifiedBy("Zeal Li");
   $objProps->setTitle("Office XLS Test Document");
    $objProps->setSubject("Office XLS Test Document, Demo");
   $objProps->setDescription("Test document, generated by PHPExcel.");
   $objProps->setKeywords("office excel PHPExcel");
    $objProps->setCategory("Test");
   //设置当前的sheet索引,用于后续的内容操作。
//一般只有在使用多个sheet的时候才需要显示调用。
//缺省情况下,PHPExcel会自动创建第一个sheet被设置SheetIndex=0
   $objExcel->setActiveSheetIndex(0);

    $objActSheet = $objExcel->getActiveSheet();

//设置当前活动sheet的名称
    $objActSheet->setTitle('测试Sheet');


//设置单元格内容

//由PHPExcel根据传入内容自动判断单元格内容类型
    $objActSheet->setCellValue('A1', '字符串内容'); // 字符串内容
    $objActSheet->setCellValue('A2', 26);            // 数值
    $objActSheet->setCellValue('A3', true);          // 布尔值
    $objActSheet->setCellValue('A4', '=SUM(A2:A2)'); // 公式

//显式指定内容类型
   $objActSheet->setCellValueExplicit('A5', '847475847857487584', PHPExcel_Cell_DataType::TYPE_STRING);

   //合并单元格
    $objActSheet->mergeCells('B1:C22');

   //分离单元格
    $objActSheet->unmergeCells('B1:C22');
  
//设置单元格样式

   //设置宽度
   $objActSheet->getColumnDimension('B')->setAutoSize(true);
   $objActSheet->getColumnDimension('A')->setWidth(30);

    $objStyleA5 = $objActSheet->getStyle('A5');
  
//设置单元格内容的数字格式。

//如果使用了 PHPExcel_Writer_Excel5 来生成内容的话,
//这里需要注意,在 PHPExcel_Style_NumberFormat 类的 const 变量定义的
//各种自定义格式化方式中,其它类型都可以正常使用,但当setFormatCode
   //为 FORMAT_NUMBER 的时候,实际出来的效果被没有把格式设置为"0"。需要
   //修改 PHPExcel_Writer_Excel5_Format 类源代码中的 getXf($style) 方法,
//在 if ($this->_BIFF_version == 0x0500) { (第363行附近)前面增加一
   //行代码:
//if($ifmt === '0') $ifmt = 1;

//设置格式为PHPExcel_Style_NumberFormat::FORMAT_NUMBER,避免某些大数字
//被使用科学记数方式显示,配合下面的 setAutoSize 方法可以让每一行的内容
   //都按原始内容全部显示出来。
   $objStyleA5 ->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER);

//设置字体
    $objFontA5 = $objStyleA5->getFont();
    $objFontA5->setName('Courier New');
    $objFontA5->setSize(10);
    $objFontA5->setBold(true);
    $objFontA5->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);
    $objFontA5->getColor()->setARGB('FF999999');

//设置对齐方式
    $objAlignA5 = $objStyleA5->getAlignment();
    $objAlignA5->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
    $objAlignA5->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

//设置边框
   $objBorderA5 = $objStyleA5->getBorders();
   $objBorderA5->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
   $objBorderA5->getTop()->getColor()->setARGB('FFFF0000'); // color
   $objBorderA5->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
   $objBorderA5->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
   $objBorderA5->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

//设置填充颜色
   $objFillA5 = $objStyleA5->getFill();
   $objFillA5->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
   $objFillA5->getStartColor()->setARGB('FFEEEEEE');

//从指定的单元格复制样式信息.
    $objActSheet->duplicateStyle($objStyleA5, 'B1:C22');

//添加图片
   $objDrawing = new PHPExcel_Worksheet_Drawing();
   $objDrawing->setName('ZealImg');
   $objDrawing->setDescription('Image inserted by Zeal');
   $objDrawing->setPath('./zeali.net.logo.gif');
   $objDrawing->setHeight(36);
   $objDrawing->setCoordinates('C23');
   $objDrawing->setOffsetX(10);
   $objDrawing->setRotation(15);
   $objDrawing->getShadow()->setVisible(true);
   $objDrawing->getShadow()->setDirection(36);
   $objDrawing->setWorksheet($objActSheet);

//添加一个新的worksheet
   $objExcel->createSheet();
   $objExcel->getSheet(1)->setTitle('测试2');

//保护单元格
   $objExcel->getSheet(1)->getProtection()->setSheet(true);
   $objExcel->getSheet(1)->protectCells('A1:C22', 'PHPExcel');

//输出内容

   $outputFileName = "output.xls";
//到文件
////$objWriter->save($outputFileName);
//or
//到浏览器
   header("Content-Type: application/force-download");
   header("Content-Type: application/octet-stream");
   header("Content-Type: application/download");
   header('Content-Disposition:inline;filename="'.$outputFileName.'"');
   header("Content-Transfer-Encoding: binary");
   header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
   header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
   header("Pragma: no-cache");
   $objWriter->save('php://output');
?>
2012-1-30 18:02 Monday  

起因:
公司购买的shopex程序取得商业授权认证失败,对方程序员弄了个测试代码来表明是由于我对服务器的设置有问题导致的。

原代码:

$fp = fsockopen(http://www.shopex.cn/, 80, $errno, $errstr, 30);

错误提示:

$fp = fsockopen("http://www.shopex.cn/", 80, $errno, $errstr, 30);
Warning: fsockopen() [function.fsockopen]: unable to connect to http://www.shopex.cn/:80 (Unable to find the socket transport "http" – did you forget to enable it when you configured PHP?) in D:\xampp\htdocs\mediashop_cn\test.php on line 2
Unable to find the socket transport "http" – did you forget to enable it when you configured PHP? (24)

解决:

1.修改代码为:

$fp = fsockopen("www.shopex.cn", 80, $errno, $errstr, 30);

$fp = fsockopen("tcp://www.shopex.cn", 80, $errno, $errstr, 30);

参考:
http://uk.php.net/manual/en/function.fsockopen.php
http://uk.php.net/manual/en/transports.php

2.设置服务器防火墙允许服务器访问外部网站,至少允许访问www.shopex.cn

2012-1-30 17:54 Monday  
如果是用的smarty,出现页面空白不报错的话,在$smarty->display("index.tpl");前输出正常的话,有可能是编译文件的问题,删除编译的文件就好了。
2012-1-30 17:53 Monday  

PclZip简介与使用

PclZip介绍
PclZip library能够压缩与解压缩Zip格式的压缩档(WinZip、PKZIP);且能对此类类档案进行处理,包括产生压缩档、列出压缩档的内容以及解压缩档案等等。由于能够在伺服器端进行压缩与解压缩的动作,所以相当方便使用。
PclZip定义一个PclZip类别,其类别物件可视为一个ZIP档案,亦提供method来进行处理。

如何使用PclZip
1.基础
所有的功能都由pclzip.lib.php这个档案提供,PclZip library可于其首页(www.phpconcept.net/pclzip/index.en.php)下载。所有的PKZIP档案其实就是一个 PclZip的类别物件。当产生一个PclZip档案(ie, PclZip类别物件),就会先产生一个压缩档,且档名已经指定,但此压缩档的内容尚未存在:

< ?PHP
require_once('pclzip.lib.php');
$archive = new PclZip("archive.zip");
?>

此物件提供了一些public method可用来处理此档案。

2.参数
每一个method有其各自可使用的参数,包括有必须与非必须的参数:

< ?PHP
require_once('pclzip.lib.php');
$archive = new PclZip('archive.zip');

$v_list = $archive->add('dev/file.txt',
PCLZIP_OPT_REMOVE_PATH, 'dev');
?>

上例中的’dev/file.txt’就是必须参数;’PCLZIP_OPT_REMOVE_PATH’则为非必须参数。当然有些method也可以只包含非必须的参数:

< ?PHP
$list = $archive->extract(PCLZIP_OPT_PATH, "folder",
PCLZIP_OPT_REMOVE_PATH, "data",
PCLZIP_CB_PRE_EXTRACT, "callback_pre_extract",);
?>

上例中原本压缩档内档案存放的路径为/data,不过你可以指定解压缩至/folder中。此外,在解压缩之前,会呼叫callback function(’callback_pre_extract()’),此function可让使用者在解压缩的过程中变更档案存放路径与档名,或是选 择某些档案不解压缩。
所有可用的非必要参数可参考网址(www.phpconcept.net/pclzip/man/en/index.php)。

3.回传值
每个method所回传的值可能会不同,将会在每个method中说明。不过大部分的method回传0、error或是阵列。

4.错误处理
从版本1.3之后,错误处理已经整合至PclZip类别中,当一个method回传错误码,可以得知一些额外的讯息以方便错误处理:
* errorName():回传错误名称
* errorCode():回传错误码
* errorInfo():回传错误的描述

接下来会举几个例子来说明如何使用PclZip。

PclZip实例1、产生ZIP压缩档
PclZip($zipname):为PclZip constructor,$zipname为PKZIP压缩档的档名。
主要是产生一个PclZip物件,即一个PKZIP压缩档;但此时,只有压缩档产生出来,并做一些检查(例如是否有开启zlib extension…等),除此之外,并没有做其他动作。
create($filelist, [optional arguments list]):将参数$filelist指定的档案或目录(包含当中所有档案与子目录)加入上述所产生的压缩档中。
而非必要的参数则能够修改压缩档内的档案存放路径。
此method可用的参数可以参考网志(www.phpconcept.net/pclzip/man/en/index.php)。

下面的示例说明如何产生PKZIP压缩档(档名为archive.zip),并将file.txt、data/text.txt以及目录folder(包含当中的档案与子目录)加入刚刚产生的archive.zip中:

< ?PHP
include_once('pclzip.lib.php');
$archive = new PclZip('archive.zip');
$v_list = $archive->create('file.txt,data/text.txt,folder');
if ($v_list == 0) {
die("Error : ".$archive->errorInfo(true));
}
?>

下面的示例说明基本上与上例一样产生archive.zip,但在将file.txt与text.txt压缩于其中时,将路径由data/改为 install/ ;因此,在archive.zip中这两个档案的路径会是install/file.txt与install/text.txt

< ?PHP
include_once('pclzip.lib.php');
$archive = new PclZip('archive.zip');
$v_list = $archive->create('data/file.txt,data/text.txt',
PCLZIP_OPT_REMOVE_PATH, 'data',
PCLZIP_OPT_ADD_PATH, 'install');
if ($v_list == 0) {
die("Error : ".$archive->errorInfo(true));
}
?>

PclZip实例2、列出压缩档内容
listContent( ) :列出压缩档中的内容,包括档案的属性与目录:

< ?PHP
include_once('pclzip.lib.php');
$zip = new PclZip("test.zip");

if (($list = $zip->listContent()) == 0) {
die("Error : ".$zip->errorInfo(true));
}

for ($i=0; $i<sizeof ($list); $i++) {
for(reset($list[$i]); $key = key($list[$i]); next($list[$i])) {
echo "File $i / [$key] = ".$list[$i][$key]."<br>";
}
echo "<br />";
}
?></sizeof>

上例将会回传结果:
File 0 / [filename] = data/file1.txt
File 0 / [stored_filename] = data/file1.txt
File 0 / [size] = 53
File 0 / [compressed_size] = 36
File 0 / [mtime] = 1010440428
File 0 / [comment] =
File 0 / [folder] = 0
File 0 / [index] = 0
File 0 / [status] = ok

File 1 / [filename] = data/file2.txt
File 1 / [stored_filename] = data/file2.txt
File 1 / [size] = 54
File 1 / [compressed_size] = 53
File 1 / [mtime] = 1011197724
File 1 / [comment] =
File 1 / [folder] = 0
File 1 / [index] = 1
File 1 / [status] = ok

PclZip实例3、解压缩档案
extract([options list]) :解压缩PKZIP中的档案或目录。
[options list]可用的参数可参考网址(www.phpconcept.net/pclzip/man/en/index.php)。这些参数能让使用者在解压 缩的时候有更多的选项,譬如指定变更解压缩档案的路径、指定只解压缩某些档案或不解压缩某些档案或者是将档案解压缩成字串输出(可用于readme档)。

下例是一个简单的解压缩档案示例,将压缩档archive.zip内的档案解压缩至目前的目录:

< ?PHP
require_once('pclzip.lib.php');
$archive = new PclZip('archive.zip');


if ($archive->extract() == 0) {
die("Error : ".$archive->errorInfo(true));
}
?>

下例是进阶的解压缩档案使用,archive.zip中所有档案都解压缩于data/中,而特别指明在install/release中的所有档案也直接丢于data/中,而非data/install/ release:

< ?PHP
include('pclzip.lib.php');
$archive = new PclZip('archive.zip');
if ($archive->extract(PCLZIP_OPT_PATH, 'data',
PCLZIP_OPT_REMOVE_PATH, 'install/release') == 0) {
die("Error : ".$archive->errorInfo(true));
}
?>

相关文档:
PclZip官方地址:http://www.phpconcept.net/pclzip/index.php
PclZip手册地址:http://www.phpconcept.net/pclzip/man/en/index.php
PEAR类创建ZIP档案文件:http://www.ccvita.com/10.html
PclZip简介与使用:http://www.ccvita.com/59.html
PclZip:强大的PHP压缩与解压缩zip类:http://www.ccvita.com/330.html

2012-1-30 17:52 Monday  

PHP常用函数手册

PHP常用函数手册判断一个编程语言的功能强弱,可以从他的库函数入手。一个较好的编程语言,必然有较强的库函数。
I/O函数
Flush
函数描述:flush();
说明:函数Flush刷新PHP的输出缓存,它尽量将缓和存中的内容输出到用户的浏览器。
返回值:无
Print
函数描述:print(string arg,string[arg],…);
说明:函数print输入所有的参数。
返回值:若输出成功,返回true(1);否则返回false(0)。
Printf
函数描述:printf(string format,mixed[string]);
说明:函数printf根据所给格式format,输出string。格式以一个%开头,以一个字母结尾,该字母决定输出的数据类型。PHP的类型说明符如表所示。
PHP的类型说明符
类型说明符   说         明
b   输出二进制整数
o   输出八进制整数
x,X   输出十六进制整数,“x”使用小写字母,“X”使用大写字母
d   输出十进制整数
c   输出由整数ASCII代码说明的字符
s   输出字符串
f   输出浮点数
e   输出用科学计数法表示的浮点数
%   输出一个百分号
返回值:无
正规表达式函数
Ereg
函数描述:int ereg (string pattern ,string string ,array[regs]);
说明:函数ereg在参数string中寻找pattern中给出的正规表达式相匹配的项。如果提供了可选reg数组,则每一项匹配将顺序存储在数组 regs[1]开始的各项中。在regs[0]中存储整个正规表达式的匹配项。在函数ereg中,匹配的辨别是区分大小写的。请参看以下程序
返回值:若至少有一处匹配则函数ereg返回true(1);否则返回false(0)。
例子:
<?
$date=”2000-5-4”;
if (ereg(“([0-9]){4})-([0-9]{1,2}-([0-9]){1,2})”,$date,$regs))
{
print(“$regs[3].$regs[2].$regs[1]”);
}
else
{
print(“输出时间格式有误:$date”);
}
?>
该程序输出结果:14.5.2000
Ereg_replace
函数描述:string Ereg_replace(string pattern,string replacement,string string);
说明:函数Ereg_replace可用于替换文本,当参数pattern与参数string中的字串匹配时,他就被参数replacement的内容所 替换。若参数pattern中包含有圆括号的子表达式,则在参数replacement中可以用包含特定的代码来说明哪个子表达式被替换,最多可以有九个 子表达式。其具体形式是用两个反斜杠后跟一个从0~9的单数字,0表示与整个表达式相匹配,1~9表示相应的与前1~9个子表达式相匹配。注意,参数 pattern中的圆括号是可以嵌套的,其表达式序号等于该表达式前的圆括号的数目。
返回值:函数ereg_eplace返回替换后的字符串pattern。
Eregi
函数描述:int eregi(string pattern , string string , array[regs]);
说明:函数eregi与ereg相类似,不同之处是函数eregi进行匹配时不区分大小写。
返回值:若至少有一处相匹配,函数eregi返回true(1),否则返回false(0)。
Eregi_replace
函数描述:string Eregi_replace(string pattern,string replacement,string string);
说明:函数eregi_replace与ereg_replace相类似,不同之处就是函数eregi_replace进行匹配时不区分大小写。
返回值:函数eregi_eplace返回替换后的字符串pattern。
Split
函数描述:array split(string pattern,string string , int[limit]);
说明:函数split以参数pattern作为分界符从参数string 中取行一系列子串,并将它们存入一字符串数组。参数limit限定生成数组的大小,数组中的最后一个元素为参数string中还未分组的所有内容。
返回值:函数split返回生成的字符串数组,如果有一个错误,返回false(0)。
Sql_regcase
函数描述:string sql_regcase(string string);
说明:函数sql_regcase生成一个字符串数组,数组中的各个元素依次为参数string中各个字符的大小写;若在参数string中有一个空格,其对应数组元素的内容为一个空格。
返回值:函数sql_regcase返回所生成字符串数组。
例:
<?
print(sql_regcase(“Hello PHP”));
?>
此程序结果为:[Hh][Ee][Ll][Ll][Oo][ ][Pp][Hh][Pp]
数学函数
Abs
函数描述:mixed abs(mixed number);
返回值:函数abs返回参数number的绝对值。
Acos
函数描述:double acos(double number);
返回值:函数acos返回参数number的反余弦值。如果参数number大于1或小于1,则其反余弦值无意义。
Asin
函数描述;double asin(double number);
返回值:函数asin返回参数number的反正弦值。如果参数number大于1或小于1,则其反正弦值无意义。
Atan
函数描述:double atan(double number);
函数atan返回参数number的反正切值。
Atan2
函数描述:Double atan2(double x , double y);
返回值:函数atan2返回由直角坐标系指定的座标点在极座标系中的角度的弧度值。
BinDec
函数描述:int bindec(string binary_number);
返回值:函数bindec返回一个用二进制数写成的字符串binary_number的整数值。PHP使用32位带符号的整数,其二进制数的第一位是符号位。
Ceil
函数描述:int ceil(double number);
返回值:函数ceil返回大于参数number 的最小整数;若number为整数。,则返回其本身。
Cos
函数描述:double cos(double angle);
返回值:函数cos返回以弧度的大小为参数angle的角的余弦值。
DecBin
与bindec相反,将十进制转为二进制。
DecHex(<->HexDec)
返回十六进制值
DecOct(<->OctDec)
返回八进制值
Deg2rad(<->Rad2reg)
函数描述:double deg2red(double angle);
返回值:函数deg2red返回角度数angle相对应的弧度值。
Exp
函数描述:double exp(double power);
返回值:函数exp返回自然对数的power次幂。
Floor
函数描述:int floor(double number);
返回值:返回参数number的整数部分。
Getrandmax
函数描述:int getrandmax();
返回值;返回由函数rand所能返回的最大值
Log(Log10)
函数描述:Double log(double number);
返回值:返回参数number的自然对数(返回以10为底的对数)
Max (<->Min)
函数描述:mixed max(mixed arg1, mixed arg2, …,mixed argn);
返回值:返回此数组中的最大值(最小值),若参数中有浮点数,则所有参数转化成浮点数,返回值也为浮点数;否则所有参数转化成整数,返回值为整数。
pi
函数描述:double pi();
返回值:函数pi返回圆周率的近似值。
Pow
函数描述:double pow(double base,double power);
返回值:函数pow返回参数base的power次幂。
Rand
函数描述:int rand(int lowest,int longest);
说明:函数rand使用前要用srand激活。
返回值:函数rand返回可选参数lowest和longest之间的一个数(包含两个参数);若无参数,则返回值的范围从零到getrandmax返回的整数。
Round
函数描述:double round(double number);
返回值:函数round返回最接近参数number的整数。
Sin
函数描述:double sin(double angle);
返回值:函数sin返回一个用弧度表示的角的正弦值。
Sqrt
函数描述:double sqrt(double number);
说明:在函数sqrt中,参数number不能小于0。
返回值:函数sqrt返回参数number的平方根。
Srand
函数描述:srand(int seed);
说明:函数srand激活随机数发生器。参数seed是随机产生的种子,即所得的随机数是由参数经过一系列计算所的。
返回值:无。
Tan
函数描述:double tan(duoble angle);
返回值:函数tan返回以弧度表示的角的正切值。
时间函数
CheckDate
函数描述:int checkdate(int month,int date,int year);
说明:在PHP中谔谔所谓合法日期,指的是参数year介于1900~32767之间,month介于1~12之间,day处于当前月的有效日期之间的日期。
返回值:若输入的日期合法,返回true(1);否则返回false(0)。
Date
函数描述:string date(string format, int [timestamp]);
说明:函数date根据参数format生成一个描述日期timestamp的字符串。参数timestamp可选,若给定,则为所需的时间戳,即从1970年1月1日开始的秒数;若为空白,则使用当前日期。Format代码如下表:
返回值:函数date返回生成的日期描述字符串。
函数date的format代码表
代     码   描     述
a   am/pm
A   AM/PM
d   有前导零的月份中的日期
D   三字母简写形式的星期几
F   月份名
h   用1~12表示的小时
H   用0~23表示的小时
I   分钟
j   没有前导零的月份中的日期
l   星期几
m   用1~12表示的月份
M   简写月份名
S   月份中日期的正序后缀
U   从纪元开始的秒数
y   两位的年份
Y   四位的年份
Z   一年之中的日期
Getdate
函数描述:array getdate(int[timnestamp]);
说明:函数生成一个带有所给日期信息的关联数组。参数timestamp为所需的时间戳,若为空,则使用当前日期。关联数组元素如下表所示:
返回值:函数getdate返回生成的关联数组。
函数getdate生成的关联数组元素表
元     素   描     述
hours   24小时格式的小时
mday   月份中的日期
minutes   分钟
mon   数字形式的月份
month   月份的全称
seconds   秒数
wday   从0~6数字形式的星期几
weekday   星期几的名称
yday   一年中数字形式的日期
year   年份
0   日期戳
MkTime
函数描述:int mktime(int hour, int minute, int second, int month, int day, int year);
返回值:函数mktime返回给出日期的时间戳,即从1970年1月1日开始的秒数。所有参数都可选,若为空,则使用当前值。若某参数超过范围,函数mktime也可以正确解释。例如,用13作为月份就等于第二年的一月份。
GmmkTime
函数描述:int gmmktime(int hour, int minute, int second, int month, int day, int year);
返回值:函数gmmktime与函数mktime相类似,但不同的是他的各参数均被认为是格林威治时间。
Time
函数描述:int time();
返回值:函数time返回当前的时间戳。
MicroTime
函数描述:string microtime();
返回值:函数microtime返回一个字符串,其组成为两个由空格隔开的成员,第一个成员是系统时间的毫秒数,第二个成员是从1970年1月1日开始计的秒数,即系统时间的时间戳。
6.2.5字符串操作函数
AddSlashes
函数描述:string addslashes(string string);
说明:函数addslashes在参数string中的单引号(‘)、双引号(“)、反斜杠(\)和空格前添加反斜杠(\)。
返回值:函数addslashes返回添加后的字符串参数string。
Chop
函数描述:string chop(string string);
返回值:函数chop去除参数string中最后一个非空字符后的所有空格,并返回生成的新字符串。
Chr
函数描述:string chr(int ascii);
返回值:函数chr根据所给的ASCII码返回相对应的字符。
Eval
函数描述:eval(string phpcode);
说明:函数eval将参数phpcode作为PHP脚本中的一行代码执行,括号内应用单引号或退格美元符。
返回值:无。
Explode
函数描述:array explode(string separator,string string);
返回值:函数explode返回一个字符串数组,数组元素是由参数separator分隔的参数string的各段内容。
Htmlspecialchars
函数描述:string htmlspecialchars(string string);
说明:在HTML中,某些字符与特殊意义,为保留其原意,则将他们用HTLM语言描述。
‘&’转换为“&”
‘ ” ’转换为‘&qout’
‘<’转换为’ < ’
‘>’转换为‘>’
返回值:函数htmlspecialchars返回转变后的字符串。

Implode
函数描述:string implode(array pieces ,string glue);
返回值:将数组pieces依次用参数glue联结并返回生成的字符串
Jion
函数描述:string join(array pieces ,string glue);
说明:函数jion与函数implode作用完全相同。
Ltrim
函数描述:string ltrim(string string);
返回值:去除参数string中第一个非空字符前的所有空格,并返回生成的新字符串。
Nl2br
函数描述:string nl2br(string string);
返回值:在所有的新行前插入“<br>”,并生成新的字符串。
Ord
函数描述:int ord(string string);
返回值:返回所有字符的ASCII码。
QuoteMeta
函数描述:string quotemeta(string string);
返回值:此函数返回一个字符串,该字符串在参数string中的下列元素前加反斜杠:“.”“+”“\\”“*”“?”“[”“]”“^”“(”“)”“$”
RawurldeCode
函数描述:string rawurldecode(string string);
返回值:将原参数字符串string中的百分号(%)及其后的两位十六进制数替换成对应的文本字符,并返回替换后的字符串。
Sprintf
函数描述:string sprintf(string format,mixed[string]);
返回值:与函数printf作用类似,不同之处是他不将原需输出的字符串发送给浏览器,而是返回该字符串。
Strchr
函数描述:string strchr(string string ,string needle);
说明:与函数strstr的作用相同。
Strcmp
函数描述:int strcmp(string str1,string str2);
说明:函数strcmp比较参数Str1与str2的大小,比较过程区分大小写。
返回值:如果str1大于str2,则函数strcmp返回1;如果str1小于str2,则返回-1;如果两者相等,则返回0。
Strcspn
函数描述:int strcspn(string str1 ,string str2);
返回值:从参数str1的首字符开始,不包括参数str 2中任意一个字符的最短字符串的长度。
(即str2在str1中的位置,返回的位置从0开始。)
StripSlashes
函数描述:string stripslashes(string string);
说明:删除参数string中的反斜杠字符。
返回值:返回经过上述操作的字符串。
Strlen
函数描述:int strlen(string string);
返回值:返回参数字符串string的长度。
Strpos
函数描述:int strops(string string ,string needle);
说明:函数strpos中参数needle以整个字符串起作用。若参数needle为一个数字,则函数自动将其转化成整数并作为相对应的ASCII码使用。
返回值:函数strpos返回参数needle在字符串参数string中的最先位置,位置数从0开始。若在字符串string中不包含needle,则返回false(0)。
Strrpos
函数描述:int strrpos(string string ,string needle);
说明:与函数strpos不同,函数strrpos中,参数needle中起作用的只是其首字符。若参数needle为一个数字,则函数自动将其转化成整数并作为相对应的ASCII码使用。
返回值:函数strrpos返回参数needle在字符串参数string中的最后位置,位置数从0开始。若在字符串string中不包含needle,则返回false(0)。
Strrchr
函数描述:string strrchr(string string ,string needle);
说明:在函数strrchr中,参数needle中起作用的只是其首字符。若参数needle为一个数字,则函数自动将其转化成整数并作为相对应的ASCII码使用。
返回值:函数strrchr返回string中由最后一个needle字符开始及其之后的所有部分。若在字符串string中不包含needle,则返回false(0)。
Strrev
函数描述:string strrev(string string);
返回值:函数strrev将参数string倒置并返回。
StrStr
函数描述:string strstr(string string ,string needle);
说明:若参数needle为一个数字,则函数自动将其转化成整数并作为相对应的ASCII码使用。
返回值:函数strstr返回参数string中从参数needle开始及其之后的部分,包括参数needle。
Strtok
函数描述:string strtok(string str1,string str2);
返回值:返回参数str1中在参数str2首字母前的字符串。
Strtolower(<-> Strtoupper)
函数描述:string strtolower(string string);
说明:jiang参数string中的大写字母替换成小写字母。
返回值:替换后的字符串。
Strtr
函数描述:string strtr(string string ,string from ,string to);
说明:函数strtr将参数string中字符from替换成字符to,若参数from和参数to的长度不同,则较长字符串中超过较短字符串长度的部分将被丢弃。
返回值:返回替换后的字符串。
Substr
函数描述:string substr(string string,int start,int [length]);
说明:函数substr从参数string中的第start个字符开始,提取出一个长度为length的字符串。如果参数start是正数,则返回字符串 将从参数string首部起第start个字符开始;若为负数,则返回字符串将从参数string尾部逆推的第start个字符开始。如果参数给出并为 正,,则返回的是一个从start开始的长度为length的字符串;如果参数length给出且为负,则返回的字符串以正数第start位字符为首,以 从参数string尾部开始逆推(-length)个字符为结束的字符串;若返回的字符串长度为负,则返回值为NULL。
返回值:返回所提取出的字符串。

2012-1-30 17:48 Monday  

JSON基 于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构:

“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表 (hash table),有键列表(keyed list),或者关联数组 (associative array)。

值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

PHPserialize是将变量序列化,返回一个具有变量类型和结构的字符串表达式,
说起来两者都是以一种字符串的方式来体现一种数据结构,那它们之间有什么区别呢。

先从JSON说起,看一个简单的实例

例一:

  1. var test = {"Name":"Peter","Age":20};
  2. document.write(test.Name + ": " + test.Age);

显示结果:

Peter: 20

变量test中{"Name":"Peter","Age":20}为一个有2个元素的对象(感觉就像PHP的数组):
Name为Peter,Age为20。

当然也可以变得复杂些。

例二:

  1. var test = {"User":{"Name":"Peter","Age":20},"Company":"FORD"};
  2. document.write(test.User.Name + ": " + test.Company);

显示结果:

Peter: FORD这个例子中User元素中包含了Name和Age。

如果要体现多个User,则需要使用数组,区别于对象的"{}",数组使用"[]"。

JSON解析例三:

  1. var test = [
  2.                   {"User":{"Name":"Peter","Age":20},"Company":"FORD"},
  3.                   {"User":{"Name":"Li Ming","Age":20},"Company":"Benz"}
  4.                ];
  5. document.write(test[1].User.Name + ": " + test[1].Company);
  6. //或者使用:document.write(test[1]["User"]["Name"] + ": " + test[1]["Company"]);

JSON解析显示结果:

Li Ming: Benz

通过以上简单实例就能将一些复杂数据通过一个字符串来进行传递,再配合上Ajax的确是方便很多。
下面再来看看PHP的serialize函数的作用。

JSON解析例四:

  1. $arr = array
  2.         (
  3.            'Peter'=> array
  4.            (
  5.              'Country'=>'USA',
  6.              'Age'=>20
  7.            ),
  8.            'Li Ming'=> array
  9.            (
  10.               'Country'=>'CHINA',
  11.               'Age'=>21
  12.            )
  13.          );
  14. $serializeserialize_var = serialize($arr);
  15. echo $serialize_var;

JSON解析显示结果:

  1. a:2:{s:5:"Peter";a:2:{s:7:"Country";s:3:"USA";s:3:"Age";i:20;}s:7:"Li Ming";a:2:{s:7:"Country";s:5:"CHINA";s:3:"Age";i:21;}}

这个结果看上去比JSON要复杂一些,其实也很简单,它说明的就是一些数据类型和结构。
以a:2:{s:7:"Country";s:3:"USA";s:3:"Age";i:20;}为例:

a:2说明这是个有两个元素的数组(array),s:7:"Country";s:3:"USA";为第一个元素,s:7说明这是有7个字符的字符串(string),后面i:20;也应该猜得到是整数(integer)20。

再来看一下这个例子,

例五:

  1. class test
  2. {
  3.     var $var = 0;
  4.     function add(){
  5.       echo $var+10;
  6.      }
  7. }
  8. $unserialize_var = new test;
  9. $serialize_var = serialize($unserialize_var);
  10. echo $serialize_var;
  11. $unserialize_var = null;
  12. $unserialize_var = unserialize($serialize_var);
  13. $unserialize_var->add();

显示结果:

O:4:"test":1:{s:3:"var";i:0;}

10

从这个例子中可以看出来,serialize对数据的类型和结构都进行的保存,
unserialize后的变量仍然可以使用add()方法

那么PHP和JSON有没有联系呢,熟悉PHP的朋友应该了解PHP5.2.0已经将JSON extension设置为默认组件,也就是说我们可以在PHP中进行JSON操作,其函数为json_encode和json_decode。

例六:

  1. $arr = array
  2.         (
  3.           'Name'=>'Peter',
  4.           'Age'=>20
  5.         );
  6. $jsonencode = json_encode($arr);
  7. echo $jsonencode;


显示结果:

{"Name":"Peter","Age":20}

这个结果和例一中test值是一样的,通过json_encode将PHP中的变量转换为JSON字符出表达式。
再来看看json_decode的用法。

例七:

  1. $var = '{"Name":"Peter","Age":20}';
  2. $jsondecode = json_decode($var);
  3. print_r($jsondecode);

显示结果:

  1. stdClass Object ( [Name] => Peter [Age] => 20 )

这的确验证了,在JSON中{"Name":"Peter","Age":20}是一个对象,但是在PHP中也可以将其转为数组,在json_decode中将ASSOC参数设置为True即可。
例八:

  1. $var = '{"Name":"Peter","Age":20}';
  2. $jsondecode = json_decode($var,true);
  3. print_r($jsondecode);

显示结果:

  1. Array ( [Name] => Peter [Age] => 20 )

另,需要注意的是JSON是基于Unicode格式,所以要进行中文操作要将其转化为UTF-8格式。通过上面这些例子相信大家对于JSON和 PHP的serialize、json_encode都有了初步了解,结合PHP、Javascript、JSON以及Ajax就可以完成强大的数据交互 功能。

MYSQL的事务处理主要有两种方法:

1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认

2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束。
注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!

常用的是第一种方法!

MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!一般MYSQL数据库默认的引擎是MyISAM,这种引擎不支持事务!如果要让MYSQL支持事务,可以自己手动修改:
方法如下:
1.修改c:\appserv\mysql\my.ini文件,找到skip-InnoDB,在前面加上#,后保存文件。
2.在运行中输入:services.msc,重启mysql服务。
3.到phpmyadmin中,mysql->show engines;(或执行mysql->show variables like 'have_%'; ),查看InnoDB为YES,即表示数据库支持InnoDB了。也就说明支持事务transaction了。
4.在创建表时,就可以为Storage Engine选择InnoDB引擎了。如果是以前创建的表,可以使用mysql->alter table table_name type=InnoDB;
或 mysql->alter table table_name engine=InnoDB;来改变数据表的引擎以支持事务。

I. Mysql扩展库API用法
/*方法一*/
Php代码 复制代码
  1. $link = mysql_connect('localhost', 'root', '');   
  2. if (!$link) {   
  3.     die('Could not connect: ' . mysql_error());   
  4. }   
  5. mysql_select_db('test', $link) or die ('Can\'t use [test]: ' . mysql_error());   
  6. mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION");   
  7. //若不使用事務,則$sql執行成功,$sql1執行失敗     
  8. $sql = " insert into test values('11','88') ";   
  9. $sql1 = " insert into test values('11','88','444') ";   
  10. $res = mysql_query($sql);   
  11. $res1 = mysql_query($sql1);     
  12. //因爲使用了事務,則兩個insert都執行失敗   
  13. if($res && $res1){   
  14.      mysql_query("COMMIT");   
  15. } else{   
  16.      mysql_query("ROLLBACK");   
  17. }   
  18. mysql_close($link);  


/*方法二*/
Php代码 复制代码
  1. // connect db....   
  2. mysql_query("SET AUTOCOMMIT=0"); //設置mysql不自動提交,需自行用commit語句提交   
  3. $sql = " insert into test values('11','88') ";   
  4. $sql1 = " insert into test values('11','88','444') ";   
  5. $res = mysql_query($sql);   
  6. $res1 = mysql_query($sql1);     
  7. //因爲使用了事務,則兩個insert都執行失敗   
  8. if($res && $res1){   
  9.          mysql_query("COMMIT");   
  10. }else{   
  11.          mysql_query("ROLLBACK");   
  12. }   
  13. // close db...  


/*方法三*/
Php代码 复制代码
  1. //对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法:   
  2. //MyISAM & InnoDB 都支持,   
  3. //Notes:query語句不能寫在一起如:mysql_query("select * from a;select * from b;");   
  4. $sql_1=" LOCK TABLES test WRITE ";   
  5. mysql_query($sql_1);   
  6.   
  7. $sql_2=" INSERT INTO test VALUES('".$a."','".$b."') ";   
  8. if(mysql_query($sql_2)){   
  9.   echo 'successful!';   
  10. }else{   
  11.   echo 'Unsuccessful!';   
  12. }   
  13. $sql_3=" UNLOCK TABLES ";   
  14. mysql_query($sql_3);   


II. mysqli和pdo的用法
两个库都提供了commit/rollback函数封装,伪代码如下:
Php代码 复制代码
  1. if(conn.commit()){   
  2.    conn.rollback();   

2012-1-30 17:45 Monday  
/**
* 得到文件目录的大小/此数据只是大小数据,而不是所占用的空间
*/
function dirsize($dirname)
{
if(stripos(PHP_OS, "win")!==false){//For Windows
   $obj = new COM ( 'scripting.filesystemobject' );
   if ( is_object ( $obj ))
   {
    $ref = $obj->getfolder ( $dirname );
    $size = $ref->size;
    $obj = null;
    return $size;
   }
   else{
    return false;
   }
}else{// For Linux-like
   $io = popen ( '/usr/bin/du -sk ' . $dirname, 'r' );
   $size = fgets ( $io, 4096);
   $size = substr ( $size, 0, strpos ( $size, ' ' ) );
   pclose ( $io );
   return $size;
}
}


echo dirsize("E:")/(1024*1024);

2012-1-30 17:40 Monday  

用smarty插件,

function smarty_prefilter_chpath($tpl_source,&$smarty)
{
/*这个会将绝对路径也修正,不对
    return preg_replace("/(<(img.*?src|link.*?href|script.*?src)=([\"']))(.*?)(\\3.*?>)/is","$1".SKINTPL."$4$5",$tpl_source);
    */
    /*这个会将js也修正
    return preg_replace("/(<(img.*?src|link.*?href|script.*?src)=([\"']))(([^(http:\/\/)])(.*?))(\\3.*?>)/is","$1".SKINTPL."$5$6$7",$tpl_source);
    */

    /*这个不修正js */
    return preg_replace("/(<(img.*?src|link.*?href)=([\"']))(([^(http:\/\/)])(.*?))(\\3.*?>)/is","$1".SKINTPL."$5$6$7",$tpl_source);
}

文件取名prefilter.chpath.php,放到plugins,用 $smarty->load_filter('pre','chpath');就行了

最新修改此函数如下:

function smarty_prefilter_chpath($tpl_source,&$smarty)
{
/*
    return preg_replace("/(<(img.*?src|link.*?href|script.*?src)=([\"']))(.*?)(\\3.*?>)/is","$1".SKINTPL."$4$5",$tpl_source);
    */
    /*
    return preg_replace("/(<(img.*?src|link.*?href|script.*?src)=([\"']))(([^(http:\/\/)])(.*?))(\\3.*?>)/is","$1".SKINTPL."$5$6$7",$tpl_source);
    */
    /*
    return preg_replace("/(<(img.*?src|link.{1,100}href)=([\"']))(([^(http:\/\/|\{\$imgurl\})])(.*?))(\\3.*?>)/is","$1".SKINTPL."$5$6$7",$tpl_source);
    */
    return preg_replace("/(<(img.*?src|link.{1,100}href)=([\"']))(images|style)(.*?)(\\3.*?>)/is","$1".SKINTPL."$4$5$6",$tpl_source);
}