php如何生成不重复的流水号?

bluestream 2010-07-22 02:09:48
我使用的是mysql,由于没有root用户权限,所以不能在数据库创建触发器,只能用PHP来生成流水号,规则如下:
流水号格式 日期+四位数字编号 如20100721+0001=201007210001
每天编号都是从0001开始计算
201007210001
201007210002
201007210003
.
.
.

201007220001
201007220002
201007220003
.
.
.

用PHP如何实现呢?
...全文
1262 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluestream 2010-07-22
  • 打赏
  • 举报
回复
id号最大只能是4位数的
mailangel123 2010-07-22
  • 打赏
  • 举报
回复
ID号设置不唯一的,+日期就行了,不会重复
Dleno 2010-07-22
  • 打赏
  • 举报
回复
插入定单数据,不包括定单号。
更新定单号为:(time()+mysql_insert_id())

这样应该不会重复了。
benzzy 2010-07-22
  • 打赏
  • 举报
回复
上面的方法都挺好,如果这个数据库你完全没有权限,加不了字段来存最大的流水号,而这个流水号又不只是你一个人在用的时候,可以采用一个比较费时间的傻办法,就是用for语句
这个流水号前面的日期一段如何获得,就不详述了,后面的用for语句,不足4位的补零
然后判断每个这个号是否已经存在于数据库中,如果发现某个号不在数据库中,取出这个值,然后跳出循环
fxs_2008 2010-07-22
  • 打赏
  • 举报
回复
UP 一下了,这个是经常用的,业务中常有
mengfanpp 2010-07-22
  • 打赏
  • 举报
回复
lock table
从数据库里取当天的最大值
如果没有,格式化当天的时期加 “0001”
如果没有,日期部分加上 数字部分加1.
insert 记录.
unlock table
Alfredknox 2010-07-22
  • 打赏
  • 举报
回复
先把201007220001分为两段去处理咯(20100722和0001),把这二个值先存放到一个文件里面去,每次都更新为最新的值。当要生成新的流水号时,把文件里的值取出来,前面的进行比较是为了看是否是今日的,如果是即从0001开始,否即把0001转为数值类型并加1再用str_pad转为4位并以0作为填充,问题就解决了吧!
bluestream 2010-07-22
  • 打赏
  • 举报
回复
是要用PHP程序控制表的锁定吗?
mengfanpp 2010-07-22
  • 打赏
  • 举报
回复
你需要把table lock掉
kyzy_yy_pm 2010-07-22
  • 打赏
  • 举报
回复 3
$h = date('H', time());
$i = date('i', time());
$s = date('s', time());
if(!isset($_COOKIE['d']) || $_COOKIE['d'] != date('d', time())){//如果不存在标识变量(今天的号)或者号不一样,那么从1开始
setcookie('d', date('d'), time() - $h * 3600 - $i * 60 - $s + 24 * 3600);
setcookie('count', 1, time() - $h * 3600 - $i * 60 - $s + 24 * 3600);
$count = 1;
}else{
$count = $_COOKIE['count'];
}
$l = strlen($count);
switch($l){
case 1:
$s = '000';
break;
case 2:
$s = '00';
break;
case 3:
$s = '0';
break;
default:
break;
}
$s .= $count++;
setcookie('count', $count, time() - $h * 3600 - $i * 60 - $s + 24 * 3600);
echo date('Ymd', time()).$s;
CunningBoy 2010-07-22
  • 打赏
  • 举报
回复
文件锁flock
bluestream 2010-07-22
  • 打赏
  • 举报
回复
php怎么加锁呀
PIGer920 2010-07-22
  • 打赏
  • 举报
回复
插入要加锁
amani11 2010-07-22
  • 打赏
  • 举报
回复
是指今日最后插入的,流水号
amani11 2010-07-22
  • 打赏
  • 举报
回复
忘记+1了,汗
amani11 2010-07-22
  • 打赏
  • 举报
回复
可能不是连续增加吧???

搜索最后插入的流水号, $pid

$today = date("Ymd");
$pid = str_replace($today, '', $pid);//理论上会出错,如果流水号超出2010072220100722
$pid = $today . str_pad($pid, 4, "0", STR_PAD_LEFT);//低于4位,在前面补0,并和时间串连起来
echo $pid;

diannaomingong 2010-07-22
  • 打赏
  • 举报
回复
拿txt/xml/sqlite/mysql 存 day number

然后获取的时候, 如果day不为今天, 则number重置, 再写入day为今天,否则number++
CunningBoy 2010-07-22
  • 打赏
  • 举报
回复
使用全局变量,自加

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧