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 05 PHP
PHP输出XML到页面的3种方法详解
Jun 06 PHP
用PHP代替JS玩转DOM的思路及示例代码
Jun 15 PHP
typecho插件编写教程(五):核心代码
May 28 PHP
PHP的文件操作与算法实现的面试题示例
Aug 10 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
Nov 05 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
Nov 09 PHP
Symfony2实现在doctrine中内置数据的方法
Feb 05 PHP
PHP实现数据分页显示的简单实例
May 26 PHP
yii2.0实现创建简单widgets示例
Jul 18 PHP
thinkphp框架类库扩展操作示例
Nov 26 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 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
实现dedecms全站URL静态化改造的代码
2007/03/29 PHP
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
eaglephp使用微信api接口开发微信框架
2014/01/09 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
微信公众平台开发教程②微信端分享功能图文详解
2019/04/10 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
2019/06/17 PHP
JavaScript中使用正则匹配多条,且获取每条中的分组数据
2010/11/30 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
原生js实现贪吃蛇游戏
2020/10/26 Javascript
python的dataframe和matrix的互换方法
2018/04/11 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
python实现动态数组的示例代码
2019/07/15 Python
python 画函数曲线示例
2019/12/04 Python
Pycharm+Python工程,引用子模块的实现
2020/03/09 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
俄罗斯第一家多品牌在线奢侈品精品店:Aizel.ru
2020/09/06 全球购物
学校爱心捐款倡议书
2014/05/13 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
物业工程部岗位职责
2015/02/11 职场文书
小学生学习保证书
2015/02/26 职场文书
高三物理教学反思
2016/02/20 职场文书
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle