1. Win32下apache2用get方法传递中文参数会出错
test.php?a=你好&b=你也好
传递参数是会导致一个内部错误
解决办法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)
2. win32下的session不能正常工作
php.ini默认的session.save_path = /tmp 这显然是linux下的配置,win32下php无法读写session文件导致session无法使用,把它改成一个绝对路径就可以了,
例如session.save_path = c:/windows/temp
3. include和require的区别
两者没有太大的区别,如果要包含的文件不存在, include提示notice,然后继续执行下面的语句,require提示致命错误并且退出,据我测试,win32平台下它们都是先包含后执行,所以被包含文件里最好不要再有include或require语句,这样会造成目录混乱。
4. isset()和empty()的区别
两者都是测试变量用的。但是 isset()是测试变量是否被赋值,而empty()是测试一个已经被赋值的变量是否为空。如果一个变量没被赋值就引用在php里是被允许的,但会有 notice提示。如果一个变量被赋空值,$foo=""或者$foo=0或者 $foo=false,那么empty($foo)返回真,isset($foo)也返回真,就是说赋空值不会注销一个变量。
要注销一个变量,可以用 unset($foo)或者$foo=NULL。
5. mysql查询语句包含有关键字
php查询mysql的时候,有时候mysql表名或者列名会有关键字。这时候查询会有错误。例如表名是order,查询时候会出错。简单的办法是sql语句里表名或者列名加上`[tab键上面]来加以区别, 这样就不会因为误用关键字而出现错误。
例如select * from `order` 。
6. 数组非数字键名引号的必要性
PHP 会把数组中非数字键名没有引号引起来的键名当作是常量去获取, 当找不到的时候, 抛出一个NOTICE(Notice: Use of undefined constant ......), 然后再根据”常量名”生成一个字符串, 数组中的非数字键的键名一定要有引号,在字符串变量替换的时候, 写引号会导致错误, 虽然这种错误提示可以通过 error_reporting()进行屏蔽,但好的程序,自适应的代码是不应该通过这种方法进行伪装的。标准写法:
$array[1] = 'abc';
$array['key'] = 2; Bad: $array[key] = 2;
$string = "variable value is {$array['key']}"
另:在非数字键名不加引号的生成OPCODE中明显多一条指令:FETCH_CONSTANT
7. 使HTML/PHP格式的字符串如何照原样显示
如:
<?PHP
$str="<a href='http://www.csdn.net'>HTML</a>";
echo "被解释处理过的: ".$str;
echo htmlentities(nl2br($str));
?>
8. 一切写入数据库中的数据都应该进行必要的验证和过滤
写入前
$string = addslashes($string);
INSERT TABLE SQL
读取时
$string = stripslashes($string);
显示时
$string = htmlspecialchars(nl2br($string))
9. PHP文件中的结尾符号 ?>
在文件中 ?> 结尾符号它不是必需的。有时就可以不必要加上,这样可以避免产生一些难于调试的错误问题。例如,在使用header()函数来重定向(redirect)时,如果在其前面某个包含文件中 ?> 后面不小心加上了空格就会出现错误。
10. 正则表达式URL 我在项目常用到的
$link = "A http://p.you.video.sina.com.cn/player/outer_player.swf?auto=1&vid=25542767&uid=1154209371 asdf/asd.sdf http://www.s.flash你好 asdfas./asd.sd http://bbs.400.com.cn/gg/wjdpy.mp3 http://p.you.video.sina.com.cn/player/outer_player.swf?auto=1&vid=25542767&uid=1154209371";
$pattern = "/(https{0,1}:[a-zA-Z0-9_/-]+/.[a-zA-Z0-9_/-/./%/?=///&/+#]+)/";
preg_match_all($pattern, $link, $matches);
print_r($matches[0]);
结果:Array ( [0] => http://p.you.video.sina.com.cn/player/outer_player.swf?auto=1&vid=25542767&uid=1154209371 [1] => http://www.s.flash [2] => http://bbs.400.com.cn/gg/wjdpy.mp3 [3] => http://p.you.video.sina.com.cn/player/outer_player.swf?auto=1&vid=25542767&uid=1154209371 )
11. PHP中的JSON数据存储格式
在非UTF-8编码下,中文字符将不能被json_encode,否则结果会是空值。所以,如果你使用gb2312编写PHP代码,那么就需要将包含中文的内容使用iconv或者mb转为UTF-8再进行json_encode。
1. Win32下apache2用get方法传递中文参数会出错
test.php?a=你好&b=你也好
传递参数是会导致一个内部错误
解决办法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)
2. win32下的session不能正常工作
php.ini默认的session.save_path = /tmp 这显然是linux下的配置,win32下php无法读写session文件导致session无法使用,把它改成一个绝对路径就可以了,
例如session.save_path = c:/windows/temp
3. include和require的区别
两者没有太大的区别,如果要包含的文件不存在, include提示notice,然后继续执行下面的语句,require提示致命错误并且退出,据我测试,win32平台下它们都是先包含后执行,所以被包含文件里最好不要再有include或require语句,这样会造成目录混乱。
4. isset()和empty()的区别
两者都是测试变量用的。但是 isset()是测试变量是否被赋值,而empty()是测试一个已经被赋值的变量是否为空。如果一个变量没被赋值就引用在php里是被允许的,但会有 notice提示。如果一个变量被赋空值,$foo=""或者$foo=0或者 $foo=false,那么empty($foo)返回真,isset($foo)也返回真,就是说赋空值不会注销一个变量。
要注销一个变量,可以用 unset($foo)或者$foo=NULL。
5. mysql查询语句包含有关键字
php查询mysql的时候,有时候mysql表名或者列名会有关键字。这时候查询会有错误。例如表名是order,查询时候会出错。简单的办法是sql语句里表名或者列名加上`[tab键上面]来加以区别, 这样就不会因为误用关键字而出现错误。
例如select * from `order` 。
6. 数组非数字键名引号的必要性
PHP 会把数组中非数字键名没有引号引起来的键名当作是常量去获取, 当找不到的时候, 抛出一个NOTICE(Notice: Use of undefined constant ......), 然后再根据”常量名”生成一个字符串, 数组中的非数字键的键名一定要有引号,在字符串变量替换的时候, 写引号会导致错误, 虽然这种错误提示可以通过 error_reporting()进行屏蔽,但好的程序,自适应的代码是不应该通过这种方法进行伪装的。标准写法:
$array[1] = 'abc';
$array['key'] = 2; Bad: $array[key] = 2;
$string = "variable value is {$array['key']}"
另:在非数字键名不加引号的生成OPCODE中明显多一条指令:FETCH_CONSTANT
7. 使HTML/PHP格式的字符串如何照原样显示
如:
<?PHP
$str="<a href='http://www.csdn.net'>HTML</a>";
echo "被解释处理过的: ".$str;
echo htmlentities(nl2br($str));
?>
8. 一切写入数据库中的数据都应该进行必要的验证和过滤
写入前
$string = addslashes($string);
INSERT TABLE SQL
读取时
$string = stripslashes($string);
显示时
$string = htmlspecialchars(nl2br($string))
9. PHP文件中的结尾符号 ?>
在文件中 ?> 结尾符号它不是必需的。有时就可以不必要加上,这样可以避免产生一些难于调试的错误问题。例如,在使用header()函数来重定向(redirect)时,如果在其前面某个包含文件中 ?> 后面不小心加上了空格就会出现错误。
10. 正则表达式URL 我在项目常用到的
$link = "A http://p.you.video.sina.com.cn/player/outer_player.swf?auto=1&vid=25542767&uid=1154209371 asdf/asd.sdf http://www.s.flash你好 asdfas./asd.sd http://bbs.400.com.cn/gg/wjdpy.mp3 http://p.you.video.sina.com.cn/player/outer_player.swf?auto=1&vid=25542767&uid=1154209371";
$pattern = "/(https{0,1}:[a-zA-Z0-9_/-]+/.[a-zA-Z0-9_/-/./%/?=///&/+#]+)/";
preg_match_all($pattern, $link, $matches);
print_r($matches[0]);
结果:Array ( [0] => http://p.you.video.sina.com.cn/player/outer_player.swf?auto=1&vid=25542767&uid=1154209371 [1] => http://www.s.flash [2] => http://bbs.400.com.cn/gg/wjdpy.mp3 [3] => http://p.you.video.sina.com.cn/player/outer_player.swf?auto=1&vid=25542767&uid=1154209371 )
11. PHP中的JSON数据存储格式
在非UTF-8编码下,中文字符将不能被json_encode,否则结果会是空值。所以,如果你使用gb2312编写PHP代码,那么就需要将包含中文的内容使用iconv或者mb转为UTF-8再进行json_encode。