--
-- 表的结构 `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
-- 表的结构 `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
如果是mysql5.0 的话,也写个触发器,这样就能够楼主所说的自动。
具体的触发器如何写,要根据实际业务来定,触发器如何写,楼主看看帮助文档即可。
我的这样的
用户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时间做及时主动的更新
$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;
}
我提到的方法不能实现,只能够实现当前的动作的。要实现你的东西,最简单的解决办法就是添加任务(每过一段时间检测一下,看看有没有待处理的东西,如果结构组织好了,这个过程是很高效的),但是,MySQL本身没有任务的概念。唉,真麻烦。我再想想,先吃饭了。楼主的 用户每次登入的时候用 的唯一缺点就是,用户登录的时间可能会比较长。
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支持任务,也就没有这么麻烦了。
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天之后,调用该语句的时候,执行失败,可就....如果是程序的话,就不说了,如果是从存储过程里面,需要用到游标,具体用法,楼主回头自己看看吧。
之前我就在想能让数据库服务器来执行这一过程。
现在我是先用 用户登入来 做的,但我要把他变为自动的,而且需要它能及时被更新,一秒不差的更新每一个用户帐户。但如果说,假设某种情况用户不能及时得到最新的帐户信息,就会引起很多的问题。
我的意思是想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 同样要进行操作。
记录那么多而且每条记录时间不一样。 又要分秒不差的。 大哥们觉得怎么做好?