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 相关文章推荐
PHP文件下载类
Dec 06 PHP
php 生成静态页面的办法与实现代码详细版
Feb 15 PHP
php小偷相关截取函数备忘
Nov 28 PHP
50个PHP程序性能优化的方法
Jun 02 PHP
PHP中定义数组常量(array常量)的方法
Nov 17 PHP
PHP中round()函数对浮点数进行四舍五入的方法
Nov 19 PHP
php检测url是否存在的方法
Apr 14 PHP
php实现的操作excel类详解
Jan 15 PHP
Thinkphp 中 distinct 的用法解析
Dec 14 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
Apr 04 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
Jan 10 PHP
Laravel框架中缓存的使用方法分析
Sep 06 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
用php过滤危险html代码的函数
2008/07/22 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
php日历制作代码分享
2014/01/20 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
jQuery代码优化 遍历篇
2011/11/01 Javascript
jQuery中Ajax的load方法详解
2015/01/14 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
微信小程序封装http访问网络库实例代码
2017/05/24 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
python动态性强类型用法实例
2015/05/09 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
详解Django配置JWT认证方式
2020/05/09 Python
Python3爬虫中pyspider的安装步骤
2020/07/29 Python
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
意大利婴儿产品网上商店:Mukako
2018/10/14 全球购物
企业管理专业个人求职信范文
2013/09/24 职场文书
活动邀请函范文
2014/01/19 职场文书
《小猪家的桃花树》教学反思
2014/04/11 职场文书
创意婚礼策划方案
2014/05/18 职场文书
延安红色之旅心得体会
2014/10/07 职场文书
Python requests用法和django后台处理详解
2022/03/19 Python