面试题总结(41-60)

41.页面字符出现乱码,怎么解决? (重点)

 1.首先考虑当前文件是不是设置了字符集。查看是不是meta标签中写了charset,如果是php页面还可以看看是不是

 在header()函数中指定了charset;

 例如:

 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

 header(“content-type:text/html;charset=utf-8”);

 

 2.如果设置了字符集(也就是charset),那么判断当前文件保存的编码格式是否跟页面设置的字符集保持一致,

 两者必须保持统一;

 

 3.如果涉及到从数据库提取数据,那么判断数据库查询时的字符集是否跟当前页面设置的字符集一致,两者必须统一,

 例如:mysql_query(“set names utf8”)。

 

42. 正则表达式是什么?php中有哪些常用的跟正则相关的函数?请写出一个email的正则,中国手机号码和座机号码的正则表达式? (重点)

 正则表达式是用于描述字符排列模式的一种语法规则。正则表达式也叫做模式表达式。

 网站开发中正则表达式最常用于表单提交信息前的客户端验证。

 比如验证用户名是否输入正确,密码输入是否符合要求,email、手机号码等信息的输入是否合法。

 在php中正则表达式主要用于字符串的分割、匹配、查找和替换操作。

 

 preg系列函数可以处理。具体有以下几个:

 string preg_quote ( string str [, string delimiter] )

  转义正则表达式字符 正则表达式的特殊字符包括:. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :。

 preg_replace -- 执行正则表达式的搜索和替换

 mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )

 preg_replace_callback -- 用回调函数执行正则表达式的搜索和替换

 mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )

 preg_split -- 用正则表达式分割字符串

 array preg_split ( string pattern, string subject [, int limit [, int flags]] )

 

 

43. 如果想过滤掉某个字符串中所有的html标记使用哪个函数?

strip_tags(string) 这样就可以过滤掉所有的html标签了。

 

44. preg_replace()和 str_ireplace()两个函数在使用上有什么不同?

preg_split()和split()函数如何使用?

1,在字符串替换的函数里,str_replace()的使用率是最高的,它的用法也比较简单,而preg_replace()的使用率相对来说比较低,因为它需要你懂得写正则表达式,而正则表达式有时候并不容易写。

str_replace()与preg_replace()的用法场合是不同的,str_replace被替换(查找)的内容是固定的、确定的,当然可以使用变量,但是变量也表示固定的、确定的内容,比如可以完成把所有的\n替换为<br>等场合。而preg_replace被替换(查找)的内容是用规则来描述的,比如可以把所有的<和>之间的内容(HTML代码)替换掉。当然preg_replace也可以用来替换固定内容。

str_replace速度要比preg_replace快

两者比较,执行效率方面谁更好呢?这就涉及到速度问题了。有人测试发现,str_replace速度要比preg_replace快一些,但好像没有某些人说的快4倍那么多。10w次的两个词替换结果表明:str_replacece 耗时0.38 sec,preg_replace 耗时0.97sec。

str_replace()与str_ireplace()的区别

str_replace()与str_ireplace()的用法是相同的,它们的区别仅仅是str_replace()对大小写敏感,而str_ireplace()不区分大小写。

str_replace()与strtr() 谁的速度更快?

str_replace()与strtr()这两者的执行效率问题,许多人说法不一,有人说strtr()比str_replace()速度快,但有人经过实例证明了str_replace()比strtr()速度快一些。

 

2,preg_split() 函数使用了 Perl 兼容正则表达式语法,通常是比 split() 更快的替代方案。如果不需要正则表达式的威力,则使用 explode() 更快,这样就不会招致正则表达式引擎的浪费

 

45. 获取当前时间戳的函数主要有哪些?用PHP打印出今天的时间,格式是2017-12-10 22:21:21?

 用PHP打印出前一天的时间格式是2017-12-10 22:21:21?如何把2017-12-25 10:30:25变成unix时间戳?

 echo date ("Y-m-d H:i:s" ,strtotime(‘-1,days’));  

 date('Y-m-d H:i:s',time());

 

 $unix_time = strtotime("2017-9-2 10:30:25");//变成unix时间戳

 echo date("Y-m-d H:i:s",$unix_time);//格式化为正常时间格式

 

46. 在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?

 用户在网站表单提交数据的时候,为了防止脚本攻击(比如用户输入<script>alert(111);</script>),php端接收数据的时候,应该如何处理?

 使用urlencode()对中文进行编码,使用urldecode()来解码。 

 使用htmlspecialchars($_POST[‘title’])来过滤表单传参就可以避免脚本攻击。

 

47. 连接数据库操作的步骤是什么?每一步的返回值是什么数据类型?尤其是mysql_query()返回什么数据类型?

 

Step1:链接数据库 mysqli_connect()

     参数:   ①主机地址

              ②mysql用户名

              ③mysql密码 

              ④选择连接的数据库

              ⑤端口号

  返回:如果连接成功,返回资源类型的标志符号;如果连接失败,返回false。

   如果我们与mysql建立的连接不只一条,那么以后操作数据库的各种函数都必须传入返回的连接符号;

   如果我们与mysql建立的连接只有一条,那么以后操作数据库的各种函数就不必传入这个标识符号。建议都传入。

 密码为空可以省略密码 $conn = mysqli_connect("localhost", "root");

 $conn = mysqli_connect("localhost", "root", "", "mydb");

 var_dump($conn);

 

 Step2:检测数据库连接是否成功? 

   mysqli_connect_errno()与 mysqli_connect_error() 

   mysqli_connect_errno(); 返回上次连接数据库错误的错误号,连接成功返回0

   mysqli_connect_error(); 返回上次连接数据库的错误信息

 if(mysqli_connect_errno($conn)){

 die("数据库连接失败!失败信息:".mysqli_connect_error($conn));

 } 

   前面两步合并的写法(Step1+Step2):连接数据库同时判断 

 $conn = mysqli_connect("localhost", "root", "", "mydb") or die("数据库连接失败!失败信息:".mysqli_connect_error($conn));

 

 Step3:选择数据库 mysqli_select_db($link,$dbname) 

   参数:①标识符 ②连接数据库名称

   连接成功,返回true;连接失败,返回false

   如果修改数据库成功,则资源标识符中的数据库就会发生变动;

   如果修改失败而没有通过代码终止操作,则后续代码可以使用原数据库继续执行

   mysqli_select_db($conn, "mydb") or die("数据库选择失败!");

   

 Step4:设置字符集编码格式

    mysqli_set_charset($link,$charset) 只能设置为utf8而不能是utf-8

    mysqli_set_charset($conn,"utf8") or die("数据库编码集设置失败!");

 

 Step5:编写sql语句 

   $sql = "select * from tb1";

   

 Step6:执行sql语句 mysqli_query($link,$sql)

   如果是(DML)增、删、改,将返回布尔类型是否成功

   返回上一次操作时受影响的行数 mysqli_affected_rows($link)

   如果是(DQL)查询,将返回资源结果集

   返回资源结果集中的行数 mysql_num_rows($result) 

   返回资源结果集中的字段数 mysql_num_fields($result) 

   如果查询失败,返回false

   $res = mysqli_query($conn,$sql);

   mysqli_insert_id($conn); 执行插入语句是返回上次插入最新插入的主键ID

   

 Step7:解析结果集 

var_dump(mysqli_fetch_array($res)); 处理结果集,返回关联数组和索引数组 不常用

  参数① 需要处理的结果集

  参数② 返回哪种数组格式 

 MYSQL_ASSOC - 关联数组

 MYSQL_NUM - 数字数组

 MYSQL_BOTH - 默认。同时产生关联和数字数组

 echo "<table border='1' style='border-collapse:collapse;text-align:center;width:200px;'>";

 echo "<thead bgcolor='lightblue' style='color:#ffffff;'><td>ID</td><td>姓名</td><td>年龄</td><td>性别</td></thead>";

 while($row =mysqli_fetch_assoc($res)){               // 返回关联数组 指针遍历 常用

 echo "<tr>";

 foreach($row as $value){

 echo "<td>{$value}</td>";

 };

 echo "</tr>";

 }

 echo "</table>";

mysqli_data_seek($res,0); 设置结果集指针位置,此式表达复位至0

   var_dump(mysqli_fetch_object($res));

   var_dump(mysqli_fetch_row($res)); 返回索引数组

   var_dump(mysqli_fetch_object($res)); 返回对象

   var_dump(mysqli_fetch_fields($res)); 返回结果集中每一列的字段信息

   

Step8:关闭资源与结果集 mysqli_free_result()和mysqli_close()

    mysqli_free_result($res); //释放查询资源结果集

    mysqli_close($conn); //关闭数据库连接

 

48. 说说mysql_fetch_row() 和mysql_fetch_assoc()和mysql_fetch_array之间有什么区别?

 第一个是返回结果集中的一行作为索引数组,第二个是返回关联数组,而第三个既可以返回索引数组也可以返回关联数组,取决于它的第二个参数 MYSQL_BOTH MYSQL_NUM  MYSQL_ASSOC 默认为MYSQL_BOTH

 $sql =”select * from table1”;

 $result = mysql_query($sql);

 mysql_fetch_array($result, MYSQL_NUM);

 

49. 请说出目前学过的返回是资源的函数?

 答: mysql_connect();

  mysql_query();只有这执行select的时候成功,才返回资源,失败返回FALSE

  fopen();

 

50. 打开、关闭文件分别是什么函数? 文件读写是什么函数?删除文件是哪个函数? 判断一个文件是否存在是哪个函数?新建目录是哪个函数?

操作文件的常用方法:

flie_put_contents(url,str);

file_get_contents(url);

 
<?php
$str = time();
$path = './time.txt';
echo '<hr>';
file_put_contents($path,$str);
echo file_get_contents($path);
echo '<hr>';
file_put_contents($path,"\r".$str,FILE_APPEND);
echo file_get_contents($path);

运行效果图如下:

当文件过大时,不能使用以上的方法一次性操作以上内容,使用下面的函数解决

fopen() 打开文件句柄(php与文件间的数据流通道)

参数1:文件地址

参数2:打开方式,打开文件后希望完成哪种操作,可以在模式位置进行限制

文件模式:

r(read) 读模式 
w (write) 替换写模式,将文件内容清零,不存在则创建 
a(append) 
x 替换写模式,将文件内容清零,不存在不创建 
+扩展 
r+ 读写模式 ,将文件指针放在文件头 
w+ 读写模式 ,将文件清零,将文件指针放在文件头 
x+ 读写模式 ,将文件清零,将文件指针放在文件头,不自动创建文件 
a+ 读追加写模式 ,写操作永远在末尾,读操作受限于文件指针

在都可以读写操作时,不同的是文件的初始化

连续读取:

fread(文件句柄[,长度]); 读取指定长度(字节)的内容

fgets(文件句柄[,长度]); 读取指定长度(字节)的内容

长度:指的是会读取长度-1个字节

行末是函数的终止操作

fgetc(文件句柄) 一次读取一个字节

fwrite(文件句柄,内容);

fclose(文件句柄);

ftell();寻找指针位置
fseek();定位指针位置

 
<?php
$stmt = fopen('./rw.txt','r+');
echo ftell($stmt);
fwrite($stmt,'01234'."\n".'56789');
echo ' r '.ftell($stmt);
echo '<br>';
fseek($stmt,1);
fwrite($stmt,'ab');
fseek($stmt,1);
echo fgets($stmt,8);
echo '<br>';
echo fgets($stmt,8);
fclose($stmt);

rw.txt

r+ 读写受指针影响,写替换原有指针内容 
w+ 清空内容 
a | a+ 指针具有不确定因素,读受指针影响,写是追加

filemtime(url) 文件最后修改时间

filesize() 文件大小

51. 文件上传需要注意哪些细节?怎么把文件保存到指定目录?怎么避免上传文件重名问题?

 1.首现要在php.ini中开启文件上传;

 2.在php.ini中有一个允许上传的最大值,默认是2MB。必要的时候可以更改;

 3.上传表单一定要记住在form标签中写上enctype="multipart/form-data";

 4. 提交方式 method 必须是 post;

 5. 设定 type="file" 的表单控件;

 6.要注意上传文件的大小MAX_FILE_SIZE、文件类型是否符合要求,上传后存放的路径是否存在。

 可以通过上传的文件名获取到文件后缀,然后使用时间戳+文件后缀的方式为文件重新命名,这样就避免了重名。

 可以自己设置上传文件的保存目录,与文件名拼凑形成一个文件路径,使用move_uploaded_file(),就可以完成

 将文件保存到指定目录。

 

52. $_FILES是几维数组?第一维和第二维的索引下标分别是什么?批量上传文件的时候需要注意什么?

 二维数组。第一维是上传控件的name,二维下标分别为name/type/tmp_name/size/error.

 

53. header()函数主要的功能有哪些?使用过程中注意什么?

在php中header()函数是很大的作用可以发送各种状态代码,也可以实现一些输出下载,下面我们一起来看看一些相关实例吧。

什么是头信息?
这里只作简单解释,详细的自己看http协议。
在 HTTP协议中,服务器端的回答(response)内容包括两部分:头信息(header) 和 体内容,这里的头信息不是HTML中的<head></head>部分,同样,体内容也不是<BODY>< /BODY>。头信息是用户看不见的,里面包含了很多项,包括:服务器信息、日期、内容的长度等。而体内容就是整个HTML,也就是你所能看见的全 部东西。

头信息有什么用呢?
头信息的作用很多,最主要的有下面几个:

1、跳转:当浏览器接受到头信息中的 Location: xxxx 后,就会自动跳转到 xxxx 指向的URL地址,这点有点类似用 js 写跳转。但是这个跳转只有浏览器知道,不管体内容里有没有东西,用户都看不到。

2、指定网页的内容: 同样一个XML文件,如果头信息中指定:Content-type: application/xml 的话,浏览器会将其按照XML文件格式解析。但是,如果头信息中是:Content-type: text/xml 的话,浏览器就会将其看作存文本解析。(浏览器不是按照扩展名解析文件的)

3、附件:不知道大家有没 有注意,有些时候在一些网站下载东西,点下载连接以后,结果浏览器将这个附件当成网页打开了,里面显示的都是乱码,这个问题也和头信息有关。有时候浏览器 根据Content-type 来判断是打开还是保存,这样有时就会判断错误(主要是网站设计者忘记写Content-type)。其实,还有一个可以来指定该内容为附件、需要保存,这 个就是:Content-Disposition: attachment; filename=”xxxxx”

 

54. 文件下载的时候如果使用header()函数?

 答:header("content-type: application/octet-stream;charset=UTF-8"); //在这里加utf-8和在上面定义有什么区别?、??

            header("accept-ranges: bytes");

            header("accept-length: ".filesize($filedir.$filename));

            header("content-disposition: attachment; filename=".$filedir.$filename);

 

55. 什么是ajax?ajax的原理是什么?ajax的核心技术是什么?ajax的优缺点是什么?

 ajax是asynchronous javascript and xml的缩写,是javascript、xml、css、DOM等多个技术的组合。 '$'是jQuery的别名.

  页面中用户的请求通过ajax引擎异步地与服务器进行通信,服务器将请求的结果返回给这个ajax引擎,

  最后由这个ajax引擎来决定将返回的数据显示到页面中的指定位置。Ajax最终实现了在一个页面的指定位置可以加载另一个页面所有的输出内容。

 这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以ajax技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,

 减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。

 

 Ajax的优点是:

 1.  减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端执行,利用客户端闲置的资源进行处理;

 2.  在只局部刷新的情况下更新页面,增加了页面反应速度,使用户体验更友好。

 Ajax的缺点是不利于seo推广优化,因为搜索引擎无法直接访问到ajax请求的内容。

 ajax的核心技术是XMLHttpRequest,它是javascript中的一个对象。

 

 

 

56. jquery是什么?jquery简化ajax后的方法有哪些?

 jQuery是Javascript的一种框架。

 $.get(),$.post(),$.ajax()。$是jQuery对象的别名。

 代码如下:

 $.post(异步访问的url地址 , {'参数名' : 参数值} , function(msg){

  $("#result").html(msg);

 });

 

 $.get(异步访问的url地址 , {'参数名' : 参数值} , function(msg){

  $("#result").html(msg);

 });

 $.ajax({

  type: "post",

  url: loadUrl,

  cache:false,

  data: "参数名=" + 参数值,

  success: function(msg) {

   $("#result").html(msg);

  }

 });

 

57. 什么是会话控制?

 简单地说会话控制就是跟踪和识别用户信息的机制。会话控制的思想就是能够在网站中跟踪一个变量,通过这个变量,

 系统能识别出相应的用户信息,根据这个用户信息可以得知用户权限,从而展示给用户适合于其相应权限的页面内容。

 目前最主要的会话跟踪方式有cookie,session。

 

58. 会话跟踪的基本步骤

 1).访问与当前请求相关的会话对象

 2).查找与会话相关的信息

 3).存储会话信息

 4).废弃会话数据

 

59. 使用cookie的注意事项有哪些?

 1) setcookie()之前不可以有任何页面输出,就是空格,空白行也不可以;

 2) setcookie()后,在当前页面调用$_COOKIE['cookiename']不会有输出,必须刷新或到下一个页面才可以看到cookie值;

 3) 不同的浏览器对cookie处理不同,客户端可以禁用cookie,浏览器也可以闲置cookie的数量,一个浏览器能创建的cookie数量最多300个,并且每个不可以超过4kb,

 每个web站点能设置的cookie总数不能超过20个。

 4) cookie是保存在客户端的,用户禁用了cookie,那么setcookie就不会起作用了。所以不可以过度依赖cookie。

 

60. 使用session的时候,通过什么来表示当前用户,从而与其他用户进行区分?

 sessionid,通过session_id()函数可以取得当前的session_id。

 

posted @ 2018-05-21 08:33  Kayle_zhao  阅读(243)  评论(0编辑  收藏  举报