ThinkPHP 处理商品添加的时候操作多张表 用事务解决。

 #重新父类的add方法
    public function add(){
    	#同时操作多装表,可以考虑用事务来做,要同时插入数据成功要么都不插输入数据。
    	#开启事务的前提是表的引擎必须是InnoDB
    	
    	 #开启事务
    	 //mysql_query("STRAT TRANSACTION");
    	
         #--------------(1)插入商品的基本信息------------
    	 #判断是否插件成功
    	 if(($goods_id=parent::add())===FALSE){
    	 	return FALSE;
    	 }
    	 #--------------(2)插入会员价格------------
    	 #判断是否有POST数据提交过来
    	 if(isset($_POST['Ml'])){
    	 	#实例化会员价格模型
    	 	$Mb_Price=M('MemberPrice');
    	 	#循环post提交过来的数据
    	 	foreach ($_POST['Ml'] as $k=>$v){
    	 	    #插入数据
    	 	    $is_ok=$Mb_Price->data(array(
                    'goods_id'=>$goods_id,
	    				'level_id'=>$k,
					'price'=>$v,
				))->add();
				
			    /*
				if($is_ok===FALSE){
					mysql_query("ROLLBACK");
					return FALSE;
				}
				*/
    	 	}
    	 	
    	 }
    	 #--------------(3)插入商品属性-----------
    	 #判断POST提交过来是否有数据
    	 if(isset($_POST['GoodsAttr'])){
    	 	#创建一个属性模型
    	 	$good_attr=M('GoodsAttr');
    	 	#循环读取post提交过来的数据
    	 	foreach($_POST['GoodsAttr'] as $k=>$v){
    	 		#在判断属性提交过来的是否是一个数组    如:颜色  有 白色  黑色  金黄 ....
    	 		if(is_array($v)){
    	 			#在循环这个属性的数组
    	 			foreach ($v as $k1=>$v1){
    	 			  #在循环插件数据、
    	 			  $is_ok=$good_attr->data(array(
                            'goods_id'=>$goods_id,
							'attr_id'=>$k,
							'attr_value'=>$v1,
    	 			  ))->add();
	    	 		  /*
					   if($is_ok===FALSE){
						  mysql_query("ROLLBACK");
						  return FALSE;
					   }
					  */
    	 			}
    	 		}else{
    	 		  #说明是单个值
    	 		  $is_ok=$good_attr->data(array(
                     'goods_id'=>$goods_id,
					 'attr_id'=>$k,
					 'attr_value'=>$v,
    	 		 ))->add();
    	 	    /*
				  if($is_ok===FALSE){
					  mysql_query("ROLLBACK");
					  return FALSE;
				  }
				*/
    	 		}
    	 	}
    	 }
    }

  

原文地址:https://www.cnblogs.com/hgj123/p/4157503.html