这两个方法作用差不多,但是使用时建议用PDOStatement::bindValue()。这两个方法的声明如下:
boolPDOStatement::bindValue (mixed$parameter , mixed$value [,int$data_type = PDO::PARAM_STR ] )
boolPDOStatement::bindParam (mixed$parameter , mixed&$variable [,int$data_type = PDO::PARAM_STR [,int$length [,mixed$driver_options ]]] )
可以看出bindParam方法的第二个参数是个引用,一不注意就用错了,特别是foreach循环里使用bindParam很容易出错。
(2)在php使用正则表达式时的一点注意
注意模式串的书写,例如:preg_match("/<buy_nick>test_nick</buy_nick>/",$content,$match);这样是匹配不到你需要的字符串的,因为模式串只会识别到“/<buy_nick>test_nick</”这个字符串,而后面"buy_nick>/"都识别不到,php会报一个警告,说第2个'/'后的'b'字符无法识别。模式串一般是用'/'包含起来,所以才会出现上面的问题。把'/'转义一下就可以解决这个问题了,即:preg_match("/<buy_nick>test_nick<\\/buy_nick>/",$content,$match);
还有一个更简单的方法:
preg_match("/<buy_nick>test_nick</buy_nick>/",$content,$match);
改成:
preg_match("#<buy_nick>test_nick</buy_nick>#",$content,$match);
虽然在php的模式串经常使用“/”作为起始符,其实用其他字符也可以的,例如“#”。
(3)filter_input (int$type ,string$variable_name [, int$filter = FILTER_DEFAULT [,mixed$options ]] )
这个函数不太好用,建议用$_GET,$_POST,$_SERVER等
(4)php代码结尾?>之后最好不要有空行,容易导致其他文件包含此文件后在输出时多了空行;或者代码结尾处不写?>
(5)数组相加和数组合并的区别
$arr = array("key"=>"value",1=>"a"); $arr2 = array("key"=>"value2",1=>"b"); var_export($arr+$arr2); var_export(array_merge($arr,$arr2));
array ( 'key' => 'value', 1 => 'a', )array ( 'key' => 'value2', 0 => 'a', 1 => 'b', )
使用“+”号运算符的数组相加:如果输入的数组中相同的字符串键名或者数字键名,都不会覆盖原来的值,并且忽略
使用array_merge函数:如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面;
array_merge的另一个值得注意的地方是:如果数组是数字索引的,则键名会以连续方式重新索引。如下所示:
$arr = array("111"=>1,222=>2); $arr2 = array("333"=>3,444=>4); var_export(array_merge($arr,$arr2));
array ( 0 => 1, 1 => 2, 2 => 3, 3 => 4, )
(6)浮点数运算时建议用BCMATH扩展里的函数,BCMATH是一个支持任意精度的数学库。
BCMATH扩展里有以下常用的函数:
string bcadd ( string$left_operand ,string$right_operand [,int$scale ] ) --加法
string bcsub ( string$left_operand ,string$right_operand [,int$scale ] ) --减法
string bcmul ( string$left_operand ,string$right_operand [,int$scale ] ) --乘法
string bcdiv ( string$left_operand ,string$right_operand [,int$scale ] ) --除法
int bccomp ( string$left_operand ,string$right_operand [,int$scale ] ) --比较大小
BCMATH扩展的文档:http://www.php.net/manual/en/ref.bc.php
(7)使用strtotime()函数时需要注意传递的日期不能太大
例如
var_dump(strtotime("2021-11-12 00:00:00")); var_dump(strtotime("2061-11-12 00:00:00"));
int(1636646400) bool(false)
为什么第二个转换失败了呢?首先先看strtotime()函数的定义:
int strtotime (string $time [, int $now ] )
可以看出返回值是int,32位的环境下int最大能表示为2147483647,而自 January 1 1970 00:00:00 GMT 起到2061-11-12 00:00:00的秒数已经超过php里int的表示范围了,所以返回false