首頁  >  文章  >  後端開發  >  php開發時容易忘記的一些技術細節

php開發時容易忘記的一些技術細節

WBOY
WBOY原創
2016-07-29 09:04:13892瀏覽

在做開發的時候,有可能會忘記一些技術細節。這些細節有可能造成很嚴重的後果,例如網站被注入、網站崩潰等等。現在我們總結一下,有可能會遇到的一些 PHP 中的一些 “陷阱”。

陷阱一:empty()

<&#63;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() 仅支持变量;任何其他东西将会导致一个解析错误。

Note:

<&#63;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,此结果明显错误

換言之,下列代碼。 作為替代,應該使用trim($name) == false.

我最近一次遇到該錯誤,是使用Phalcon 開發的時候,伺服器一直報503 錯誤,剛開始會覺得莫名其妙,透過逐行排除,才發生由於empty 的錯誤用法所導致的。當然,自從 PHP 5.5 開始,empty 已經支持這種寫法了。

陷阱二:in_array()

<&#63;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

我發現這個問題,是因為網站被 SQL 注入了,還好,那麼時候在測試的時候發現的,沒有造成嚴重的後果。

關於in_array() 函數使用,還有其他值得我們注意的地方,PHP 手冊中,有大量的網友提供的示例,來說明該函數的「怪異」行為,例如:

<&#63;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,这是正确的结果

為了安全起見,建議可以採用以下這種方式來判斷:

rrreee🎜 🎜 以上就介紹了php開發時容易忘記的一些技術細節,包括了方面的內容,希望對PHP教程有興趣的朋友有幫助。 🎜 🎜 🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn