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入门学习的几个不错的实例代码
Jul 13 PHP
PHP 金额数字转换成英文
May 06 PHP
php file_exists 检查文件或目录是否存在的函数
May 10 PHP
获取URL文件名后缀
Oct 24 PHP
php实现mysql封装类示例
May 07 PHP
五款PHP代码重构工具推荐
Oct 14 PHP
php判断类是否存在函数class_exists用法分析
Nov 14 PHP
php模仿asp Application对象在线人数统计实现方法
Jan 04 PHP
PHP6新特性分析
Mar 03 PHP
Yii调试查看执行SQL语句的方法
Jul 15 PHP
php实现的读取CSV文件函数示例
Feb 07 PHP
php进程daemon化的正确实现方法
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动态创建Flash动画
2006/10/09 PHP
php中序列化与反序列化详解
2017/02/13 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
基于jquery编写分页插件
2016/03/07 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
浅析Python编写函数装饰器
2016/03/18 Python
flask入门之表单的实现
2018/07/18 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
超简单使用Python换脸实例
2019/03/27 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
美国鲜花递送:UrbanStems
2021/01/04 全球购物
妇科医生自荐信
2013/11/05 职场文书
副总经理工作职责
2013/11/28 职场文书
元旦寄语大全
2014/04/10 职场文书
个性婚礼策划方案
2014/05/17 职场文书
东京审判观后感
2015/06/01 职场文书
公司转让协议书
2016/03/19 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers
mysql如何查询连续记录
2022/05/11 MySQL
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS