php开发时容易忘记的一些技术细节


Posted in PHP onFebruary 03, 2016

在做开发的时候,有可能会忘记掉一些技术细节。这些细节有可能会造成很严重的后果,比如网站被注入、网站崩溃等等。现在我们总结一下,有可能会遇到的一些 PHP 中的一些 “陷阱”。

陷阱一:empty()

<?php
//以下代码会直接导致PHP解析错误
$arr1 = [1, 2, 3];
$arr2 = [3, 4];
if(empty(array_diff($arr1, $arr2))) { //解析错误
  echo 'empty';
} else {
  echo 'not empty';
}

最新的官网手册对此有特别说明:

Note:

在 PHP 5.5 之前,empty() 仅支持变量;任何其他东西将会导致一个解析错误。

换言之,下列代码不会生效: empty(trim($name))。 作为替代,应该使用trim($name) == false.
我最近一次遇到该错误,是使用 Phalcon 开发的时候,服务器一直报 503 错误,刚开始会觉得莫名其妙,通过逐行排除,才发生由于 empty 的错误用法导致的。当然,自从 PHP 5.5 开始,empty 已经支持这种写法了。

陷阱二:in_array()

<?php
//判断数组里是否存在用户所提交的用户 ID
//$post_dirty_id = '1092';
$post_dirty_id = '1092 ORDER BY #1';
$safe_arr = [
  987 => '小明',
  1092 => '汤姆',
  1256 => '奥立升'
];
if(in_array($post_dirty_id, array_keys($safe_arr))) {
  echo 'find me';
} else {
  echo 'do not find me';
}
//输出结果:find me,此结果明显错误

我发现这个问题,是因为网站被 SQL 注入了,还好,那么时候在测试的时候发现的,没有造成严重的后果。

关于 in_array() 函数使用,还有其他值得我们注意的地方,PHP 手册中,有大量的网友提供的示例,来说明该函数的“怪异”行为,比如:

<?php
 $a = ['a', 32, true, 'x' => 'y'];
 var_dump(in_array(25, $a)); // true, one would expect false
 var_dump(in_array('ggg', $a)); // true, one would expect false
 var_dump(in_array(0, $a)); // true
 var_dump(in_array(null, $a)); // false

为了安全起见,建议可以采用下面这种方式进行判断:

<?php
//判断数组里是否存在用户提交的 ID
//$post_dirty_id = '1092';
$post_dirty_id = '1092 ORDER BY #1';
$safe_arr = [
  987 => '小明',
  1092 => '汤姆',
  1256 => '奥立升'
];
if(isset($safe_arr[$post_dirty_id])) {
  echo 'find me';
} else {
  echo 'do not find me';
}
//输出结果:do not find me,这是正确的结果
PHP 相关文章推荐
PHP5中使用DOM控制XML实现代码
May 07 PHP
php数字转汉字代码(算法)
Oct 08 PHP
php流量统计功能的实现代码
Sep 29 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
Feb 02 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
May 15 PHP
thinkphp实现数组分页示例
Apr 13 PHP
Yii使用find findAll查找出指定字段的实现方法
Sep 05 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
Smarty模板变量调节器用法分析
May 23 PHP
详解PHP中foreach的用法和实例
Oct 25 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
Sep 30 PHP
php查看一个变量的占用内存的实例代码
Mar 29 PHP
PHP简单处理表单输入的特殊字符的方法
Feb 03 #PHP
PHP实现的构造sql语句类实例
Feb 03 #PHP
PHP快速生成各种信息提示框的方法
Feb 03 #PHP
PHP实现原比例生成缩略图的方法
Feb 03 #PHP
PHP获取昨天、今天及明天日期的方法
Feb 03 #PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 #PHP
PHP开发中常用的十个代码样例
Feb 02 #PHP
You might like
封装一个PDO数据库操作类代码
2009/09/09 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
关于PHP自动判断字符集并转码的详解
2013/06/26 PHP
修改WordPress中文章编辑器的样式的方法详解
2015/12/15 PHP
js对象的构造和继承实现代码
2010/12/05 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
JS delegate与live浅析
2013/12/21 Javascript
jQuery .tmpl() 用法示例介绍
2014/08/21 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
2016/06/13 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
微信小程序开发之入门实例教程篇
2017/03/07 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
2018/03/21 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
vue中动态select的使用方法示例
2019/10/28 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
2019/12/09 Javascript
python 图片验证码代码分享
2012/07/04 Python
Python随机生成彩票号码的方法
2015/03/05 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
python实现斗地主分牌洗牌
2020/06/22 Python
解决python3输入的坑——input()
2020/12/05 Python
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
特步官方商城:Xtep
2017/03/21 全球购物
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
Internet体系结构
2014/12/21 面试题
自学考试自我鉴定范文
2013/09/26 职场文书
《在大海中永生》教学反思
2014/02/24 职场文书
电子专业自荐信
2014/07/01 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
jQuery实现广告显示和隐藏动画
2021/07/04 jQuery
SQLServer之常用函数总结详解
2021/08/30 SQL Server