今天在博客园上看到一篇文章,其中有一段是介绍如何改进以下的这行php代码。这段代码经常被他们用来测试应聘者。 CODE: <? echo("<p>Search results for query: " .$_GET['query'] . ".</p>"); ?> 我觉得这段代码非常适合用来测试一个php开发人员是否合格。因为这段代码并没有要求太多记忆上的东西(例如函数的记忆),但是对安全,性能,兼容性上都做了考察。 大家也想想看如何改进代码。我在后面给出修改后的代码。 CODE: <?php if (isset($_GET['query'])) { echo '<p>Search results for query: ', htmlspecialchars($_GET['query'], ENT_QUOTES), '.</p>'; } ?>
改进的地方有 :
1.把php短标签(<?)换成了长标签(<?php),因为并非所有php环境都支持短标签
2.增加判断该全局变量是否存在,防止在某些环境下出现notice错误,而且在当前的例子里如果query无则没必要输出
3.把echo的”(”去掉,echo不是一个函数,没必要使用“(”
4.把字符串两边的双引号换成了单引号,提高了性能。因为双引号里的内容会被尝试进行变量和转义字符的解析。
5.对query这个get变量进行html过滤。防止输出html,这可能会带来包括xss在内的一些危险
6.echo后面的字符串之间的间隔使用逗号而不是句号。因为句号之间的字符串会先被连接起来然后再输出,而,号只是按顺序输出。在这个例子里显然不需要先连接字符串。
<?php var_dump(empty(''));//true var_dump(empty(' '));//false var_dump(empty(0));//true var_dump(empty(NULL));//true var_dump(empty('NULL'));//false var_dump(empty(FALSE));//true var_dump(empty('FALSE'));//false var_dump(empty(array()));//true var_dump(empty([]));//true var_dump(empty([0]));//false var_dump(empty($var));//true echo "<hr/>"; var_dump(is_null(NULL));//true var_dump(is_null(TRUE));//false var_dump(is_null(FALSE));//false @var_dump(is_null($var));//true var_dump(is_null($var=NULL));//true echo "<hr/>"; var_dump(isset($var));//false echo "<hr/>"; $var=NULL; var_dump(isset($var));//false echo "<hr/>"; $var=array(); var_dump(isset($var));//ture echo "<hr/>"; $var=array(); $var['key']=NULL; var_dump(isset($var['key']));//false echo "<hr/>"; // 返回数组中元素值为奇数的元素数组 $array=array(6,7,8,9,10,11,12); for($i=0;$i<count($array);$i++){ if(is_int($array[$i]/2)){ $a[]=$array[$i]; }else{ $b[]=$array[$i]; } } var_dump($a); var_dump($b); echo "<hr/>"; $a=1;$b=$a++;$c=++$a; var_dump($a);//3 var_dump($b);//1 var_dump($c);//3 echo "<hr/>";
include和require的区别?
require:一个文件存在错误时,执行就会中断。并返回一个致命错误。
include:一个文件存在错误,程序不会中断执行。会弹出一个警告。
require,include都是导入文件,但是require如果找不到文件,直接error,程序退出;include是warning,继续执行;
16个魔术方法及其作用
__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用。
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息
cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
主键外键和索引的区别?
主键:唯一标识一条记录,不能有重复的,不允许为空
外键:表的外键是另一表的主键, 外键可以有重复的, 可以是空值
索引:是对数据库表中一列或多列的值进行排序的一种结构
php连接MySQL数据库的方式?
mysqli $mysqli = new mysqli("example.com", "user", "password", "database"); $result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL"); $row = $result->fetch_assoc(); echo htmlentities($row['_message']); PDO $pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password'); $statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL"); $row = $statement->fetch(PDO::FETCH_ASSOC); echo htmlentities($row['_message']); mysql $c = mysql_connect("example.com", "user", "password"); mysql_select_db("database"); $result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL"); $row = mysql_fetch_assoc($result); echo htmlentities($row['_message'])
我们看看GET和POST的区别
1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456.(注意对于用户登录来说,get是不安全的,网页直接显示你的用户名和密码) POST方法是把提交的数据放在HTTP包的Body中.
2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
// 冒泡排序 function order($arr){ for($i=0;$i<count($arr)-1;$i++){ for($j=0;$j<count($arr)-1-$i;$j++){ if($arr[$j]>$arr[$j+!]){ $temp=$arr[$j]; $arr[$j]=$arr[$j+1]; $arr[$j+1]=$temp } } }return $arr; } // 反转函数 function reverse(&$arr){ $n=count($arr); $left=0; $right=$n-1; while($left<$right){ $temp=$arr[$left]; $arr[$left++]=$arr[$right]; $arr[$right--]=$temp; }return $arr; } // 将数组中元素随机打乱 function custom($arr){ $n=count($arr); for($i=0;$i<$n;$i++){ $rand_pos=mt_rand(0,$n-1); if($rand_pos!=$i){ $temp=$arr[$i]; $arr[$i]=$arr[$rand_pos]; $arr[$rand_pos]=$temp; } }return $arr; } // 给一个有数字和字母的字符串,让连着的字母和数字对应 function number_alphabet($str){ $num=preg_split('/[a-zA-Z]+/',$str,-1,PREG_SPLIT_NO_EMPTY); $alphabet=preg_split('/d+/',$str,-1,PREG_SPLIT_NO_EMPTY); var_dump($num); var_dump($alphabet); $n=count($num); for($i=0;$i<$n;$i++){ echo $num[$i] . ':' . $alphabet[$i] . '</br>'; } } $str='12Abj3n4lih5jon'; number_alphabet($str); // 求n以内的质数 // 质数的定义:在大于1的自然数中除1和他本身以外,无法被其他自然数整除的数 // 思路:n不能被大于根号n的任何质数整除;除以2的偶数都不是质数 function get_prime($n){ $prime=array(2); for($i=3;$i<=$n;$i+=2){ $sqrt=intval(sqrt($i)); for($j=3;$j<=$sqrt;$j+=2){ if($i%$j==0){ break; } } if($j>$sqrt){ array_push($prime, $i); } } return $prime; } var_dump(get_prime(10));
未完待续