工作中遇到的一个相当有意思的问题(关于Windows和linux环境下执行PHP,ajax,javascript,flexigrid的一个莫名异常)

来源:互联网 发布:金蝶软件服务中心 编辑:程序博客网 时间:2024/05/18 09:20

今天在做一个PHP的程序时碰到这样的问题:product.php(control层文件):

        /** * @author gayayang * @date 2012-3-24 * @todo 将产品批处理分给操作人(这里可以让多个人同时拥有同一个产品) */public function ajax_AllSelectedAdd($items){//debug($items);if(!empty($items)){$rows = explode('$', $items);array_pop($rows);$row = array();for ($i=0;$i<count($rows);$i++){$row[$i] = explode(';',$rows[$i]);}$productInUserModel = module('product_in_user');if($productInUserModel->productInUser_batch_add($row)){model_jsCtrl::Alert_Location($this->language['add_productInUser_success'],get_url(array('m'=>'product','a'=>'productInUser')));}else{model_jsCtrl::Alert_Location($this->language['add_productInUser_fail'],get_url(array('m'=>'product','a'=>'productInUser')));}}else{model_jsCtrl::Alert_Location($this->language['add_productInUser_nodata'],get_url(array('m'=>'product','a'=>'productInUser')));}}

        /** * 单个添加产品到个人名下 * @author gayayang * @date 2012-3-24 * @param int $id 产品id * @param string $ebayPrice ebay上的卖价 * @param string $keywords 产品搜索关键字 */public function addToUser($id,$ebayPrice,$keywords){//debug($_SESSION);$userId = $_SESSION['ADMIN_ID'];$row['ProductId'] = $id;$row['AdminId'] = $userId;$row['EbayPrice'] = $ebayPrice;$row['Keywords'] = $keywords;$productInUserModel = module('product_in_user');if($productInUserModel->productInUser_add($row)){model_jsCtrl::Alert_Location($this->language['add_productInUser_success'],get_url(array('m'=>'product','a'=>'productInUser')));}else{model_jsCtrl::Alert_Location($this->language['add_productInUser_fail'],get_url(array('m'=>'product','a'=>'productInUser')));} }


这里,我代码是这样写的。然后这个方法是由

/** * @author gayayang * @date 2012-3-24 * @todo 将产品分给操作人所要用的显示的数据(这里可以让多个人同时拥有同一个产品) */public function ajax_product_list(){$msg_language = get_language();$adminId = $_SESSION['ADMIN_ID'];$prodtypeModule=module('prodtype');$module = module( 'GirdAjax' );$sql="SELECT a.*,b.CateName as CateName FROM `#__products` as aleft join `#__category` as b on a.CateId=b.ID where a.ID not in (select ProductId from `#__product_in_user` where AdminId = {$adminId}) :search order by :sort :order limit :start , :limit ";$count_sql = ' SELECT count(*)   FROM `#__products`  as a   left join `#__category` as b on a.CateId=b.ID where a.ID not in (select ProductId from `#__product_in_user` where AdminId = '.$adminId.')   :search ';$sql_search = ' WHERE :search_key like ":search_value" ';$module->SetSql( $sql );$module->SetCountSql( $count_sql );$module->SetSeachSql( $sql_search );$rs = $module->GetDatas();//debug($rs);$promotionUser=$_SESSION['ADMIN_ID'];///debug($rs['rows']);foreach ( $rs['rows'] as &$val ){$stock_idvalue=$val['NowAvgPrice']?$val['NowAvgPrice']/100: 0;$NowAvgPrice=!$val['NowAvgPrice']?0:price_format($val['NowAvgPrice']);$tmp_array = array('id' => $val['ID'],'cell' => array('<input type="checkbox" id="item" name="item" value="'.$val['ID'].'"/>',$val['ID'],$val['ProductName'],$val['CateName'],$val['ItemName'],'<img src="'.Images($val['PicPath_0']).'" width="120"/>','<input type="text" style="width:60px;" name="price" id="price'.$val['ID'].'" maxLength="8" value="'.price_format($val['Price']).'" onkeyup="clearNoNum(this)" />','<input type="text" style="width:250px;" maxLength="500" name="keywords" id="keywords'.$val['ID'].'" value="'.$val['Keywords'].'" />','<input name="button3" onclick="AddToUser(\''.get_url(array('m'=>'product','a'=>'addToUser','id'=>$val['ID'],'ebayPrice'=>"%price%",'keywords'=>"%keywords%")).'\''.','.$val['ID'].')" type="submit" class="BtnEdit" id="button3" value="add to me" />','<input type="hidden" name="id" id="id'.$val['ID'].'" value="'.$val['ID'].'" />',));$val = $tmp_array ;}exit( json_encode( $rs ) );}
这个是组装数据后通过flexigrid来生成的productInUser.php这个view层文件的。
<?php include_once(DOCUMENT_ROOT.'/view/public/header.inc') ?><?php include_once(DOCUMENT_ROOT.'/view/menu/admin.php'); ?><style><!--.LBCL{text-align:left;}.ajax_auto{background:none repeat scroll 0 0 #FFFFFF;border:0px solid #CBCBCB;font-family:Tahoma;width:100px;}--></style><div class="Container">    <div class="TableBox">    <div class="LBTR">        <div class="LBTL">            </div>        </div>        <div class="LBCR">        <div class="LBCL">             <div class="TableOutline">                            <table id="table1" style="display:none"></table>             </div>                </div>        </div>        <div class="LBBR">        <div class="LBBL"> </div>        </div></div>    </div></body><script src="/extend/js/functions.js" type="text/javascript"></script><script src="/extend/js/json.js" type="text/javascript"></script><script type="text/javascript" src="/extend/js/flexigrid.js" language="javascript"></script><link type="text/css" rel="stylesheet" href="/css/flexigrid/flexigrid.css" />  <script type="text/javascript">$("#table1").flexigrid({url: '<?php echo $ajax_url; ?>',dataType: 'json',colModel : [{display: '<?php echo $msg_language['table']['checkall']?>', name : 'Item', id:'item', width : 50, sortable : false, align: 'center'},{display: '<?php echo $msg_language['table']['no']?>', name : 'ID', width : 50, sortable : true, align: 'center'},{display: '<?php echo $msg_language['table']['prod_name']  ?>', name : 'ProductName', width : 250, sortable : true, align: 'center'},{display: '<?php echo $msg_language['product']['Cate']  ?>', name : 'CateName', width : 180, sortable : true, align: 'center'},{display: '<?php echo $msg_language['product']['ItemName'] ?>', name : 'ItemName', width : 50 , sortable : true, align: 'center'},{display: '<?php echo $msg_language['table']['image'] ?>', name : 'PicPath_0', width : 140 , sortable : false, align: 'center'},{display: '<?php echo $msg_language['table']['ebayPrice']; ?>', name : 'ebayPrice', width : 70 , sortable : false, align: 'center'},{display: '<?php echo $msg_language['table']['keywords']; ?>', name : 'keywords', width : 280 , sortable : false, align: 'center'},{display: '<?php echo $msg_language['btn']['action'] ?>', name : 'action', width : 200 , sortable : false, align: 'center'},],buttons : [//表格上面的按钮   {name: '<?php echo $msg_language['table']['checkall']?>', displayname: '<?php echo $msg_language['table']['checkall']?>', onpress:checkAll,id:checkAll},   {separator: true},            {name: '<?php echo $msg_language['table']['SelectInvert']?>', displayname: '<?php echo $msg_language['table']['SelectInvert']?>', onpress:checkAll},            {separator: true},            {name: '<?php echo $msg_language['table']['SelectToMe']?>', displayname: '<?php echo $msg_language['table']['SelectToMe']?>', onpress:allSelectedAdd}   ],searchitems : [{display: '<?php echo $msg_language['table']['prod_name']?>', name : 'ProductName'},{display: '<?php echo $msg_language['product']['ItemName']?>', name : 'ItemName'}],sortname: "ItemName",sortorder: "ASC",usepager: true,title: 'List',useRp: true,rp: 20,rpOptions: [10,20,50,100],showTableToggleBtn: true,width: 'auto',height: 470}); function checkAll(com,grid){if(com == 'check all'){$('.trSelected'.grid).removeClass('trSelected');$('tr',grid).addClass('trSelected');var items = document.getElementsByName('item');for(var i=0;i<items.length;i++){items[i].checked = true;}}else if(com == 'Select Invert'){$('.trSelected'.grid).removeClass('trSelected');var items = document.getElementsByName('item');for(var i=0;i<items.length;i++){if(items[i].checked == true){items[i].checked=false;}else{items[i].checked = true;}}}}function allSelectedAdd(){var items = document.getElementsByName('item');var prices = document.getElementsByName('price');var keywords = document.getElementsByName('keywords');var row = "";//var ids = "";//var price = "";for(var i=0;i<items.length;i++){if(items[i].checked == true){row = row+items[i].value +";"+ (100*prices[i].value) +";"+ keywords[i].value + "$";}}location.href='<?php echo $ajax_submit_url; ?>'.replace('%items%',row);}function AddToUser(url,id){var pid = 'price'+id;var kid = 'keywords'+id;var ebayPrice = document.getElementById(pid).value;var keywords = document.getElementById(kid).value;url = url.replace('%price%',ebayPrice*100);url = url.replace('%keywords%',keywords);if(confirm('你确定要添加到你的名下?')){location=url;}}function clearNoNum(obj){//先把非数字的都替换掉,除了数字和.obj.value = obj.value.replace(/[^\d.]/g,"");//必须保证第一个为数字而不是.obj.value = obj.value.replace(/^\./g,"");//保证只有出现一个.而没有多个.obj.value = obj.value.replace(/\.{2,}/g,".");//保证.只出现一次,而不能出现两次以上obj.value = obj.value.replace(".","$#$").replace(/\./g,"").replace("$#$",".");}</script>

这样的代码在windows下面是没有任何问题的。能正常运行。但是在linux里面呢?

linux里面也是运行了。下面这个是在linux里面运行的效果:

这个是在Windows下面运行的结果:

看到什么意思了吗?

linux里面把数据插入了两遍。顺便说下。这个表的结构是id的自增的唯一键。主键是ProductId和AdminId的组合键。刚刚好这个bug就钻了空子。AdminId两次插入的就刚好不一样。呵呵。我跟踪代码。数据也完全是对的。为什么会插入两遍呢?即使是插入两遍又为什么会将存到session中的AdminId值一次取到,一次取不到呢?为什么Windows又没有这个问题呢?为什么我一个单击事件却让代码执行了两次呢?为什么两次执行的结果又不一样呢?

这个问题出现时,我调试了一会就感觉要崩溃掉。因为数据获取是对的。用debug方式跟踪也是成功的。这样的问题怎么处理呢?搞死人啊!

因为debug方式跟踪不了。我就只有硬着头皮看代码咯!但是代码也没问题啊!要是有问题那Windows环境下也就不可能正常了啊!唉,还是看看代码吧:

我想,把代码里面一切有可能导致出问题的地方都改的无可挑剔。这样再看看:

这样改还真找到问题在哪里了,呵呵。不过什么原因导致的我却没有找到,希望大家也一起讨论下:

问题出在:

if($productInUserModel->productInUser_add($row)){
这样的代码里面。

我改为:

$result=$productInUserModel->productInUser_add($row);
            if($result){}

这样的形式。再次运行,完全正常了。呵呵。

所以,建议大家以后不要再这样写代码了。虽然这样写很多人都觉得逻辑性严谨,很牛,给人感觉写代码很高手,但是今天碰到这样的问题,就有点卖弄不成反被玩一样的感觉。呵呵!

希望大家一起讨论啊!这个linux和Windows之间的这个异常情况。这个也可能是PHP,javascript,flexigrid,ajax这些知识和系统环境之间的依存关系。等等。期待大家的答案。我也会后续跟进这个bug的深究的。

原创粉丝点击