手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 免费部署 N8N 的 Zeabur 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

yii with的排序

Yii在自己的AR中实现了relations,于是我们可以利用relations实现一些left join或者其他join能做的事情,常见的大家都懂,什么 belongs_to,has_one,has_many,many_to_many之类的
但用的最多的,一般都是has_one,has_many,毕竟查关联数据这个最方便了。

于是我们就会Table::model()->with('a','b')->findAll($cdbcriteria);
这个时候,如果需要用到a或b的排序,就有点痛苦,直接在$cdbcriteria中写的话,往往会报字段不存在,因此可以尝试这样
1、直接在relations中,在写成a时,直接加入'order'=>'id DESC'之类的内容
2、在with()中写: with(array('a'=>array('order'=>'id DESC'),'b'))

这样是不是就很方便了呢?
当然上面的代码是通过:

PHP代码
  1. public function with()  
  2. {  
  3.     if(func_num_args()>0)  
  4.     {  
  5.         $with=func_get_args();  
  6.         if(is_array($with[0]))  // the parameter is given as an array  
  7.             $with=$with[0];  
  8.         if(!empty($with))  
  9.             $this->getDbCriteria()->mergeWith(array('with'=>$with));  
  10.     }  
  11.     return $this;  
  12. }  

看了这段代码就基本上了解用法了,手册里也说了:
Specifies which related objects should be eagerly loaded. This method takes variable number of parameters. Each parameter specifies the name of a relation or child-relation. For example,

// find all posts together with their author and comments
Post::model()->with('author','comments')->findAll();
// find all posts together with their author and the author's profile
Post::model()->with('author','author.profile')->findAll();
The relations should be declared in relations().

By default, the options specified in relations() will be used to do relational query. In order to customize the options on the fly, we should pass an array parameter to the with() method. The array keys are relation names, and the array values are the corresponding query options. For example,
Post::model()->with(array(
    'author'=>array('select'=>'id, name'),
    'comments'=>array('condition'=>'approved=1', 'order'=>'create_time'),
))->findAll();
所以,有时候看看手册还是很重要的。

Tags: yii, with, cdbcriteria

Typecho Slug 拼音插件

用法很方便,功能也很简单,如果你的typecho不是以slug的方式显示的,那就没有意义了
如果以slug的方式显示,一般是自己主动写成英文的话,那也没有意义,我这个只是好玩罢了。

自动将标题转成拼音。
在编辑和保存的时候,会自动将它转成slug。如果slug为空,或者为数字(可能是文章ID)的情况下,自动转成拼音

因为,该插件不需要你改程序,也没有配置文件 ,所以就不多介绍了。

下载地址:[attach=923]

---update: 2020-04-14

怎么不解析attach信息了?

Tags: typecho

Yii不启用LOG,记录当前所有的错误信息

在不启用LOG的情况下,如何记录错误呢?
我们都知道可以在出错的时候跳转到site/error下面那么也就相当于在输出error前将错误记录下来。
这时候我们当然是可以通过error_log来处理,也可以通过 自己写一段file_put_contents来将错误记录下来:error['errormsg'],将它保存就OK了。但有没有其他办法?

嗯,不需要自己控制程序,只要写三行代码就OK

PHP代码
  1. $logger = new CFileLogRoute();  
  2. $logger->init();  
  3. $logger->collectLogs(Yii::getLogger(),true);  

在判断完是否正确的时候就可以用这些代码将LOG存储下来。多方便 啊

Tags: yii, log

试用gist

其实gist功能早就见过了。类似功能的网站也非常多,但那些是不要注册 的。不过github这个gist嘛,注册了也有好处。自己把自己曾经写过的代码,还算好的代码,或者有想法的代码缓存下来。对自己以后  回顾的时候也有好处。

毕竟存在自己的电脑上也容易丢掉。这样多了一个碎片的管理,多少也有点好处。
比如,我就有这样一段:

PHP代码
  1. <?php  
  2.   
  3. $str = "101|1;0|4;1|0;0|0;0|0";  
  4.   
  5. //第一种  
  6.   
  7. $array = explode(';'$str);  
  8.   
  9. $items = array();  
  10.   
  11. foreach ($array as $v) {  
  12.   
  13. list($k$v) = explode('|'$v);  
  14.   
  15. if (emptyempty($v)) {  
  16.   
  17. continue;  
  18.   
  19. }  
  20.   
  21. $items[$v] = $k;  
  22.   
  23. }  
  24.   
  25. echo "<pre>";  
  26.   
  27. print_r($items);  
  28.   
  29. echo "</pre>";  
  30.   
  31. //第二种  
  32.   
  33. parse_str(preg_replace(array('/\d+\|0/','/;/','/\|/'),array("","&","="),$str),$result);  
  34.   
  35. echo "<pre>";  
  36.   
  37. print_r($result);  
  38.   
  39. echo "</pre>";  

看上去有点乱。不过。。。到:https://gist.github.com/4405542看就好很多了。。
我看看在代码里能不能引用:

Tags: github, gist

php pack()函数详解与示例

pack和unpack在一般的程序中还真的不容易见到,但是如果你用过很久以前的php生成excel你就会知道了。他的excel的头就是pack出来的
最近在尝试与C交互的时候又用上了这玩意,所以不得不再看看。其实就是C要求我一定要有包头。。。其实纯字符串也不错嘛。干嘛非得搞个包头呢?真纠结 .。

手册上有pack与unpack的介绍,但都是英文的。。。
 

  任何一款拥有socket操作能力的语言都有一个专门用于组包的函数,php也不例外!          

   用了很久php了却很少有机会用php进行一些二进制操作。 最近用php写一个socket客户端连接一个用C++语言开发的游戏服务端。 服务器端开发人员使用了二进制的形式来定义协议的格式。协议格式如下:

   包头(2bytes)+加密(1byte)+命令码(2bytes)+帧内容

1.包头的内容是记录帧内容的长度;
2. 加密:0表示不加密,1表示加密;
3. 命令码为服务端命令识别符号;

    一开始不了解php原来有pack可以来组装二进制包, 走了弯路,让服务端开发人员用C语言帮忙开发了的几个内存操作函数,按照协议规则返回二进制包,然后我将这几个方法编译成一组扩展函数供php使用。
   
    话归正题,本文是介绍如何使用pack和unpack这两个方法的。php官方手册举例太少,不能很容易理解,特别是那些格式化参数的使用。

转摘的参数中文说明:

pack/unpack 的摸板字符字符 含义
a 一个填充空的字节串
A 一个填充空格的字节串
b 一个位串,在每个字节里位的顺序都是升序
B 一个位串,在每个字节里位的顺序都是降序
c 一个有符号 char(8位整数)值
C 一个无符号 char(8位整数)值;关于 Unicode 参阅 U
d 本机格式的双精度浮点数
f 本机格式的单精度浮点数
h 一个十六进制串,低四位在前
H 一个十六进制串,高四位在前
i 一个有符号整数值,本机格式
I 一个无符号整数值,本机格式
l 一个有符号长整形,总是 32 位
L 一个无符号长整形,总是 32 位
n 一个 16位短整形,“网络”字节序(大头在前)
N 一个 32 位短整形,“网络”字节序(大头在前)
p 一个指向空结尾的字串的指针
P 一个指向定长字串的指针
q 一个有符号四倍(64位整数)值
Q 一个无符号四倍(64位整数)值
s 一个有符号短整数值,总是 16 位
S 一个无符号短整数值,总是 16 位,字节序跟机器芯片有关
u 一个无编码的字串
U 一个 Unicode 字符数字
v 一个“VAX”字节序(小头在前)的 16 位短整数
V 一个“VAX”字节序(小头在前)的 32 位短整数
w 一个 BER 压缩的整数
x 一个空字节(向前忽略一个字节)
X 备份一个字节
Z 一个空结束的(和空填充的)字节串
@ 用空字节填充绝对位置


string pack ( string $format [, mixed $args [, mixed $...]] )

一些规则:
1.每个字母后面都可以跟着一个数字,表示 count(计数),如果 count 是一个 * 表示剩下的所有东西。
2.如果你提供的参数比 $format 要求的少,pack 假设缺的都是空值。如果你提供的参数比 $format 要求的多,那么多余的参数被忽略。

下面还是用例子来说明用法会容易理解一点:
PHP代码
  1. 关于Pack:  
  2.   
  3. 下面的第一部分把数字值包装成字节:  
  4. $out = pack("CCCC", 65, 66, 67, 68);      # $out 等于"ABCD"  
  5. $out = pack("C4", 65, 66, 67, 68);         # 一样的东西  
  6.   
  7. 下面的对 Unicode 的循环字母做同样的事情:  
  8.  $foo = pack("U4", 0x24b6, 0x24b7, 0x24b8, 0x24b9);  
  9.   
  10. 下面的做类似的事情,增加了一些空:  
  11. $out = pack("CCxxCC", 65, 66, 67, 68);      # $out 等于 "AB\0\0CD"  
  12.   
  13. 打包你的短整数并不意味着你就可移植了:  
  14. $out = pack("s2", 1, 2);          
  15. # 在小头在前的机器上是 "\1\0\2\0"  
  16. # 在大头在前的机器上是 "\0\1\0\2"  
  17.   
  18. 在二进制和十六进制包装上,count 指的是位或者半字节的数量,而不是生成的字节数量:  
  19.   $out = pack("B32""...");  
  20.     $out = pack("H8""5065726c");         # 都生成“Perl”  
  21.   
  22. a 域里的长度只应用于一个字串:  
  23.   $out = pack("a4""abcd""x""y""z");      # "abcd"  
  24.   
  25. 要绕开这个限制,使用多倍声明:  
  26.   $out = pack("aaaa",    "abcd""x""y""z");   # "axyz"  
  27.    $out = pack("a" x 4,   "abcd""x""y""z");   # "axyz"  
  28.   
  29. a 格式做空填充:  
  30.   $out = pack("a14""abcdefg");         # " abcdefg\0\0\0\0\0\0"  
  31.   
  32. 关于unpack:  
  33.   
  34. array unpack ( string $format, string $data )  
  35.   
  36. $data = "010000020007";  
  37. unpack("Sint1/Cchar1/Sint2/Cchar2",$data);  
  38.   
  39. ## array('int1'=>1, 'char1'=>'0','int2'=>2,'char2'=>7);  
  40.   
  41. 最后本文开头讲到的协议使用pack/unpack 举例程序代码为 :  
  42.   
  43. $lastact   = pack('SCSa32a32',0x0040, 0x00, 0x0006, $username$passwd );  
  44.   
  45. unpack('Sint1/Cchar1/Sint2/Cchar2/',$lastmessage);  

学习资料:
http://blog.csdn.net/jojobb3138688/archive/2007/05/07/1598609.aspx

我上面的内容来自于:http://blog.sina.com.cn/s/blog_3eba8f1c0100nq9r.html,我现在已经顺利的使用完了。黑黑
还有的参考资料:
http://bbs.phpchina.com/thread-104492-1-1.html
http://hi.baidu.com/chinetman/item/f78a71d847e7d638e2108fda

Tags: pack, unpack