PHP

Yii之CHtml表单

yii可是使用CHtml helper类创建表单,通过CHtml创建的表单有一点好处是可以配合内置的model类实现表单提交前的验证,而不需写额外的代码,并且还能实现js验证.不需要写额外的代码.
创建form标签:
原生方式:
1 <form name=”myform” action=”yii/index.php/test/edit” method=”post”>
2 //some code
3 </form>
yii方式:
1 <?php echo CHtml::beginForm(‘edit’,‘post’,array(‘name’=>‘myform’)) ?>
2 //some code
3 <?php echo Chtml::endForm(); ?>

创建input type=”text”:
原生方式:
1 <input type=”text” id=”original” value=”” name=”user”/>
yii方式:
1 <?php echo CHtml::textField(‘user’); ?>

创建提交按钮 input type=”submit”:
原生方式:
1 <input type=”submit” name=”sub” value=”登录”/>
yii方式:
1 <?php echo CHtml::submitButton(’submit’,array(‘name’=>’sub’,‘value’=>‘登录’)); ?>
更多表单元素创建方法参见CHtml类即可,方法类似…
http://www.yiiframework.com/doc/api/1.1/CHtml


淘宝搜索URI的加密或解密

自动化生成类似http%3A%2F%2Fs8.taobao.com%2Fbrowse%2F0%2Fn-g%2C2xtmrs6n33g54—————-40–commend-0-1%2C2-0.htm的淘宝搜索URI
实现思路:
1、PHP实现上首先urlencode字符串,得到形如by%CB%C0%C3%A8这样的字符串,然后据查urlencode是16-bit的,则匹配%ww和单个字母,然后%ww形式的16进制转2进制,单字母直接格式化为8位二进制。
2、第一步得到的字符串5位一段,前面补三个0,后面不足补0,并转为10进制数字,从码表找出对应字母,串联起来即可。
3、解码则先提取所有字母查码表得到10进制数字,转二进制然后去掉前三个0,字符串串起来,分割为8位,丢弃多余的0,转10进制,得到数字大于128,则转前缀为%的16进制,否则直接转ascii码,得到的字符串urldecode即可。
参考:
1、码表,思路主要参考:http://www.javaeye.com/topic/286240
2、urlencode是16进制的主要参考http://www.faqs.org/rfcs/rfc3986.html
代码如下:
<?php
function encode($str){
$return = $temp = $tmp = $more = ”;
$mid = $strs = array();
$code = ‘abcdefghijklmnopqrstuvwxyz234567′;
$len = $try = 0;
preg_match_all(“/%[\w\d]{2}|.*?/i”,rawurlencode($str),$strs);
foreach($strs[0] as $tmp){
        if($tmp!=”){
   if(strlen($tmp)==3){
           if(hexdec($tmp)<129) $temp.=sprintf(‘%08b’,ord(rawurldecode($tmp)));
           else $temp.=decbin(hexdec($tmp));

  }
   else $temp.=sprintf(‘%08b’,ord($tmp));
  }
}
$len = strlen($temp);
if($len%5>0) $more = sprintf(‘%0′.(5-$len%5).’s’,”);
$try = intval($len/5);
if($more==”) $try–;
for($i=0;$i<=$try;$i++){
  if($i<$try) $tmp=bindec(‘000′.substr($temp,$i*5,5));
  else $tmp=bindec(‘000′.substr($temp,$i*5,5).$more);
  [...]


PHP标志位字段与位运算符的结合

先看个列表
PHP里的error_reporting的参数值列表(用的是十进制,因为没人手写二进制玩…)
value constant
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT
4096 E_RECOVERABLE_ERROR
发现value的值都是跳跃式的吧,而且全是2的n+1次方.
再看下面这个。把value的值转成二进制了。
value constant
0000 0001 E_ERROR
0000 0010 E_WARNING
0000 0100 E_PARSE
0000 1000 E_NOTICE
0001 0000 E_CORE_ERROR
0010 0000 E_CORE_WARNING
.
.
.
… …一次为每加一次方就是二进制加了一位(学过计算机的差不多都知道:)…)
注意:每个选项对应了一位(1为开启 0为关闭)
好了,下面我们看看这么设置参数的好处。
举三个参数为例来看是什么效果吧
error_reporting(3);//decbin(3) == 0000 0011; (相当于设置 E_WARNING 和 E_ERROR )
error_reporting(4);//decbin(4) == 0000 0100;(相当于设置 E_PARSE )
error_reporting(5);//decbin(5) == 0000 0101;(相当于设置 E_PARSE 和 E_ERROR)
获取设置:
要看某项是否开启的判断可以用位运算来获得(& — “与”规则 全1为1,否则为0)
//E_PARSE
if($n & 4){
//E_PARSE开启
//4的二进制是 0100,因为只有第3位是1,所以进行”&”操作时其它何位置全被置0了
//因此只有$n的第三位也是1时结果才会大于0。
//如4(0100),5(0101),6(0110),7(0111)
}else{
//E_PARSE关闭
//第三位为0了就代表此选项是关闭状态
}
改变设置:($n代表当前的十进制值)
在应用时我们可能跟据需要针对某位进行开关设置。
看下面的用法。
//关闭E_PARSE项 用 ‘&’“与”规则
$n [...]