-- 
-- 表的结构 `orderformlist`
-- 
CREATE TABLE `orderformlist` (
  `oid` int(11) NOT NULL auto_increment,
  `pid` int(11) NOT NULL default '0',
  `uid` int(11) NOT NULL default '0',
  `oCode` varchar(30) NOT NULL default '',
  `pCode` varchar(30) NOT NULL default '',
  `consignee` varchar(30) NOT NULL default '',
  `address` varchar(255) NOT NULL default '',
  `telephone` varchar(20) NOT NULL default '',
  `mobileTelephone` varchar(20) NOT NULL default '',
  `pName` varchar(30) NOT NULL default '',
  `pSpecification` varchar(30) NOT NULL default '',
  `pColor` varchar(20) NOT NULL default '',
  `pUnits` varchar(10) NOT NULL default '',
  `credits` decimal(10,0) NOT NULL default '0',
  `pBarbarismPrice` decimal(10,2) NOT NULL default '0.00',
  `unitPrice` decimal(10,2) NOT NULL default '0.00',
  `amount` int(5) NOT NULL default '1',
  `paymentMethod` varchar(255) NOT NULL default '',
  `paymentGist` varchar(255) NOT NULL default '',
  `estate` int(5) NOT NULL default '0',
  `pHase` int(5) NOT NULL default '0',
  `datetime` datetime NOT NULL default '0000-00-00 00:00:00',
  `re` varchar(60) NOT NULL default '',
  `buyTime` datetime NOT NULL default '0000-00-00 00:00:00',
  `congealEstate` int(11) NOT NULL default '0',
  PRIMARY KEY  (`oid`)
) TYPE=MyISAM AUTO_INCREMENT=14 ; 
-- 
-- 表的结构 `accountlist`
-- 
CREATE TABLE `accountlist` (
  `uid` int(5) NOT NULL auto_increment,
  `credits` decimal(10,0) NOT NULL default '5',
  KEY `uid` (`uid`)
) TYPE=MyISAM AUTO_INCREMENT=12 ;--------------------------------------------------------------------
当orderformlist.estate字段的值被改为2的时候(0值表示预定单,1值表示正在送货,2值表示已到货并付款,3值表示已退订单),当orderformlist.estate字段的值被修改时,orderformlist.buyTime字段记录orderformlist.estate字段的修改时间,然后根据orderformlist.buyTime字段记录的修改时间至10天后把orderformlist.credits字段中的值加入accountlist.credits字段中,条件为orderformlist.uid=accountlist.uid,orderformlist.congealEstate字段中的值被改为1(0值表示没冻结,1值表示冻结)。如果10天之中orderformlist.estate字段的值从2被修改为其他值,那么
根据orderformlist.buyTime字段记录的修改时间至10天后把orderformlist.credits字段中的值加入accountlist.credits字段中条件为orderformlist.uid=accountlist.uid,orderformlist.congealEstate字段中的值被改为1的这一操作失效。如果当orderformlist.estate字段的值再次改为2时,orderformlist.buyTime重新记录修改时间。PS:假设每天都会有用户的定订单的orderformlist.estate字段值被改为2或是从2值被改为其他值,这种情况是存在的。我想实现的就是需要这一操作不是通过PHP程序在用户每次登入时去遍历用户orderformlist.estate字段值为2的订单,而是通过其他途径来解决对用户订单
检查,并对检查结果做其操作。
PHP + MySQL 4.0.1.2

解决方案 »

  1.   

    是的,我想让这个操作自动自行一次 如果每次打开一个页面用PHP去做一次检查或判断的话,我总觉得是不是不合理。
      

  2.   

    建议,在orderformlist.estate字段的值被改变的时候,去判断,然后用php去处理数据库的内容,例如插入,更新数据什么的。
    如果是mysql5.0 的话,也写个触发器,这样就能够楼主所说的自动。
    具体的触发器如何写,要根据实际业务来定,触发器如何写,楼主看看帮助文档即可。
      

  3.   

    楼上的 朋友,我不知道你有没有理解我的意思
     我的这样的
     用户A
    table:orderformlist
    uid  oCode  credist   estate        buyTime          congealEstate
     A     01     20        2      2007-05-13 06:59:21         1
     A     02     20        0      2007-05-20 07:23:59         0         
     A     03     20        2      2007-05-21 12:11:43         0
     A     04     20        1      2007-05-23 23:26:12         0
     A     05     20        3      2007-05-21 10:01:06         0 
    现在用户A有了这些订单记录,其中estate值为2的有两条,有一条是冻结了的oCode=01;
    那么我的意思就是 用什么途径来自动执行oCode=03 这条记录在10天以后congealEstate字段值能被改为1;而且credist的值会加入accountlist.credits字段中。
    这里我还有一个说明,就是用户A的订单记录是随时会有增加的(订单不能被删除,如果增加了订单只能退其订单做状态上的修改,如改为退订状态)。我就是在想,怎么能够不在用户每次登入的时候用
    <?
    $obj_order = new orderForm($db);

    if($obj_order->queryAllOrderForm(2,$_SESSION['uid'])){
        $obj_account = accountClass($db);
        for($i=0;!$obj_order->obj_ADORecordSet->EOF;$i++){
        $obj_order->getRecord();
    $datetime = explode(" ",$obj_order->buyTime);
        $date = explode("-",$datetime[0]);
        $time = explode(":",$datetime[1]);
    $mktime = mktime($time[0],$time[1],$time[2],$date[1],$date[2],$date[0]);
    if(time()>=$mktime+60*60*24*10){
      $obj_account->uid = $obj_order->uid;
      $obj_account->gainCredits($obj_order->credits);
      $obj_order->congealEstate = $obj_order->congealEstateExplain[1][0];
      $obj_order->updateOrder();
    }
    $obj_order->obj_ADORecordSet->MoveNext();
      }
    ?>
    这段代码去做着个操作,而是用其他途径定时或能根据某条定单的buyTime时间做及时主动的更新
      

  4.   

    if($_POST['loginId']){  $object ->loginId = $_POST['loginId'];
      $object ->password = $_POST['password'];
      if($object ->login($_POST['number'])){
        $obj_order = new orderForm($db);
        if($obj_order->queryAllOrderForm(2,$_SESSION['uid'])){
          $obj_account = accountClass($db);
          for($i=0;!$obj_order->obj_ADORecordSet->EOF;$i++){
            $obj_order->getRecord();
            $datetime = explode(" ",$obj_order->buyTime);
            $date = explode("-",$datetime[0]);
            $time = explode(":",$datetime[1]);
            $mktime = mktime($time[0],$time[1],$time[2],$date[1],$date[2],$date[0]);
            if(time()>=$mktime+60*60*24*10){
              $obj_account->uid = $obj_order->uid;
     $obj_account->gainCredits($obj_order->credits);
     $obj_order->congealEstate = $obj_order->congealEstateExplain[1][0];
     $obj_order->updateOrder();
            }
            $obj_order->obj_ADORecordSet->MoveNext();
          }
      
        }
        getURL($object ->msg,"../../../");
        exit;
      }
      getURL($object ->msg,$url);
      exit;
    }
      

  5.   

    我明白你的意思,你的是要实现将来时的自动数据转换。
    我提到的方法不能实现,只能够实现当前的动作的。要实现你的东西,最简单的解决办法就是添加任务(每过一段时间检测一下,看看有没有待处理的东西,如果结构组织好了,这个过程是很高效的),但是,MySQL本身没有任务的概念。唉,真麻烦。我再想想,先吃饭了。楼主的 用户每次登入的时候用 的唯一缺点就是,用户登录的时间可能会比较长。
      

  6.   

    现在好像的唯一方法,就是,从操作系统上增加一项任务,就是定点执行一个程序,该程序的功能就是调用一段存储过程,如果不支持存储过程,也可以把存储过程写在程序里面。增加一个表,为这个程序使用。该表的是有一个时间字段,一个sql字段。select id,sql from table where mytime=now() 然后用程序或者存储过程,执行每条sql,并执行玩该条sql后,自动从table表里面删除该行记录。数据格式:
    id          time                    sql
    1        2007-9-10        delete from t1 where ........;
    2        2009-1-9         insert t2 ............;
    3        2008-9-3         update ..............;
    4        2007-8-1         call mystoreproduce();
    5        2007-6-7         ...............等等,也就是说,sql字段的内容就是一条完整的sql语句,如果楼主不想弄这个字段,也可以拆解开,然后用的时候再拼上也可以。唉,如果 MySQL支持任务,也就没有这么麻烦了。
      

  7.   

    数据格式:
    id        mytime                    execsql
    1        2007-9-10        delete from t1 where ........;
    2        2009-1-9         insert t2 ............;
    3        2008-9-3         update ..............;
    4        2007-8-1         call mystoreproduce();
    5        2007-6-7         ...............select id,execsql from table where mytime=now();当然了,这个表的数据插入也得依据业务上的逻辑才可以,这点楼主比我更清除了。
    要保证的是,插入的SQL语句要正确,否则,10天之后,调用该语句的时候,执行失败,可就....如果是程序的话,就不说了,如果是从存储过程里面,需要用到游标,具体用法,楼主回头自己看看吧。
      

  8.   

    用另一个表来记录 好象不大合适,用window里的程序来定时执行一个PHP脚本的话,还是不能够到达时时更新,我最希望的就是 一秒都不差的把数据给更新了。我的初步想法是请教COM+的朋友是否能否实现这种及时的更新。
       之前我就在想能让数据库服务器来执行这一过程。
     现在我是先用 用户登入来 做的,但我要把他变为自动的,而且需要它能及时被更新,一秒不差的更新每一个用户帐户。但如果说,假设某种情况用户不能及时得到最新的帐户信息,就会引起很多的问题。
      

  9.   

    没完全看完。现在各PHP论坛的缓存应用就是检测是否需要更新,如果需要更新就重新读取数据库,如果不需要就不读取数据。可以把思想借鉴过来。
      

  10.   

    就是不更新 10天后才进行一个操作。
      我的意思是想10天后把一个记录 如果符合条件的话,就执行一个相关的SQL语句做一次更改某指定数据的操作。
      
       而且分秒不差的执行 这样是最好的。
     就比如 
    2007-5-26 21:25:35 那么2007-6-5 21:25:35 指定的记录没有关键条件的更改 就要执行另一个数据更新操作
    那么另一个记录时间2007-5-26 21:10:20 到了2007-6-5 21:10:20 同样要进行操作。
      记录那么多而且每条记录时间不一样。 又要分秒不差的。  大哥们觉得怎么做好?
      

  11.   

    create trigger 然后利用mysql的关键字NEW,这样行不?
      

  12.   

    mysql不会用,oracle可以设置作业来实现的