工作中遇到的一个相当有意思的问题(关于Windows和linux环境下执行PHP,ajax,javascript,flexigrid的一个莫名异常)
2012-03-28 14:25
1051 查看
今天在做一个PHP的程序时碰到这样的问题:product.php(control层文件):
这里,我代码是这样写的。然后这个方法是由
这样的代码在windows下面是没有任何问题的。能正常运行。但是在linux里面呢?
linux里面也是运行了。下面这个是在linux里面运行的效果:
这个是在Windows下面运行的结果:
看到什么意思了吗?
linux里面把数据插入了两遍。顺便说下。这个表的结构是id的自增的唯一键。主键是ProductId和AdminId的组合键。刚刚好这个bug就钻了空子。AdminId两次插入的就刚好不一样。呵呵。我跟踪代码。数据也完全是对的。为什么会插入两遍呢?即使是插入两遍又为什么会将存到session中的AdminId值一次取到,一次取不到呢?为什么Windows又没有这个问题呢?为什么我一个单击事件却让代码执行了两次呢?为什么两次执行的结果又不一样呢?
这个问题出现时,我调试了一会就感觉要崩溃掉。因为数据获取是对的。用debug方式跟踪也是成功的。这样的问题怎么处理呢?搞死人啊!
因为debug方式跟踪不了。我就只有硬着头皮看代码咯!但是代码也没问题啊!要是有问题那Windows环境下也就不可能正常了啊!唉,还是看看代码吧:
我想,把代码里面一切有可能导致出问题的地方都改的无可挑剔。这样再看看:
这样改还真找到问题在哪里了,呵呵。不过什么原因导致的我却没有找到,希望大家也一起讨论下:
问题出在:
我改为:
$result=$productInUserModel->productInUser_add($row);
if($result){}
这样的形式。再次运行,完全正常了。呵呵。
所以,建议大家以后不要再这样写代码了。虽然这样写很多人都觉得逻辑性严谨,很牛,给人感觉写代码很高手,但是今天碰到这样的问题,就有点卖弄不成反被玩一样的感觉。呵呵!
希望大家一起讨论啊!这个linux和Windows之间的这个异常情况。这个也可能是PHP,javascript,flexigrid,ajax这些知识和系统环境之间的依存关系。等等。期待大家的答案。我也会后续跟进这个bug的深究的。
/** * @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 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 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的深究的。
相关文章推荐
- 关于在PHP增删改查里面遇到的insert无法执行的问题
- windows下安装集成php开发环境以及可能遇到的问题
- 开发中遇到的一个关于 SQL 语句执行的问题
- 小试牛刀,学习PHP过程中关于环境配置的一个问题
- 阿里云linux下配置php服务器环境,及遇到的问题解决方法
- Windows下写shell脚本到Linux下执行遇到的问题及解决方案
- PHP代码从Windows环境迁移到linux环境下问题
- 关于php页面最大执行时间问题(set_time_limit函数在windows下不起作用的解决)
- ######crm01_最快速:搭建纯注解ssh整合环境(只用一个Spring配置)素材提供jar包,只有两步工作:①写Spring配置②写ssh注解+简单逻辑=遇到action创建失败问题
- php关于使用iconv(...)函数对字符进行中文转换时,遇到的一个问题
- 关于php页面最大执行时间问题(set_time_limit函数在windows下不起作用的解决)
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- 关于在Linux环境下使用CUnit的遇到的问题总结
- Linux访问Windows共享文件夹,关于mount cifs的一个问题
- Linux访问Windows共享文件夹,关于mount cifs的一个问题
- Linux mount Windows目录遇到 write-protected 问题 及 一个屌丝的逆袭
- Linux访问Windows共享文件夹,关于mount cifs的一个问题
- 遇到一个很有趣的问题,while(ture)或者for循环出现异常,继续执行还是跳出异常
- 关于php页面最大执行时间问题(set_time_limit函数在windows下不起作用的解决)
- 工欲善其事,必先利其器。一个强大的开发环境可以大大提高工作效率。好吧,我知道这是废话。。。不过,我想一定有很多跟我一样打算进入Linux平台开发的新手,一开始都为找不到一个像Windows下的VS那样