您的位置:首页 > 运维架构 > Linux

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

2012-03-28 14:25 1051 查看
今天在做一个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 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的深究的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐