開発中、技術的な詳細を忘れてしまう可能性があります。これらの詳細は、Web サイトへのインジェクション、Web サイトのクラッシュなどの重大な結果を引き起こす可能性があります。ここで、遭遇する可能性のある PHP の「罠」をいくつかまとめてみましょう。
トラップ 1: empty()
<?php //以下代码会直接导致PHP解析错误 $arr1 = [1, 2, 3]; $arr2 = [3, 4]; if(empty(array_diff($arr1, $arr2))) { //解析错误 echo 'empty'; } else { echo 'not empty'; }
最新の公式 Web サイトのマニュアルには、これに関する特別な指示があります:
注:
在 PHP 5.5 之前,empty() 仅支持变量;任何其他东西将会导致一个解析错误。
つまり、次のコードは有効になりません: empty(trim ($name)) 。 代わりに、trim($name) == false を使用する必要があります。私が最後にこのエラーに遭遇したのは、Phalcon で開発していたときでした。最初は、それらを除外した後、不可解に感じました。この行は、empty の誤った使用が原因で発生しました。もちろん、PHP 5.5 以降、empty はこの記述方法をサポートしています。
<?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,此结果明显错误
<?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 チュートリアルに興味のある友人に役立つことを願っています。