面试题

今天在博客园上看到一篇文章,其中有一段是介绍如何改进以下的这行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));

 未完待续

原文地址:https://www.cnblogs.com/aten/p/8574807.html