我自定义一个函数pici(),它的作用是:获取到某流水号下的pi字段的值,然后+1(当没有这个流水号的记录时,取值0+1=1)然后依次向数据库中插入几条记录,形式大概为:
   流水号  pi  产品部件
   1         1        门套..
   1         2        门扇..
   1         3        线条..
   2         1        门套..
   2         2        门扇..
   2         3        线条..
但是在PHP中,用某页调用的时候,本应该每次都检索数据库,得到的值为1、2、3…… 这样子,可是,获取的值全部为1部分代码附在下面,恳请答疑。先谢谢

这里是自定义函数pici()function pici(){
$SQL = "select ifnull(max(pi)+1,'1') pi from bill where produce_no='预提交'"; 
$query=mysql_query($SQL);
$rs=mysql_fetch_array($query);
$svc=$rs[pi];
return $svc;
}  
下面是调用pici(),然后将3条数据插入数据库//门扇参数
mysql_query("insert into bill (color,series,produce_no,pi,prod_type,stuff_id,z,val,amount,typein) values ('$_GET[color]','$_GET[series]','$produce_no','".pici()."','$prod_type','$norms_stuff_id','门扇型号','$_GET[model_1]','$men_shu','$_SESSION[login_id]')"); 
//门套参数
mysql_query("insert into bill (color,produce_no,prod_type,pi,stuff_id,z,val,amount,typein) values ('$_GET[color2]','$produce_no','$prod_type','".pici()."','2','门套长','$mentaochang_shu','$mentao_shu_2','$_SESSION[login_id]')");   
//线条规格
mysql_query("insert into bill (color,produce_no,prod_type,pi,stuff_id,z,val,amount,typein) values ('$_GET[color3]','$produce_no','$prod_type','".pici()."','3','线条规格','$_GET[norms_3]','$xiantiao_shu','$_SESSION[login_id]')");

解决方案 »

  1.   

    本帖最后由 xuzuning 于 2012-11-30 16:29:00 编辑
      

  2.   

    有点急,我怕刚刚那个1个帖子2个问题,太长,人家看起来有点晕,不想看。就整理一下发这儿了。
    说下设计思路吧。
    就是个门的订单系统
    [color=#003300]1.当用户点了“加入部件列表”,利用ajax插入3条记录,分别是门套、门扇、线条,它们在数据库中为“预提交”的状态。流水号为1
    2.当用户再次点击“加入部件列表”:会再插入3条记录,分别是门套、门扇、线条,状态仍然是预提交,流水号仍然为1
    3.当用户点击“正式提交”,则将“预提交”全部update为真正的流水号
    最后的正确结果为:流水号  pi  产品部件  produce_no
       1        1     门套..
       1        2     门扇..
       1        3     线条.. 
       1        1     门套..
       1        2     门扇..
       1        3     线条..
    目的是商户下订单的时候,多次选择乱七八糟的部件,能够像购物车一样,暂时登记一下,最后提交时作为1个订单来提交(同一个流水号)
      

  3.   

    但是现在得到的结果是:
    流水号  pi  产品部件  
       预提交      1     门套..
       预提交      1     门扇..
       预提交      1     线条.. 
       预提交      1     门套..
       预提交      1     门扇..
       预提交      1     线条..
    那个pi的字段,全部是得到了值:1
    似乎是只检索了1次数据库,而不是每次调用,每次都去执行pici()里的内容
      

  4.   

    还是 ifnull(max(pi)+1,'1') 的问题
    你可想一想:
    如果 max(pi) 为 null 因为是“预提交”,pi 无值
    那么 null + 1 等于什么呢?
    如果等于 null 那么就返回 '1'
    如果等于 1 那还是返回 1
    是这样的吧?你若想使 pi 递增,应统计非预提交的记录个数再加 1
      

  5.   

    不是SQL的问题,我准备2条语句,你可以在mysql中试一下,附上截图:1.select max(ifnull(pi,0))+1 from bill where 1=2;原因分析:程序先去分析被max括起来的ifnull(pi,0),因为流水号为预提交的数据还未插入,可以视为1=2,所以得到记录为空,就没有max之说了。得到了空值-------------------------------------------------------------------------------------
    2.select  ifnull(max(pi)+1,'1') from bill where 1=2;原因分析:先去分析被ifnull括起来的max(pi)+1,因为记录为空,所以更就没有max()的记录了。最后被ifnull判断是空的,赋值为1总之你说的max在外面,是在数据库中已经存在空值的记录时,才适合使用;反之如果表中没有记录,则要full在外,才会得到替代的数值。
      

  6.   


    我在2楼写希望得到的结果时,写错了。正确的应该是:流水号  pi  产品部件  produce_no
       1        1     门套..
       1        2     门扇..
       1        3     线条.. 
       1        4     门套..
       1        5     门扇..
       1        6     线条..
    是指同一流水号下,pi字段递增
      

  7.   

    你有 where 1=2
    能出结果才怪呢?
    你去问问你的同事,他们会告诉你你哪里错了
      

  8.   

    不是哦。不是1=2,我是为了代码发到这里,便于查看,才用了1=2其实应当是这样的
    select ifnull(max(pi)+1,'1') pi from bill where produce_no='预提交'因为有2种情况:
    1.表中不存在product_no='预提交'的数据,所以可以视为1=2
    2.表中存在了product_no='预提交'的数据,所以就不会取到控制,直接取字段pi的最大值max(pi)所以SQL才用了ifnull(max(pi)+1,'1')
      

  9.   


    不是哦。不是1=2,我是为了代码发到这里,便于查看,才用了1=2其实应当是这样的
    select ifnull(max(pi)+1,'1') pi from bill where produce_no='预提交'因为有2种情况:
    1.表中不存在product_no='预提交'的数据,所以可以视为1=2
    2.表中存在了product_no='预提交'的数据,所以就不会取到空值,直接取字段pi的最大值max(pi)所以SQL才用了ifnull(max(pi)+1,'1')