ucenter双向登陆启示录 不指定

jed , 2009-4-6 13:15 , 代码编程 , 评论(0) , 阅读(3640) , Via 本站原创

通过ucenter可以实现应用程序之间同步登陆,同步退出。好多人都实现了单向同步登陆,却没有实现双向的同步登陆,即就是通过应用程序登陆后,可以同步登陆到discuz论坛等程序,却不能实现登陆论坛以后同步登陆应用程序。这是因为没有彻底理解ucenter的工作模式,仅仅照着官方的例子来做的,而官方的例子向来被人们所诟病,问题太多,BUG也不少。ucenter的登陆采取的是p3p的模式,也有人质疑这种模式,说是站点多了能够拖慢速度,但是对于大部分用户来说已经足够用了,同时也为站点整合提供了一个很好的途径。
下面说说双向登陆:
应用程序登陆后用uc_user_synlogin(客户端client.php程序里的)函数通知ucenter同时建立相应的cookie等,然后ucenter通知各个应用程序uc.php里的'synlogin'的$action,实现其他应用程序的登陆。同理如果做应用程序的反向登陆的话,也需要修改本身的uc.php的synlogin,建立自己的登陆验证。

点击在新窗口中浏览此图片

因为项目的需要,将ecshop2.6,discuz7,以及外部的自制页面应用全部整合到一个站内,要求以上所有位置登录一处,全站通行;一处退出,各处都退出;一处注册,全站有效。

实现这个目的,非Ucenter莫属了,于是下载Ucenter的最新版本1.5进行安装,然后在应用管理中逐个的添加ecshop2.6和discuz7.

以上通信全部成功,可实现ecshop和discuz中,同步登陆和同步退出。

注意到Ucenter1.5的文档里,自带一个examples(范例程序),和我所需要的外部登录页面功能恰好吻合,于是先拿这个范例程序开刀。

调试中发现按照文档里的说明进行设置,无论如何,在ucenter的应用管理里也不能通信成功;
于是进度卡在这里,其实我想告诉同样遇到这个问题的朋友,不必拘泥于非要看到“通信成功”这四个字,其实这里并不是问题的关键。

在example的config.inc.php中,缺少了一个变量:$database = ‘mysql’,这个变量在ucenter的客户端一会要用到,所以需要把这个变量填写进去;
然后,在应用管理->你自己的应用->应用的物理路径填进去,注意这里只要填相对于uc的相对路径就可以,ucenter一会会自动转换为绝对路径;
做完上面的两个步骤,你就可以看到通讯成功了。

PHP获取当前url的函数 不指定

jed , 2009-3-20 16:50 , 代码编程 , 评论(0) , 阅读(2380) , Via 本站原创
预定义变量(一) $_SERVER (附:获取当前URL地址例子)
例:  我需要 获取当前的 的URL  地址
$url_this =  "http://".$_SERVER ['HTTP_HOST'].$_SERVER['PHP_SELF'];
echo $url_this;


则显示 :   http://localhost/lu.php


服务器变量:$_SERVER
注: 在 PHP 4.1.0 及以后版本使用。之前的版本,使用 $HTTP_SERVER_VARS。

$_SERVER 是一个包含诸如头部(headers)、路径(paths)和脚本位置(script locations)的数组。数组的实体由 web 服务器创建。不能保证所有的服务器都能产生所有的信息;服务器可能忽略了一些信息,或者产生了一些未在下面列出的新的信息。这意味着,大量的这些变量在 CGI 1.1 specification 中说明,所以您应该仔细研究它。

这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中您不需要使用 global $_SERVER; 访问它,就如同使用 $HTTP_SERVER_VARS 一样。

$HTTP_SERVER_VARS 包含着同样的信息,但是不是一个自动全局变量。(注意: $HTTP_SERVER_VARS 和 $_SERVER 是不同的变量,PHP 处理它们的方式不同。)

如果设置了 register_globals 指令,这些变量也在所有脚本中可用;也就是,分离了 $_SERVER 和 $HTTP_SERVER_VARS 数组。相关信息,请参阅安全的相关章节 使用 Register Globals。这些单独的全局变量不是自动全局变量。

您或许会发现下面列出的某些 $_SERVER 元素并不可用。注意,如果以命令行方式运行 PHP,下面列出的元素几乎没有有效的(或是没有任何实际意义的)。


“PHP_SELF”
当前正在执行脚本的文件名,与 document root相关。举例来说,在URL地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果。

如果 PHP 以命令行方式运行,该变量无效。

“argv”
传递给该脚本的参数。当脚本运行在命令行方式时,argv 变量传递给程序 C 语言样式的命令行参数。当调用 GET 方法时,该变量包含请求的数据。

“argc”
包含传递给程序的命令行参数的个数(如果运行在命令行模式)。

“GATEWAY_INTERFACE”
服务器使用的 CGI 规范的版本。例如,“CGI/1.1”。

'SERVER_NAME'
当前运行脚本所在服务器主机的名称。如果该脚本运行在一个虚拟主机上,该名称是由那个虚拟主机所设置的值决定。

'SERVER_SOFTWARE'
服务器标识的字串,在响应请求时的头部中给出。

“SERVER_PROTOCOL”
请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。

“REQUEST_METHOD”
访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。

“QUERY_STRING”
查询(query)的字符串。

“DOCUMENT_ROOT”
当前运行脚本所在的文档根目录。在服务器配置文件中定义。

“HTTP_ACCEPT”
当前请求的 Accept: 头部的内容。

“HTTP_ACCEPT_CHARSET”
当前请求的 Accept-Charset: 头部的内容。例如:“iso-8859-1,*,utf-8”。

“HTTP_ACCEPT_ENCODING”
当前请求的 Accept-Encoding: 头部的内容。例如:“gzip”。

“HTTP_ACCEPT_LANGUAGE”
当前请求的 Accept-Language: 头部的内容。例如:“en”。

“HTTP_CONNECTION”
当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。

“HTTP_HOST”
当前请求的 Host: 头部的内容。

“HTTP_REFERER”
链接到当前页面的前一页面的 URL 地址。不是所有的用户代理(浏览器)都会设置这个变量,而且有的还可以手工修改 HTTP_REFERER。因此,这个变量不总是正确真实的。

“HTTP_USER_AGENT”
当前请求的 User_Agent: 头部的内容。该字符串表明了访问该页面的用户代理的信息。一个典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。您也可以使用 get_browser() 得到这个信息。

“REMOTE_ADDR”
正在浏览当前页面用户的 IP 地址。

'REMOTE_HOST'
正在浏览当前页面用户的主机名。反向域名解析基于该用户的 REMOTE_ADDR。

注: 必须配置 Web 服务器来建立此变量。例如 Apache 需要在 httpd.conf 中有 HostnameLookups On。参见 gethostbyaddr()。

“REMOTE_PORT”
用户连接到服务器时所使用的端口。

“SCRIPT_FILENAME”
当前执行脚本的绝对路径名。

“SERVER_ADMIN”
该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。

“SERVER_PORT”
服务器所使用的端口。默认为“80”。如果你使用 SSL 安全连接,则这个值为您所设置的 HTTP 端口。

“SERVER_SIGNATURE”
包含服务器版本和虚拟主机名的字符串。

“PATH_TRANSLATED”
当前脚本所在文件系统(不是文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。

“SCRIPT_NAME”
包含当前脚本的路径。这在页面需要指向自己时非常有用。

“REQUEST_URI”
访问此页面所需的 URI。例如,“/index.html”。

“PHP_AUTH_USER”
当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。

“PHP_AUTH_PW”
当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。

“AUTH_TYPE”
当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。



Tags: ,

在php4下应用scandir()函数 不指定

jed , 2009-3-20 14:37 , 代码编程 , 评论(0) , 阅读(2443) , Via 本站原创
scandir
(PHP 5)

scandir --  列出指定路径中的文件和目录
说明
array scandir ( string directory [, int sorting_order])


返回一个 array,包含有 directory 中的文件和目录。如果 directory 不是一个目录,则返回布尔值 FALSE,并产生一条 E_WARNING 级别的错误。

默认情况下,返回值是按照字母顺序升序排列的。如果使用了可选参数 sorting_order(设为 1),则按照字母顺序降序排列。

例子 1. 简单的 scandir() 例子


<?php
$dir    = '/tmp';
$files1 = scandir($dir);
$files2 = scandir($dir, 1);

print_r($files1);
print_r($files2);

/* Outputs something like:
Array
(
   [0] => .
   [1] => ..
   [2] => bar.php
   [3] => foo.txt
   [4] => somedir
)
Array
(
   [0] => somedir
   [1] => foo.txt
   [2] => bar.php
   [3] => ..
   [4] => .
)
*/
?>  



例子 2. scandir() 在 PHP 4 中的实现



<?php
$dir = "/tmp";
$dh  = opendir($dir);
while (false !== ($filename = readdir($dh))) {
   $files[] = $filename;
}

sort($files);

print_r($files);

rsort($files);

print_r($files);

/* Outputs something like:
Array
(
   [0] => .
   [1] => ..
   [2] => bar.php
   [3] => foo.txt
   [4] => somedir
)
Array
(
   [0] => somedir
   [1] => foo.txt
   [2] => bar.php
   [3] => ..
   [4] => .
)
*/
?>  


Tags:

身份证号码js验证 不指定

jed , 2009-3-16 15:45 , 代码编程 , 评论(0) , 阅读(4102) , Via 本站原创
身份证号码js验证
check_certnumber.js


function checkIdcard(idcard){
  var Errors=new Array("true","身份证号码位数不对!","身份证号码出生日期超出范围或含有非法字符!","身份证号码校验错误!","身份证号码中地区编码不正确!");
  var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
  var idcard,Y,JYM;
  var S,M;
  var idcard_array = new Array();
  idcard_array = idcard.split("");
  if(idcard.length != 15 && idcard.length != 18) return Errors[1];
  //if(idcard.length != 18) return Errors[1];
  if (idcard.substr(0,6) == "000000" || idcard.substr(0,6) == "111111" || idcard.substr(0,6) == "222222" || idcard.substr(0,6) == "333333" || idcard.substr(0,6) == "444444" || idcard.substr(0,6) == "555555" || idcard.substr(0,6) == "666666" || idcard.substr(0,6) == "777777" || idcard.substr(0,6) == "888888" || idcard.substr(0,6) == "999999")  return Errors[4];
  if (idcard.substr(0,6) == "123456" || idcard.substr(0,6) == "234567" || idcard.substr(0,6) == "345678" || idcard.substr(0,6) == "456789" || idcard.substr(0,6) == "567890" || idcard.substr(0,6) == "012345" || idcard.substr(0,6) == "543210" || idcard.substr(0,6) == "432109" || idcard.substr(0,6) == "321098" || idcard.substr(0,6) == "210987" || idcard.substr(0,6) == "109876" || idcard.substr(0,6) == "098765" || idcard.substr(0,6) == "987654" || idcard.substr(0,6) == "876543" || idcard.substr(0,6) == "765432")  return Errors[4];
  if (idcard.substr(0,6) == "121212" || idcard.substr(0,6) == "131313" || idcard.substr(0,6) == "141414" || idcard.substr(0,6) == "151515" || idcard.substr(0,6) == "161616" || idcard.substr(0,6) == "171717" || idcard.substr(0,6) == "181818" || idcard.substr(0,6) == "191919" || idcard.substr(0,6) == "101010")  return Errors[4];
  if (idcard.substr(0,6) == "212121" || idcard.substr(0,6) == "232323" || idcard.substr(0,6) == "242424" || idcard.substr(0,6) == "252525" || idcard.substr(0,6) == "262626" || idcard.substr(0,6) == "272727" || idcard.substr(0,6) == "282828" || idcard.substr(0,6) == "292929" || idcard.substr(0,6) == "202020")  return Errors[4];
  if (idcard.substr(0,6) == "313131" || idcard.substr(0,6) == "323232" || idcard.substr(0,6) == "343434" || idcard.substr(0,6) == "353535" || idcard.substr(0,6) == "363636" || idcard.substr(0,6) == "373737" || idcard.substr(0,6) == "383838" || idcard.substr(0,6) == "393939" || idcard.substr(0,6) == "303030")  return Errors[4];
  if (idcard.substr(0,6) == "414141" || idcard.substr(0,6) == "424242" || idcard.substr(0,6) == "434343" || idcard.substr(0,6) == "454545" || idcard.substr(0,6) == "464646" || idcard.substr(0,6) == "474747" || idcard.substr(0,6) == "484848" || idcard.substr(0,6) == "494949" || idcard.substr(0,6) == "404040")  return Errors[4];
  if (idcard.substr(0,6) == "515151" || idcard.substr(0,6) == "525252" || idcard.substr(0,6) == "535353" || idcard.substr(0,6) == "545454" || idcard.substr(0,6) == "565656" || idcard.substr(0,6) == "575757" || idcard.substr(0,6) == "585858" || idcard.substr(0,6) == "595959" || idcard.substr(0,6) == "505050")  return Errors[4];
  if (idcard.substr(0,6) == "616161" || idcard.substr(0,6) == "626262" || idcard.substr(0,6) == "636363" || idcard.substr(0,6) == "646464" || idcard.substr(0,6) == "656565" || idcard.substr(0,6) == "676767" || idcard.substr(0,6) == "686868" || idcard.substr(0,6) == "696969" || idcard.substr(0,6) == "606060")  return Errors[4];
  if (idcard.substr(0,6) == "717171" || idcard.substr(0,6) == "727272" || idcard.substr(0,6) == "737373" || idcard.substr(0,6) == "747474" || idcard.substr(0,6) == "757575" || idcard.substr(0,6) == "767676" || idcard.substr(0,6) == "787878" || idcard.substr(0,6) == "797979" || idcard.substr(0,6) == "707070")  return Errors[4];
  if (idcard.substr(0,6) == "818181" || idcard.substr(0,6) == "828282" || idcard.substr(0,6) == "838383" || idcard.substr(0,6) == "848484" || idcard.substr(0,6) == "858585" || idcard.substr(0,6) == "868686" || idcard.substr(0,6) == "878787" || idcard.substr(0,6) == "898989" || idcard.substr(0,6) == "808080")  return Errors[4];
  if (idcard.substr(0,6) == "919191" || idcard.substr(0,6) == "929292" || idcard.substr(0,6) == "939393" || idcard.substr(0,6) == "949494" || idcard.substr(0,6) == "959595" || idcard.substr(0,6) == "969696" || idcard.substr(0,6) == "979797" || idcard.substr(0,6) == "989898" || idcard.substr(0,6) == "909090")  return Errors[4];

  if(area[parseInt(idcard.substr(0,2))]==null) return Errors[4];
  switch(idcard.length){
    case 15:
    if ((parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){
      ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
    }
    else{
      ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
    }
    if(ereg.test(idcard))
      return Errors[0];
    else
      return Errors[2];
    break;
    case 18:
      if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){
        ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
      }
      else{
        ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
      }
      if(ereg.test(idcard)){
        S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7 + (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9 + (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10 + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5 + (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8 + (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4 + (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2 + parseInt(idcard_array[7]) * 1 + parseInt(idcard_array[8]) * 6 + parseInt(idcard_array[9]) * 3 ;
        Y = S % 11;
        M = "F";
        JYM = "10X98765432";
        M = JYM.substr(Y,1);
        if(M == idcard_array[17])
          return Errors[0];
        else
          return Errors[3];
      }
      else
        return Errors[2];
      break;
  default:
    return Errors[1];
    break;
  }
}




test.html  例子代码



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>身份证号码js验证</title>
<script type="text/javascript" src="check_certnumber.js"></script>
<script type="text/javascript">
////身份证号码验证
  function v_cert_number(theForm){    
      var check_result = checkIdcard(theForm.cardid.value);
      if (check_result != "true"){
        document.getElementById("cert_number_div").style.color="#ff0000";
        document.getElementById("cert_number_div").innerHTML ="<image src='images/Img227876837.gif'>&nbsp;"+check_result;
        return false;  
      }    
      document.getElementById("cert_number_div").innerHTML ="<image src='images/Img227876838.gif'>身份证号码正确,需要人工验证身份号和姓名是否相符!";
  }  

////
</script>
<script>
    function validateform()
    {    
      var check_result = checkIdcard(reg.cardid.value);
      if (check_result != "true"){
          window.alert (check_result)
          reg.cardid.focus()
          return false;
         }
     }
</script>
</head>

<body>
<form action="real.php?type=upinfo" method="post"  name="reg" onSubmit="return validateform();">
<INPUT onblur=javascript:v_cert_number(document.reg) name=cardid>
<DIV class=f1 id=cert_number_div align=left>请如实填写身份证号,作为实名认证的主要依据,如果末位字符是X,则必须输入大写X</DIV>
</form>
</body>
</html>




PHP提供两个方便我们引用数据的魔法引用函数magic_quotes_gpc和magic_quotes_runtime,这两个函数如果在php.ini设置为ON的时候,就会为我们引用的数据碰到单引号'和双引号"以及反斜线 \ 是自动加上反斜线,帮我们自动转译符号,确保数据操作的正确运行,可是我们在php不同的版本或者不同的服务器配置下,有的magic_quotes_gpc和magic_quotes_runtime设置为on,有的又是off,所以我们写的程序必须符合on和off两种情况。那么magic_quotes_gpc和magic_quotes_runtime两个函数有什么区别呢?看下面的说明:

magic_quotes_gpc
作用范围是:WEB客户服务端;
作用时间:请求开始是,例如当脚本运行时.


magic_quotes_runtime
作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;
作用时间:每次当脚本访问运行状态中产生的数据.
所以

magic_quotes_gpc的设定值将会影响通过Get/Post/Cookies获得的数据
magic_quotes_runtime的设定值将会影响从文件中读取的数据或从数据库查询得到的数据
生成word的代码

  header("Content-type:   application/octet-stream");  
  header("Accept-Ranges:   bytes");  
  header('Content-type: application/doc');
  header('Content-Disposition: attachment; filename="测试.doc"');

生成excel的代码

Header("Content-type:   application/octet-stream");  
  Header("Accept-Ranges:   bytes");  
  Header("Content-type:application/vnd.ms-excel");    
  Header("Content-Disposition:attachment;filename="测试.xls"');


但是导的过程中也会遇到很多问题,比如说导出excel,某列导出的是身份证号的话,打开excel文件以后会发现,身份证号自动采用科学计数法,无论如何修改该列属性,都无法实现自己的要求。网上有人说,先把该列属性改为文本以后,再输入就没有问题,实际操作excel确实如此,但是,php程序导出就无法做到了。也有人说,在身份证号前加单引号,试过也不行,最后在导出的身份证号数据前加空格问题解决,空格是html代码的空格.问题解决。

&nbsp;

仿discuz的日历自动填写的js 不指定

jed , 2009-3-2 13:36 , 代码编程 , 评论(0) , 阅读(2847) , Via 本站原创
作者:smarteng



<input name="member.birth" type="text" value="1982-1-1" size="14" readonly onClick="showcalendar(event, this);" onFocus="showcalendar(event, this);if(this.value=='0000-00-00')this.value=''" />



1.readonly : 是让控件只读,不可以直接输入

2. onClick="showcalendar(event, this);" : 单击显示日历控件

3.onFocus="showcalendar(event, this);if(this.value=='0000-00-00')this.value=''" : 显示日历,并根据条件初始化日历控件的值

下载文件 (已下载 442 次)

如何做license.php验证文件 不指定

jed , 2009-2-4 14:02 , 代码编程 , 评论(0) , 阅读(2556) , Via 本站原创
以下是破解的国内某著名php下载系统做的license.php验证文件。源码如下:
license.php

<?php
//----------------------------
// 以下是域名: www.dzhope.com的授权码
$License = "299CCBQC19B7RBD16BA9D2A4K12579A659DMT27C8EZ7D915SC9552B297967D4D059087EC25A3D7DD154808B1C676D3D63F3A63E9EDABF57A8C54F96C82ECF47798344ED570DBEE2845D726738D75163FCD39EFE1AE18F317CA195E3FA18A7==ACE64==WDA3833324EA9C85C440ED1904ECEF0BA4EF420FFA86D5C0C77E4F72BAEC1B0D5A6810921F";
?>



chklicense.php
验证license.php的文件代码如下:



<?php
/*********************/
/*                         */
/*  Version : 1.0     */
/*  Author  :jed     */
/*                       */
/*                      */
/*********************/

function switch_str( $str )
{
    $arr[0] = "5%R0Dqhlyhg";
    $arr[1] = "eLKR1(1A0Lq";
    $arr[2] = "uw)teDc9veP";
    $arr[3] = "uaNueju&pPa";
    $arr[4] = "sA:pWEYAs?q";
    $arr[5] = ":pWEY:pWEYd";
    $arr[6] = "0P7\$0lg#ws?";
    $arr[7] = ")teDc)teDac";
    $arr[8] = "PAkXyZe~n3P";
    $arr[9] = "PAkadXyZe~n";
    $arr['a'] = "jVtlsAXWqaa";
    $arr['b'] = "dfjVtlsAXWq";
    $arr['c'] = "jVtljVtljVt";
    $arr['d'] = "Q3vn9G3HHWl";
    $arr['e'] = "Qn9Gn)6HWlf";
    $arr['f'] = "Q3vrn9GHWlf";
    $arr['g'] = "n9G3H5nBy&f";
    $arr['h'] = "XyZe~n3@ila";
    $arr['i'] = "Q3XyZe~nWlf";
    $arr['j'] = "Q3vrn)6HWlf";
    $arr['k'] = "MBtn9G3H5nB";
    $arr['l'] = "8Ce7unaHWlf";
    $arr['m'] = "aO)WNJ3J3la";
    $arr['n'] = "aO)WNJ3ssce";
    $arr['o'] = "f?:0I2NiDC)";
    $arr['p'] = "Q3vrn)6HWlf";
    $arr['q'] = "f&HPW5bm9ya";
    $arr['r'] = "8CeanE2NWlf";
    $arr['s'] = "*TKS(9klasf";
    $arr['t'] = "O)WNJ3kcOee";
    $arr['u'] = "sAXWqO(M7qc";
    $arr['v'] = "qO(M7qccCYQ";
    $arr['w'] = "vrn)6HWHWlf";
    $arr['x'] = "dfadaadeevf";
    $arr['y'] = "G3H5nBy&8aV";
    $arr['z'] = "eedaunE2Nqa";
    if ( isset( $arr[$str] ) )
    {
        return $str;
    }
    return base64_encode( $str );
}

function numtostr( $num )
{
    $arr[0] = "EQRAK";
    $arr[1] = "QRAKA";
    $arr[2] = "TZSB7";
    $arr[3] = "WEYAS";
    $arr[4] = "J3KCO";
    $arr[5] = "LSAXW";
    $arr[6] = "MBTN9";
    $arr[7] = "H5NBY";
    return $arr[$num];
}

function strtonum( $str )
{
    $arr['EQRAK'] = 0;
    $arr['QRAKA'] = 1;
    $arr['TZSB7'] = 2;
    $arr['WEYAS'] = 3;
    $arr['J3KCO'] = 4;
    $arr['LSAXW'] = 5;
    $arr['MBTN9'] = 6;
    $arr['H5NBY'] = 7;
    if ( isset( $arr[$str] ) )
    {
        return $arr[$str];
    }
    return false;
}

function strfun( $i )
{
    $fun[0] = "md5";
    $fun[1] = "sha1";
    $fun[2] = "base64_encode";
    $fun[3] = "ord";
    $fun[4] = "switch_str";
    $fun[5] = "base64_encode";
    $fun[6] = "sha1";
    $fun[7] = "sha1";
    $fun[8] = "md5";
    $fun[9] = "switch_str";
    $fun[10] = "sha1";
    $fun[11] = "switch_str";
    $fun[12] = "md5";
    $fun[13] = "ord";
    $fun[14] = "switch_str";
    $fun[15] = "base64_encode";
    $fun[16] = "sha1";
    if ( isset( $fun[$i] ) )
    {
        return $fun[$i];
    }
    return "base64_encode";
}

function getlicence( )
{
    global $License;
    $domain = $udomain = strtolower( $_SERVER['SERVER_NAME'] );
    if ( substr( $domain, 0, 7 ) == "http://" )
    {
        $domain = substr( $domain, 7 );
    }
    $domainarr = explode( ".", $domain );
    if ( count( $domainarr ) == 2 )
    {
        $domain = "www.".$domain;
    }
    else
    {
        $allow = array( "download", "down", "software", "soft", "test", "v3" );
        if ( in_array( $domainarr[0], $allow ) )
        {
            $domainarr[0] = "www";
        }
        $domain = implode( ".", $domainarr );
    }
    $domainarr = explode( ".", $domain );
    $domain = "";
    foreach ( $domainarr as $key => $val )
    {
        $domain .= $domain == "" ? strrev( $val ) : ".".strrev( $val );
    }
    $content = "";
    $i = 0;
    for ( ; $i < strlen( $domain ); ++$i )
    {
        $function = strfun( $i );
        $content .= $function( $domain[$i] );
    }
    $content = strrev( strtoupper( $content ) );
    if ( !file_exists( "../core/license.php" ) )
    {
        common::_error( "授权文件license.php 不存在!" );
    }
    require_once( "../core/license.php" );
    $j = $numarr = "";
    $jarr[] = 0;
    $i = 0;
    for ( ; $i < $License[0]; ++$i )
    {
        if ( $j == "" )
        {
            $j = ( $i + 1 ) * 5;
            $j += 1;
        }
        else
        {
            $j += 25;
        }
        $numarr[$i] = $License[$j].$License[$j + 5].$License[$j + 10].$License[$j + 15].$License[$j + 20];
        $jarr[] = $j;
        $jarr[] = $j + 5;
        $jarr[] = $j + 10;
        $jarr[] = $j + 15;
        $jarr[] = $j + 20;
    }
    $num = "";
    if ( is_array( $numarr ) )
    {
        foreach ( $numarr as $key => $val )
        {
            $num .= strtonum( $val );
        }
    }
    $MyLicense = substr( $License, 1 );
    $GLOBALS['licensedomain'] = $udomain;
    $GLOBALS['licensenum'] = $num = octdec( $num );
    $numstr =decoct( $num );
    $newnumstr = "";
    $i = 0;
    for ( ; $i < strlen( $numstr ); ++$i )
    {
        $newnumstr .= numtostr( $numstr[$i] );
    }
    $i = 0;
    for ( ; $i < strlen( $newnumstr ); ++$i )
    {
        $j = ( $i + 1 ) * 5;
        $content[$j] = $newnumstr[$i];
    }
    if ( $content == $MyLicense )
    {
        return $num;
    }
    common::_error( "授权文件license.php 中的授权码有误!" );
}

?>


Tags:
很多人都以为htmlentities跟htmlspecialchars的功能是一样的,都是格式化html代码的,我以前也曾这么认为,但是今天我发现并不是这样的。

这两个函数在格式化带有英文字符的html代码的时候基本没啥问题,但是htmlentities对中文字符也不放过,这样得出来的结果是中文字符部分变为一堆乱码。当时做英文站的时候根本就没觉察到这个问题,而今天公司的一个收藏站却因为有有非英文字符而出现了问题,我最终查出来是htmlentities这个函数的问题,同时我也找到了htmlspecialchars这个函数。

对于这两个函数,php手册上都是英文做的解释,其中在htmlentities函数的说明部分有这么一段英文:

This function is identical to htmlspecialchars() in all ways, except with htmlentities(), all characters which have HTML character entity equivalents are translated into these entities.

从这句话中我们也可以看出来这两个函数虽然基本功能差不多,但是还是有细微的差别在里面的。再仔细看htmlspecialchars函数里面的一段话:
分页: 9/26 第一页 上页 4 5 6 7 8 9 10 11 12 13 下页 最后页 [ 显示模式: 摘要 | 列表 ]