今天老大刚到公司,过了以后就把我叫过去说:“客户发邮件说,昨天做的那个订单详情导出功能,商品信息是累加的。。。。。。”。
猜想,出现这个问题的原因可能是因为在循环里面没有清空上次循环遗留下来的数据。
查看了下源代码,果然不出所料,就是因为用于存储商品信息的字符串没有在使用前先声明为$pInfo = '',而是直接的$pInfo .= $product;(因为php的变量可以不声明而直接使用的)。这就导致了,第二次循环的时候,$pInfo会接着上次的$pInfo拼接起来。
同理,还容易出现错误的就是:在循环中使用数组的时候。
比如,需要使用一个数组存储信息,如果不事先把变量$arr声明为空数组array(),而直接直接 $arr[] = $arrInfo,也会出现多余数组元素的问题。
所以,在使用循环的时候,以后就需要注意了。。。
为了避免上面的问题,最简单有效的方式是:在使用一个变量之前先进行声明并初始化。
其实,昨天在完成那个“订单详情导出”功能的时候 还出现了一个问题。
当管理员权限后台所有的订单(大约有4900多条记录)执行导出操作的时候,生成的是xls文件只有表头和一句话(原话忘记了,反正意思就是可用内存不足)。
原因是什么哪? 就是因为 我把 所有的订单详情信息都放在一个数组$list中,然后一次性写入到xls文件中。问题出来了就要解决,总不能老是让客户20条20条的往外导数据吧??
应该怎么解决?
问题其实很简单,既然不能把所有订单详情信息内容放在一个array中一次性的写入文件,那么我们就一条记录一条记录的写入文件。
以前的实现方式为
1 function exportOrderDetail(){
2
3 ......
4
5 ......
6
7 ......
8
9 $list = array();//用于存放订单详情数据
10
11 foreach($_POST['order_id'] as $order_id) {
12
13 $orderInfo = getOrderInfo($order_id);
14
15 $orderInfo['xx'] = getXXByOrder($order_id);
16
17 $orderInfo['yy'] = getYYByOrder($order_id);
18
19 $orderInfo['zz'] = getZZByOrder($order_id);
20
21 ...
22
23 ...
24
25 ...
26
27 $list[] = $orderInfo; //将订单信息放入数组中
28
29 }
30
31 exportXls($list);//往xls文件中写入内容
32
33 ......
34
35 ......
36
37 ......
38
39 }
相信大家都已经看出问题所在了,如果订单的数量足够大的话,$list数组就会表的足够的,从而导致内存不足的问题。
问题已经找到了,那么应该怎么解决那?
其实很简单。直接将 31行的exportXls($list)放到foreach内部,同时,将原来foreach中的$list[] = $orderInfo 修改为$list = array($orderInfo); 即可。
上面是我这2天做项目的时候,因为没注意出现的问题,今天贴上以此为戒。。。