Stay hungry, Stay foolish

0%

单元素

1
2
$arr[] = 'item';   //直接追加(推荐):
array_push($arr, 'item'); //函数实现

array_push同样可以对多元素进行操作,如array_push($arr, ‘item1’, ‘item2’,’item3’……

阅读全文 »

环境

ThinkPHP 2.0

相关配置:

在tp的全局配置文件convention.php中:

1
2
3
4
'DEFAULT_LANG' => 'zh-cn',
'LANG_SWITCH_ON'=> false, // 默认关闭多语言包功能
'LANG_AUTO_DETECT' => true, // 自动侦测语言 开启多语言功能后有效
'VAR_LANGUAGE' => 'l', // 默认语言切换变量

App::checkLanguage()

1
$langSet = C('DEFAULT_LANG');

首先,通过”快捷”函数C获取这个默认设置

1
2
3
4
5
// 不开启语言包功能,仅仅加载框架语言文件直接返回
if (!C('LANG_SWITCH_ON')){
L(include THINK_PATH.'/Lang/'.$langSet.'.php');
return;
}

LANG_SWITCH_ON在关闭状态下,只会加载框架下面的语言文件。然后一个return结束这个方法的运行。如果想开启项目的多语言支持的话,务必在项目的配置文件中把这项重写为true。

阅读全文 »

前几天thinkphp被爆出执行任意代码漏洞。正好我平时常用的也是thinkphp,乘此时机研究一下。

引起漏洞的代码(Dispatcher.class.php):

1
$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'/]+)@e', '$var['1']="2";', implode($depr,$paths));

这个是tp用来把url后的参数赋值的操作。类似于domain.com/index.php/Index/index/a/111/b/222这样的URL,它的使命就是使$var[‘a’] = 111;$var[‘b’] = 222;然后合并到$_GET和$_REQUEST中。

阅读全文 »

php5.2.*

连接mssql 2005以下的版本在php.ini里把extension=php_mssql.dll前的分号去掉重启web服务器就行了。

如果mssql版本在2005及以上的话,在完成上述的基础上还要下载新版的ntwdblib.dll( 2000.80.194.0)放到apache的bin目录下。(我安装的apache2.2.8,bin下有个默认的ntwdblib.dll,版本是2000.2.8.0,直接覆盖之)。

php5.3.*

php从5.3开始默认不支持sql server。庆幸的是微软反过来对php支持。所要要想连接sql server的话就要费一番周张:

解压后有针对各个版本的扩展,还有文档。(也可单独下载)

阅读全文 »

当用git push origin master把本地的修改推到服务器上时,出现了下面的错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Counting objects: 8, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 515 bytes, done.
Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To /data/test/
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to '/data/test/'
阅读全文 »

为了解决ie6对first-child的兼容性搜索到了expression:

IE5及其以后版本支持在CSS中使用expression,用来把CSS属性和Javascript表达式关联起来

能在css里写javascript,听起来挺酷的,立即尝试了一下:

.theme-small {padding-top:expression(this.previousSibling==null?’0’:’20px’);}

在IE6下一试:还真行!但是在Firefox和IE8下却没有效果了。怎么回事呢?

原来expression在非常消耗CPU,即使在IE5-7中也不建议使用,而IE8+及Firefox等直接就把它给封杀了。

阅读全文 »

对于字符串的截取,php里提供了不少的函数,普通的有substr,多字节的有mb_substr。我们常接触到的就是utf8字符的截取,一般的用mb_substr就可以搞定的。但是如果有特殊的需求,需要自己来写一个呢?

这里多少就要了解些utf8的原理了。

utf8是unix之父Ken Thompson提出的,具有以下性质:

  • 编码为U+0000U+007F的字符只占一个字节,就是0×000x7F,和ASCII码兼容

  • 编码大于U+007F的字符用2~6个字节表示,每个字节的最高位都是1,而ASCII码的最高位都是0,因此非ASCII码字符的表示中不会出现ASCII码字节(也就不会出现0字节)

  • 用于表示非ASCII码字符的多字节序列中,第一个字节的取值范围是0xC00xFD,根据它可以判断后面有多少个字节也属于当前字符的编码。后面每个字节的取值范围都是0×800xBF,见下面的详细说明

  • UCS定义的所有231个字符都可以用UTF-8编码表示出来

  • UTF-8编码最长6个字节,BMP字符的UTF-8编码最长三个字节

  • 0xFE和0xFF这两个字节在UTF-8编码中不会出现

阅读全文 »

前一阵子和同事讨论mysql里的字段所能存储的最大最小值的时候,发现一个很奇怪的逻辑:

在phpmyadmin里设置字段的时候,int默认长度是11位,他就认为所能存储的最大值是99999999999(11个9)。

这是典型的计算机基础没有打好。(本文是扫盲篇,如果上述的问题您知道答案,就没有必要看下去了。)

阅读全文 »

程序如下:

1
2
3
4
5
6
$ctx = stream_context_create();
$pem = dirname(__FILE__) . '' . 'ck20120130.pem';
stream_context_set_option($ctx, 'ssl', 'local_cert', $pem);
stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);
$fp = stream_socket_client($serverUrl, $err, $errstr, 60,
STREAM_CLIENT_CONNECT, $ctx);

运行报如下错误:

1
2
3
Warning: stream_socket_client() [function.stream-socket-client]: SSL 运维 failed with code 1. OpenSSL Error messages: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
Warning: stream_socket_client() [function.stream-socket-client]: Failed to enable crypto
Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to ssl

最后检查了一下,发现是$pem地址的问题,改成dirname(_FILE_) . ‘/‘ . ‘ck20120130.pem’就没有问题了。

ROWNUM是记录行数。有时候我们需要在查询某条记录并得到这条记录在其查询结果中是第几条。这样说可以会让看官迷糊,以我接触到的业务来说一下吧:

我需要建一个排行榜,这是没有问题的,只要根据某一条条件进行排序,一个排行榜就出来了。但是这个排行榜还需要一个搜索功能,搜索出某一用户并显示他的排行。

分析一下这个问题:排行榜是实时变化着的,我不可以以某一字段来进行存储,而且数据库基于主-从结构,据说用临时表也不太现实。我就把希望寄托在了ROWNUM上了。Oracle,SQL Server里都有这个,遗憾的是Mysql里没有。但是我们有办法来实现的,不是吗?

1
2
3
set @rownum = 0;

select (@rownum := @rownum + 1) as rownum, name, scores from user order by scores;
阅读全文 »