Archive for the ‘PHP/Mysql’ Category

mysql中主键重新重新计数的方法

星期日, 十二月 11th, 2011

今天操作mysql数据库,发现一个问题。当一个表里面有一个自增长的主键时,插入了10条数据,主键id自动增长到10,由于某原因需要删除第10条数据,再插入新的数据时,新的主键会是11,而不是10。

问题分析:
这里的主键(AUTO_INCREMENT)对于数据库来说就是一个不重复且自增长的数值,一旦删除后再补上,有可能会造成数据库的内部紊乱,例如当数据量很大的时候要把数据都提前一个,那是需要相当大代价的。

解决办法:
如果确实需要把这个AUTO_INCREMENT设置为1开始计数,只有清空表,是“清空”表,phpmyadmin里面有该按钮。语法使用TRUNCATE语句。例如 TRUNCATE table ‘abc’。这时候数据库会更新该表为初始状态,计数器自然也开始从1开始了。

一些更新细节

星期日, 十二月 26th, 2010

1.垃圾评论一直是让人极其深恶痛绝的意见事情。尝试了一些防spam插件依然不好用,索性更改为数字验证。这样评论只需多作一下数字运算即可。
2.超过一个月的文章不允许再被评论。
3.服务器新增了memcached,同时博客启用了memcache,服务器响应速度大增,相当畅快。ping值25ms的情况下,几乎感受不到服务器反应时间,速度终于提升n倍。随后还要整理一下关于memcached在linux的安装教程。
4.博客改名为“刻程”后感觉实在没有深度,还是换回原来的“因思而变”吧,只可惜网上很多叫这个名字的博客,小不爽。
5.这里下雪了,u know?
6.这张图片有必要着重标记一下:

今天是圣诞节,顺祝我认识的所有人节日快乐……晕,好像这会儿已经是26日凌晨了

PHP和串口通信的方法介绍

星期三, 十二月 1st, 2010

工作原因,php在部分应用偶尔和串口直接通信,需要和rs232、rs485接口上的数据进行通信。网上搜索众多解决方案,出现很多问题,这里总结一下php与串口通信的方法大全。

php与串口通信,基本有两种途径
1.通过php扩展dio。
下载dio扩展:http://www.cyberspice.org.uk/downloads/dio-0.0.4rc3.tgz
在php.ini打开dio扩展。
dio开启后可以通过dio_open dio_read等函数进行通信。但dio默认只是在linux下的,好像pecl也有编译后的php_dio.dll,但我在win下测试其实无法正常使用,可能是我php版本太高(5.3.3)。
dio扩展如果能打开,网上自然有很多实例

<?php
 
$c = stream_context_create(array('dio' =>
    
array('data_rate' => 115200,
          
'data_bits' => 8,
          
'stop_bits' => 1,
          
'parity' => 0,
          
'is_canonical' => 1)));
 
 
if (PATH_SEPARATOR != ";") {
    
$filename = "dio.serial:///dev/ttyS0";
 
} else {
    
$filename = "dio.serial://COM1";
 
}
 
?>

2.PHP_SER扩展
这是一个第三方扩展,可以在php5.3.3上正常使用,我测试结果是比较稳定,提供了单字节流通信和异步通信。对于单字节流通信我还专门请教了作者,发现原来可以通过loop读取数据流的。需要注意的是ser_write()的数据是字符型,但是ser_read()的数据则是10进制。所以发送的时候最好转换为hex,接收后由十进制再转为十六进制才能正常使用。
还有就是php_ser作为第三方扩展,作者是收费的。免费版本没有功能限制,只是每次收发字节数不能超过1024字节。

function x_get_cgqbh() {
 
    
$str = 'at+ver?';
    
$str = hexToStr($str);
 
    
ser_open( "COM1", 9600, 8, "None", "1", "None" );
    
if (ser_isopen()) {
        
return "opened, post data ......";
    
}else{
        
return false;
    
}
 
    
ser_write("$str");
    
sleep(1);
 
    
$str = ser_read();
 
    
ser_close();
 
    
return $str;
 
}

php_ser地址:忘了,回头补上。

tx的编程风格

星期四, 十一月 18th, 2010

腾讯开放平台下载的sdk中的代码。上图不说话:

运行错误提示,php5.3下修正后才能正常使用:

仔细想想,我还是不由得想说:大公司又怎样。

mysql字段内容大小写转换问题解决方案

星期五, 八月 13th, 2010

有需求转换mysql大小写,查了半天,网上竟然没有现成函数,都是用存贮过程来解决的,不太合理。于是想到使用替换功能,把A变成a,从a到z执行26次,但想想这办法也太二了。。强迫症又犯了,所以能得到下边的解决方案:
update table set mediafile = lower(mediafile)
说明:mysql 的 lower(), uppper() 和 lcase(), ucase()支持字段的 小写,大写,

在线生成二维码

星期日, 六月 20th, 2010

二维码在国外(特别是日本,因为二维码发源于日本)用的移动互联应用比较多,由于国内近年来智能手机和移动互联网的发展迅速,二维码的应用也渐渐发热。国内目前最为广泛的二维码应用就是新版火车票,虽然现在检票还没有全面进入扫描时代,但这是早晚的事情。

二维码的方便之处在于可以以更加规范、简单的存储信息,简单的说,有点“世界普通话”的味道,这个标准可以让数据在各种物理设备间方便的存贮、转存信息和数据。
于是我抽时间写了一个在线生成二维码的程序,规范来自ISO/IEC 18004:2006,这个规范不支持中文,但在全球通用,一般应用于网址、电话的存贮。
你能看出来这个图片存贮的一句歌词么:

以上大小在htc G2-G7手机上都能被识别(一句歌词,你能读出来么:P)。
想象一下:网页的重要内容旁边都有一个二维码来表示当前内容,用户如果想把这个信息转存到手机,只需要扫描一下该二维码即可瞬间以文字信息存储到手机上;反之,如果一个纸质的内容旁边富有二维码,想转换为电脑文字数据,有是多面的方便。
再想一下:肯德基的优惠券信息直接可以以二维码方式发放和读取(事实上听同事说kfc已经这样了)。
如果生活变成这样,科技和人类智慧带给我们的幸福感是不是会更加多一点。

我刚写的一个在线生成二维码地址程序:
http://www.liuhuadong.com/labs/2weima/index.php
欢迎大家使用并提出宝贵意见

Android下扫描软件:Barcode Scanner

Assigning the return value of new by reference is deprecated in xxxx的解决办法

星期二, 四月 20th, 2010

自从php5.3,越来越多的人会遇到“Assigning the return value of new by reference is deprecated in xxxx”这样的提示,尤其是在国外产品中(例如wordpress、joolma),很多人的解决办法很简单:把php版本换回就版本就ok了。毫无疑问这是个好办法,对这种遇到问题不求甚解的态度可能会让人看到些什么。我认为要换回php的旧版本,其实是对php技术爱好者的一种羞辱(用词不当,大致是这个意思)。解决办法:php5.3开始后,废除了php中的”=&”符号,所以要想复制,直接用=引用即可。详细如下:

1、PHP5对象复制是采用引用的方式;
2、如果不采用引用方式,则需要在复制对象时加关键字 clone;
3、如果在复制的过程中,同时要变更某些属性,则增加函数_clone();

中国移动飞信通信协议分析

星期二, 四月 13th, 2010

作者:刘华栋 2010.4.13
本文目的在于探讨学习,请勿用于非学习外的任何用途,否则后果自负。

出于某些需求,要用到手机短信提醒功能,自然还是免费的好。网上流传了很多版本关于飞信的通信协议,大同小异(基本都是基于2.0的,飞信现在2010协议版本为4.0),当飞信更新了一部分协议内容时,这些流行的协议似乎有些问题出现,最典型的就是:

旧版本飞信协议支持输入任何手机号码,只要是发送者好友,即可发送手机短信。
新版本飞信协议支持输入任何飞信号码,只要是发送者好友,即可发送手机短信。
新旧版本都支持发送登陆者自身手机号码为接收手机的短信。

如果我有100个飞信好友,莫非我要记住100个飞信号码?如果我要提供一个飞信接口给大伙,莫非大伙要记住他们好友的飞信号码?
当然,写本文的目的就在于从根本上解决上述两个问题(其实是一回事)。

通过对飞信协议多个版本进行了抓包分析,发现数据包格式没什么大的变化。唯一重要的变化是第五行:

M fetion.com.cn SIP-C/4.0
F:88888888
I: 10
Q: 2 M
T: sip:99999999@fetion.com.cn;p=640
//上面一行旧版本协议这里是:
//T: tel:13599999999
C: text/plain
K: SaveHistory
L: 4

这里就出现一个问题,要想发送手机短信,提交过来手机号不行,需要提交手机号对应的飞信号码才能识别,如何才能把手机号码转换为飞信号码就是解决问题的关键。经对新协议抓包分析,发现并不能直接从手机号码转换成飞信号码,但是中间有一个很不错的变量叫做”user-id”,每个手机号对应一个飞信号码,同样对应每个user-id(至于为什么会多出来一个user-id,我想可能是飞信公司准备把飞信号码当做一种商业资源来使用吧)。其实我们用户的真正的飞信号码是这个user-id,所谓飞信号码,无非是一个数字昵称(another nickname)而已。明白这些,问题就好办了:

1.发送接收者手机号码,抓包获取该号码的user-id
2.发送请求好友列表信息(登陆后自动完成);
3.匹配1user-id,对应的飞信号码(注意格式:fetion_num@fetion.com.cn)
4.发送飞信号码、短信内容,Done

具体代码省略,关键正则函数:

//获取飞信号码
function get_fetion_id($userid, $rst) {
    
preg_match("/ri="sip:(d{6,10}+)@fetion.com.cn;p=(d{0,6}+)"
        user-id=
"$userid/i",$rst, $matches);
    //同理重构函数获取user-id
    //preg_match(
"/user-id="([0-9]+)"/i", $rst, $matches);
    return
$matches[1];
}
?>

这样同样还会存在一个问题:给自己手机号码发送的时候转换不到自己的自己的user-id。解决办法也很简单,只需要在手机号码提交过来最初判断一下是否为登陆号码即可,如果是,取消所有转换,直接进行第4步骤即可发送。

纸上谈兵无用,演示:
Demo1:http://www.liuhuadong.com/phoneme
Demo2:http://labs.liuhuadong.com/cmcc/index.php(暂无,睡醒后继续)
QQREADERC927A243851272DC

测试一下你的最快击键速度[附排行榜]

星期日, 四月 4th, 2010

输入速度全球排行榜。
作者:刘华栋 2010.4 原创作品,欢迎转载流传
无标题
具体使用方法很简单,打开下边这个页面,直接用键盘开始输入字母a到z,顺序不能弄错,输入完成即会自动显示用时。
虽然这可能是个无聊的作品,但还是花了我不少时间才搞定,中间涉及js、css、php、mysql,我自己的26个字母的输入记录是<5秒,具体多少忘了。我的目标是达到4s以内,不过看来希望不大。
挑战地址:http://www.liuhuadong.com/labs/top.php

tips:
数据库中使用group by的时候,可以同时使用min(字段名)/max(字段名)来获取每个group中的最值,这个sql语法简直太棒了,大大减少坐在电脑前呼出的二氧化碳含量,节能环保。

vim之gg=G

星期六, 四月 3rd, 2010

无论你是vim老手还是菜鸟,vim总会给你一些惊喜甚至是惊奇。就像今天发现gg=G全文缩进这个命令一样(或者说发现=为缩进)
例如目前代码:
无标题
使用命令:=}(当然不是标题中的gg=G,vim的微妙之处就在于你看到一个命令会联想到很多自己想要的组合命令)
无标题