今天在phpx论坛有人问起"php如何生成不重复的流水号"的问题,因为自己以前曾经做过"php如何生成不重复的流水号"的方法研究,所以写下来,希望对一些正在寻找"php生成不重复的流水号"朋友有用
本站原创,欢迎转载,请注明出处 http://www.dayanmei.com/blog.php/ID_275.htm
由于要符合日常生活习惯,所以我们一般不是使用mysql的自动增量作为流水号,而一般采用日期+数字的方式 比如 OM200611140001,20061114代表 2006年11月14日,0001代表流水号ID
一般的,人们采用LAST_INSERT_ID()+1的方法,这种方法在数据库使用的人数不多时发生重复的几率是比较少的,但不排除重复,所以我们还的做些别的工作
第一种方法:php+mysql生成不重复的流水号
1.创建一个只有一个数据行的数据表,其值在将需要的时候更改。
CREATE TABLE `tbl_id` (`id` INT UNSIGNED NOT NULL);
INSERT INTO `tbl_id` VALUES(0);
2.使用的时候
function geneId() {
mysql_query('UPDATE `tbl_id` SET `id`= LAST_INSERT_ID(id+1)');
$id = mysql_insert_id();
return $id
}
3.一般应用时id初始为一定位数,如100000
对前面需要补零的可以用mysql函数或php函数轻松实现。推荐用php
例:生成前缀为时间,流水号为六位的id
function geneId() {
mysql_query('UPDATE `tbl_id` SET `id`= LAST_INSERT_ID(id+1)');
$id = mysql_insert_id();
$id = date('ymd').str_pad($id, 6, '0', STR_PAD_LEFT);
return $id;
}
4.可以不是每次加1,改LAST_INSERT_ID(id+???)的???,还可以是减!
5.多流水号生成
表里增加一个流水号标识字段就行了,这个就不多说了
6.当然可以用文件保存,轻松实现上面的效果
这种方法貌似可以,但个人觉得,仍可能出现同时获取ID的情况
第二种方法:php+mysql生成不重复的流水号
转自PHPE论坛的superspice,这种方法貌似可以!
一、在数据表中将流水号字段定为unique的(不可重复)
二、使用do{} while()语句,尝试生成流水号并插入数据表,如果插入不成功会重新生成一遍插入。
do
{
$liushuihao = create_liushuihao();
$sql = "insert into...";
} while(!insert_liushuihao($sql))
写个insert_liushuihao函数,如果$sql执行成功了返回true,否则返回false。
这样就可以保证你的流水号不重复了。
第三种方法:php+文本生成不重复的流水号
这也是我采用的一种方法,在我曾经为工厂做的一个订单管理系统中使用的就是这种方法,估计应该是没有问题的,我做了一个工厂内部的订单管理系统,用了3年,没有出现重复的现象(也可能是比较少人用,最多时也就8个人,同时的几率比较小)
可以试试
使用一个文本文件比如number.txt,
不是当日就清空,并填入数字1,将其锁住 flock($fp,LOCK_EX);
在新增加时读取这个文本文件,并锁住该文本文件,将其值+1后更新
直到新的流水号值插入数据库成功,解锁文本文件
本站原创,欢迎转载,请注明出处 http://www.dayanmei.com/blog.php/ID_275.htm