让JavaScript和PHP通用值为中文的cookie

引用地址:http://vseb.blog.sohu.com/67136922.html

这是一个哪里都能找到的操作cookie的JavaScript函数:


很遗憾,如果让PHP设定cookie的值为中文,然后让这个JavaScript读取,就会出现乱码:



反之,如果让JavaScript设定了一个中文cookie值,由PHP进行读取,也会出现乱码:



观察上面的乱码,你会发现% u4E2D% u6587刚好是“中文”两个汉字的unicode编码,第一个想法是直接解码,但是PHP里面似乎没有可以把unicode编码转换为汉字的便捷方法。(WordPress倒是不错,不加空格倒是给解码出来了!)

在《JavaScript: The Definitive Guide, 4th Edition》中写到:

In client-side JavaScript, a common use of escape( ) is to encode cookie values, which have restrictions on the punctuation characters they may contain.
在客户端脚本程序中,escape( )函数可以被用作对具有不规范标点的cookie进行编码。(就像我们函数中所用到的一样)

Although the escape( ) function was standardized in the first version of ECMAScript, it has been deprecated and removed from the standard by ECMAScript v3. Implementations of ECMAScript are likely to implement this function, but they are not required to. In JavaScript 1.5 and JScript 5.5 and later, you should use encodeURI( ) and encodeURIComponent( ) instead of escape( ).
虽然escape( ) 已经在ECMAScript中被标准化,但是在ECMAScript v3中,escape( ) 被剔出,如果需要在JavaScript 1.5 和JScript 5.5以后的版本中使用这个函数,建议使用encodeURI( )和encodeURIComponent( )。

按照手册的建议,我修改了JavaScript函数中的escape()和unescape()为encodeURI()和decodeURI(),结果异常的顺利,下面给出修改后的代码和调试程序:







php导出excel文档

while($data_array=mysql_fetch_array($result)){
	$data[$i]=$data_array;
	$i++;
}

$title=array("game_name","des","url","add_time");
$keys=array("game_name","des","url","add_time");

exportToExcel($data,'aa.xls',$title,$keys);

function exportToExcel($data,$filename,$title,$keys){		//$keys為data中要導出的數據列
	header('Content-type: text/cvs');
	header("Content-Disposition: attachment; filename=\"$filename\"");
	$top = '數據導出時間:'.date('Y-m-d H:i:s');
	$table	= '';
	$table .= '';
	foreach($title as $value){
		$table .= '';						//列標題
	}
	$table .= '';
	$i =1;
	foreach($data as $value){
		$table .= '';						//序號
		foreach($keys as $key){									//數據內容
			$table .= '';
		}
		$table .= '';
		$i++;
	}
	$table .= '
'.$value.'
'.$i.''.$value[$key].'
'; $top = iconv('utf-8','gbk',$top); $table = iconv('utf-8','gbk',$table); echo $top; echo $table; exit; }

PHP:把字符串中的任意连续字符换成一个对应字符

引用地址:http://www.onlycto.com/tech/2599/46.html


  //1,把字符串中的任意空格换成一个
  $str1 = 'A    B         C   ';
  echo '';
  echo '1:';
  echo preg_replace ("/\s+/", ' ', $str1);
  echo '';
  //2,把字符串中的任意连续字符 M 换成一个 M
  echo '2: ';
  $str1 = 'AMMMBMMMMCMM   ';
  echo preg_replace ("/M+/", 'M', $str1) .'
'; //3,把字符串中的任意连续字符换成一个对应字符 echo '3:
'; $str1 = 'ACCCB CCCCCGGG OOO YYYFFFXXXZZZZZ'; echo $str1 .'
'; $str2 = ''; $i = 0; for ($i=0; $i'; //4,把字符串中的任意连续字符换成一个对应字符 echo '4:
'; $str1 = 'ACCCB CCCCCGGG OOO YYYFFFXXXZZZZZ'; echo $str1 .'
'; $len = strlen($str1); $str2 = $str1[0]; $ch = $str2; for($i=1; $i<$len; $i++){ $ch2=$str1[$i]; if($ch!=$ch2){ $str2.=$ch2; $ch=$ch2; } } echo $str2 . "
"; //5,把字符串中的任意连续字符换成一个对应字符 echo '5:
'; $str1 = 'ACCCB CCCCCGGG OOO YYYFFFXXXZZZZZ'; echo preg_replace("/(.)\\1+/", "[url=file://\\1]\\1[/url]", $str1) .'
';

Discuz7.2升级到DiscuzX1.5

官方的帮助文档在这里:http://faq.comsenz.com/viewnews-942

说是升级,其实就是先安装DiscuzX1.5,然后把Discuz7.2中的数据导入。官方的文档写的很详细,照着一步一步做就可以。唯一有些模糊的就是关于ucenter的安装问题。

在安装DiscuzX1.5时,会有“全新安装 Discuz! X (含 UCenter Server)”和“仅安装 Discuz! X (手工指定已经安装的 UCenter Server) ”的选项,经测试发现如果选择“全新安装 Discuz! X”,在后面运行convert程序时原来数据库里以pre_uc_为前缀的数据表里的数据并未被导入到DiscuzX1.5的数据库中;如果选择手动指定ucenter,则有可能出现安装不成功的问题。

折中的解决方法就是选择“全新安装Discuz! X (含 UCenter Server)”,然后

1.从旧数据库里导出pre_uc_前缀表的sql(包括结构和数据)

2.在新数据库里删除pre_ucenter_前缀的表

3.将导出的sql语句中”pre_uc_”替换为”pre_ucenter_”,然后导入新数据库中

convert程序在导入前后执行都可以。

Discuz 用户信息加密算法-authcode加密/解密函数详解

引用地址:http://bbs.itokit.com/thread-4009-1-1.html

/**
*用户信息加密解密函数
*
*待加密内容用\t分割
*@return String 加密或解密字符串
*@param String $string 待加密或解密字符串
*@param String $operation 操作类型定义 DECODE=解密 ENDODE=加密
*@param String $key 加密算子
*/
function authcode($string, $operation, $key = '') {
/**
*获取密码算子,如未指定,采取系统默认算子
*默认算子是论坛授权码和用户浏览器信息的md5散列值
*$GLOBALS['discuz_auth_key']----全局变量
*取值为:md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT'])
*$_DCACHE['settings']['authkey']是论坛安装时生成的15位随机字符串
*/
    $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
    $key_length = strlen($key);
/**
*如果解密,先对密文解码
*如果加密,将密码算子和待加密字符串进行md5运算后取前8位
*并将这8位字符串和待加密字符串连接成新的待加密字符串
*/
    $string = $operation == 'DECODE' ? base64_decode($string) : substr(md5($string.$key), 0, 8).$string;
    $string_length = strlen($string);
    $rndkey = $box = array();
    $result = '';

/**
*初始化加密变量,$rndkey和$box
*/
    for($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($key[$i % $key_length]);
        $box[$i] = $i;
    }

/**
*$box数组打散供加密用
*/
    for($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }

/**
*$box继续打散,并用异或运算实现加密或解密
*/
    for($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }
    if($operation == 'DECODE') {
        if(substr($result, 0, 8) == substr(md5(substr($result, 8).$key), 0, 8)) {
            return substr($result, 8);
        } else {
            return '';
        }
    } else {
        return str_replace('=', '', base64_encode($result));
    }

}

解密cookie代码示例:

//此处要包含上面的函数代码

$auth_key=$_DCACHE['settings']['authkey'];   //此值也可以从cdb_settings表中查到,即authkey对应的值
$key=md5($auth_key.$_SERVER['HTTP_USER_AGENT']);
$result=authcode($_COOKIE['Fbw_auth'], 'DECODE', $key);//$_COOKIE['Fbw_auth']是当前用户登录后的cookie值

echo $_COOKIE['Fbw_auth'];
echo "
"; echo $result;

输出的结果格式是“e10adc3949ba59abbe56e057f20f883e 2”,分别是用户加密后的密码和ID。

勳章中心6.0[UTF-8]勳章自動回收解決辦法

引用地址:http://coz.tw/dz6/thread-11154-1-1.html

一開始小弟從安裝勳章中心6.0[UTF-8]插件到使用上都很順利
不過一到隔天就發現勳章自動回收
購買當時所使用的金錢也隨之消失
至後台查看勳章紀錄
會顯示某會員使用勳章中心來回收
不過各位大大不須煩惱
安全性並沒出問題
純粹是插件本身的BUG….

因為勳章中心插件本身可省去管理者人工頒發的困擾
對會員的自由性也提高非常多
所以應該會造成許多使用此插件的站長們很頭大
小弟花了3天測試更改此BUG的效果
終於給小弟成功解決
在此雙手奉上與各位大大們分享
解決方法↓

在plugins\medalcenter\medalcenter.func.php文件:
搜索:

if(!function_exists('array_combine')) {         function array_combine($keys, $values) {                 $result = array();                 if(is_array($keys) && is_array($values)) {                                                if(count($keys) >= count($values)) {                                 foreach($values as $value) {                                         $key = $key ? next($keys) : current($keys);                                         $result[] = array_combine($key, $value);                                 }                                                        } else {                                 foreach($keys as $key) {                                         $value = $value ? next($values) : current($values);                                         $result[] = array_combine($key, $value);                                 }                         }                                        } elseif(!is_array($keys) && !is_array($values)) {                         $keys = is_string($keys) ? '\''.addcslashes($keys, '\'\\').'\'' : $keys;                         $values = (!preg_match("/^\-?[1-9]\d*$/", $values) || strlen($values) > 12) ? '\''.addcslashes($values, '\'\\').'\'' : $values;                         $result = array($keys => $values);                 } elseif(is_array($keys) && !is_array($values)) {                                                 foreach($keys as $key) {                                 $result[] = array_combine($key, $values);                         }                                        } elseif(!is_array($keys) && is_array($values)) {                                                                         foreach($values as $value) {                                 $result[] = array_combine($keys, $value);                         }                                        }                 return $result;         } }

替换成:

if(!function_exists('array_combine')) {
function array_combine($arr_key,$arr_val){
if( !is_array($arr_key) or !is_array($arr_val)){
    echo '<b>Warning</b>:    array_combine() expects all parameters to be array';
    return false;
}
if(count($arr_key) != count($arr_val)){
    echo '<b>Warning</b>:    array_combine() Both parameters should have an equal number of elements';
    return false;
}
$count = count($arr_key);
for($i=0;$i<$count;$i++){
    $key = $arr_key[$i];
    $val = $arr_val[$i];
    $arr_new[$key] = $val;
}
return $arr_new;
}
}

本來小弟以為改成上面方式就能解決
不過小弟等了一天
勳章中心還是很熱情的把勳章給回收了…
如果以上方法不能解決請繼續改下面的↓
上面改過的不需要再改回來
到medalcenter.func.php 找

if(is_array($uids)) { //array
                $where = 'WHERE m.uid in(\'' . implode('\', \'', $uids). '\')';
        } else {
                $where = 'WHERE m.uid = \'' . $uids .'\'';
                $medalids = array($medalids);
                $outtimes = array($outtimes);
        }

改成:

if(is_array($uids)) { //array
                $where = 'WHERE m.uid in(\'' . implode('\', \'', $uids). '\')';
        } else {
                $where = 'WHERE m.uid = \'' . $uids .'\'';
        }
        $medalids = array($medalids);
        $outtimes = array($outtimes);

把以上2個地方做一次改好
小弟測試成功沒問題
希望能對許多大大有所幫助:71:

XAMPP中Apache无法启动

引用地址:http://www.cnblogs.com/maliyahooo/archive/2010/02/04/1663515.html

    今天早上来公司,开电脑,我的电脑上安装的是XAMPP集成建站开发包,打开XAMPP控制面板,点击Apache的start按钮,却发现始终不出现那个绿底黑字的Running.怎么好端端的Apache突然启动不起来,昨天关机睡觉之前都好好的,过了一晚上就这样了,难道他和我一样最近比较劳累,到现在还没睡醒,赖床罢工了啊?当然了,这只是个玩笑话,出现了问题就要及时解决撒。

     开始分析问题解决问题。

     打开Aapche的日志文件error.log。发现有如下的错误日志记录

(OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 : make_sock: could not bind to address 0.0.0.0:443 no listening sockets available, shutting down Unable to open logs

大意是说443的端口被占用了,赶快google一下。找到了也出现过此类问题的人,借鉴了他的解决方法。
通过cmd命令行直接查看有无程序占用0.0.0.0:443:

1、运行cmd,然后输入netstat -ano,回车; 2、查看开头几行包含0.0.0.0:443的那一行最后的pid,为几个数字,把这几个数字记下来; 3、启动“任务管理器”——“进程”,在“工具栏”——“选择列”前面的框里打上勾; 4、然后找到与刚才那个pid对应的是哪个程序,很容易就会找到,就是它与0.0.0.0:443进行了绑定(bind);

原来进程VisualSVNServer.exe进程占用了0.0.0.0.0:443,我安装在xp下的SVN服务器。结束这个进程,再点击Apache的Start按钮,终于出现了那个绿底黑字的Running ,嘿嘿。

最后在这次解决问题的过程中使用了一个Windows的dos命令:netstat

在网上摘抄了这个命令的用法,记录下来,当作参考

netstat的全部参数及说明如下:
显示协议统计信息和当前 TCP/IP 网络连接。
NETSTAT [-a] [-b] [-e] [-n] [-o] [-p proto] [-r] [-s] [-v] [interval]
  -a                    显示所有连接和监听端口。
  -b                    显示包含于创建每个连接或监听端口的可执行组件。在某些情况下已知可执行组件
                         拥有多个独立组件,并且在这些情况下包含于创建连接或监听端口的组件序列
                         被显示。这种情况下,可执行组件名在底部的 [] 中,顶部是其调用的组件,等等,
                         直到 TCP/IP 部分。注意此选项可能需要很长时间,如果没有足够权限,可能失败。
  -e                    显示以太网统计信息。此选项可以与 -s选项组合使用。
  -n                    以数字形式显示地址和端口号。
  -o                   显示与每个连接相关的所属进程 ID。
  -p proto          显示 proto 指定的协议的连接;proto 可以是
                        下列协议之一: TCP、UDP、TCPv6 或 UDPv6。
                        如果与 -s 选项一起使用以显示按协议统计信息,proto 可以是下列协议 之一:
                        IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。
  -r                   显示路由表。
  -s                   显示按协议统计信息。默认地,显示 IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP
                        和 UDPv6 的统计信息; -p 选项用于指定默认情况的子集。
  -v                   与 -b 选项一起使用时将显示包含于为所有可执行组件创建连接或监听端口的组件。
  interval            重新显示选定统计信息,每次显示之间暂停时间间隔(以秒计)。按 CTRL+C 停止重新
                        显示统计信息。如果省略,netstat 显示当前配置信息(只显示一次)