2016-1-17 博客文章增加了markdown格式,由MD标记

2016-04-27 00:29:00

代码越亲自敲得多,才越发现原本从来都不是问题的,突然哪一天就成了坑,导致掉进去半天起不来。码农的生活,就是填平前人的坑,然后不自觉的继续挖坑,然后又继续填坑。本篇主要记录自我挖坑的详细经历,之所以会挖坑,应该还是归结于平常不够体察入微吧。


坑1:

html提交表单元素,name值为数组的情况,key值如何写。

开发盘点库存功能时,批量修改产品库存,表单元素就写成如下:

<input type="text"  class="change_stock" maxlength=6
      name="products[<?php echo $val['id']?>]['change_stock']"  value=""  />

你要是经历过,想必一眼就能猜出我下面将要说什么。

上面代码导致我用PHP怎么都接收不了填的表单值,后面仔细看post数据dump出来的结果,形如

["products"]=>
  array(2) {
    [1234]=>
    array(1) {
      [""change_stock""]=>string(0) ""
    }
    [1235]=>
    array(1) {
      [""change_stock""]=>string(0) ""
    }
  }
其中[""change_stock""]是导致我无法获取表单值的罪魁。

收获:html表单元素为数组情况时,key值不能再加单引号或双引号。


坑2:

0与空字符串的区别。

这个其实可以算是古老得不能再古老的问题啦,可偏偏稍不注意就栽了跟头。先再次实践总结下:

""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的

empty() 只检测变量,检测任何非变量的东西都将导致解析错误。换句话说,后边的语句将不会起作用:       
empty(addslashes($name))。
"" == 0 == "0" == NULL == FALSE

盘点时,只改保质期,则库存不变。判断有无填写值,其中主要就是注意0和空字符串的情况。判断有无填写值,本来直接用===来判断空字符串即可,谁料自己横生枝节,写成如下:

(empty($item['change_stock']) && 0 !== intval($item['change_stock']))

其中盲点就是intval对字符串的处理。该知识点跟文章PHP的诡异与我有太多的约会里的怪异行为一的实质其实是一样的。


坑3:

超链接元素写在button标签里。

收获:a标签写在button里,在firefox下会导致超链接点击无效。但在chrome里无此问题。为了更好的兼容,就不要把a标签写在button里。


坑4:

get提交数据,不能获取。

post和get请求的区别,也了解好多次了。主要也就记得两点:post比get更安全及post提交数据长度比get可提交的最大数据长度大。这里就将说明另外一个区别。

表单用的get方式,搜索第二个站点的订单,却总是返回第一个站点的订单。表单代码大致如下:

<form action="list_orderManage.php?site=2" method="get" >
<!--省略-->
</form>

如上方式提交请求,$_REQUEST并不能获取site参数的数据。

收获:get方式提交数据时,表单action的url接参数是无意义的。post方式提交数据时,表单action的url里接参数,可以通过get方式获取。如上问题解决方法就是把site值存在form表单里hidden类型的input元素里。

<form action="list_orderManage.php" method="get" >
<input type="hidden" name="siteid" value="<?php echo $site; ?>" />
<!--省略-->
</form>


坑5:

用json_decode时,千万不要忘记第二个参数。这个问题,本人在写代码时总是一不注意就疏忽了第二个参数,从而导致程序出错。次数实在太多,特记于此,希望能提高自己的注意。

Error:Cannot use object of type stdClass as array
json_decode() second parameter needs to be true,then returns an array.


坑6:

 unserialize(): Error at offset 147 of 279 bytes。

遇到这种错误,还是放弃使用unserialize函数吧。多少是因为字符编码或者单双引号引起的,常常去找错误原因,这函数的使用就已经失去了意义。数据大多整形或不复杂时比较适合用此函数。不适合时就用json_encode函数吧。