近期去面试php实习生遇到不熟悉的问题

1. 数组转json,json转数组

json_encode 是 数组转json
json_decode 是 json转数组
js函数和php语言的数据想通时,把数组或对象都转成json,
一个两个语言都认识的中间语言来使用,


encode是转码,把数组或对象转成这个特殊的码json供js使用
decode是解码,把这个特殊的码json解开成数组或对象供php使用
使用方法:
json_encode(array/object)
json_decode(json)

json主要分为两种形式

1.对象

对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

 {" ":" ",  " ":" "}   

2.数组:

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

['' ", '' ''] 

*如果PHP数组的键都是数字,那么json_encode()返回一个数组形式的Json,如果PHP数组的键全是字符串。那么json_encode()就会返回一个对象形式的Json。


2.php如何接收post,get数据

get(显式提交)是提交的信息会出现在url中,而且数据要在2M以内。当然在url(href=““)中直接提交的信息也算是get提交。目前这种提交方式仅限于用于提交不是特别重要的信息。

post(隐式提交)是提交的信息不会出现在url中,只有以浏览器开发者模式查看时能看到提交的信息的名称(也看不见值) 。这种方式提交用于一些重要的信息的提交(比如密码等)。

如何接收?

原生方法

1 $id    =  $_GET['id']; // 获取get变量
2 $name  =  $_POST['name'];  // 获取post变量
3 $value =  $_SESSION['var']; // 获取session变量
4 $name  =  $_COOKIE['name']; // 获取cookie变量
5 $file  =  $_SERVER['PHP_SELF']; // 获取server变量

tp3:I('变量类型.变量名/修饰符',['默认值'],['过滤方法'],['额外数据源'])

I('get.id') //返回get中的id
I('post.id')//返回post中的id

I('get.')//返回get获得的所有
I('post.')//返回post获得的所有

tp5:

Request::instance()->post('name'); // 获取某个post变量
Request::instance()->post(); // 获取经过过滤的全部post


//助手函数
input('post.name');
input('post.');

3.sql查询原生语句,sql引擎,sql索引,sql优化

这道题问的我完全懵逼,sql的引擎索引优化完全不知道

一 原生语句

创建表 CREATE DATABASE db1

删除表  drop database db1

数据表中记录的查询,删除,修改,插入—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)

查询:select 字段 from  表 where 条件 

插入: insert into table1(field1,field2) values(value1,value2)

删除:delete from table1 where 条件

更新: update table1 set field1=value1 where 范围

查找:select * from table1 where field1 like ’%value1%’ 

排序:select * from table1 order by field1,field2 [desc]、

总数:select count * as totalcount from table1

使用外连接

A、left  join:
左连接:结果集包括连接表的匹配行,也包括左连接表的所有行。

这就是LEFT JOIN 将两个表连接起来,根据某个条件查询,并将左边表的数据全部显示,右边表显示符合查询条件的数据, 不足的地方显示null

select a.content, b.name FROM
motion as a
LEFT JOIN
banner as b
ON a.id = b.id


B:right  join:
右连接:同左连接相反,结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

C:INNER JOIN 只显示两个表符合条件的数据

实现分页

select id,actor_id,content,time FROM motion
WHERE actor_id = 3
ORDER BY time
limit 0,8

二,sql引擎

最常使用的2种存储引擎:
1.Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是.frm(存储表定义)、.MYD(MYData,存储数据)、.MYI(MYIndex,存储索引)。数据文件和索引文件可以放置在不同的目录,平均分布io,获得更快的速度。


2.InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比Myisam的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

MyIASM引擎是为了查和增加,效率高。所有功能都围绕这这个

Innodb引擎功能更强(事务等)效率低一些。

*MyISAM 发音为 "my-z[ei]m";
*InnoDB 发音为 "in-no-db" 

三,sql索引

索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。

       例如:有一张person表,其中有2W条记录,记录着2W个人的信息。有一个Phone的字段记录每个人的电话号码,现在想要查询出电话号码为xxxx的人的信息。

          如果没有索引,那么将从表中第一条记录一条条往下遍历,直到找到该条信息为止。

          如果有了索引,那么会将该Phone字段,通过一定的方法进行存储,好让查询该字段上的信息时,能够快速找到对应的数据,而不必在遍历2W条数据了。其中MySQL中的索引的存储类型有两种:BTREE、HASH。 也就是用树或者Hash值来存储该字段,要知道其中详细是如何查找的,就需要会算法的知识了。我们现在只需要知道索引的作用,功能是什么就行

      优点:

       2、所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段设置索引

       3、大大加快数据的查询速度

      缺点:

       1、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

       2、索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值

       3、当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。

      使用原则:

            通过上面说的优点和缺点,我们应该可以知道,并不是每个字段度设置索引就好,也不是索引越多越好,而是需要自己合理的使用。

       1、对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引,

       2、数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。

       3、在一同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可是建立索引。

*暂时我先记住索引是什么是干啥用的,等真正要用的时候再去学习如何使用

四,sql优化

1、选取最适用的字段属性、

根据字段值,选取最适合该字段属性大小的字段属性,尽量把字段设置为NOTNULL

对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多

.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by涉及的列上建立索引。
  2.应尽量避免在 where 子句中使用 !=或<> 操作符,否则将引擎放弃使用索引而进行全表扫描。
  3.应尽量避免在 where 子句中对字段进行 null 值 判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
  select id from t where num is null
  可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
  select id from t where num=0
  4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
  select id from t where num=10 or num=20
  可以这样查询:
  select id from t where num=10
  union all
  select id from t where num=20

2.drop直接删掉表 truncate删除表中数据,再插入时自增长id又从1开始 delete删除表中数据,可以加where字句。

一般而言,drop > truncate > delete

这里只是记下了一部分我能看懂的。其他的等用到的时候在实际情况中使用

4.说几个jq的选择器,js的事件,

$(‘*’) 匹配页面所有元素
$(‘#id’) id选择器
$(‘.class’) 类选择器
$(‘element’) 标签选择器

https://www.jb51.net/article/140635.htm

$() 函数是 jQuery() 函数的别称,$() 函数用于将任何对象包裹成 jQuery 对象,接着你就被允许调用定义在 jQuery 对象上的多个不同方法

id选择器 $('#LoginTextBox')

class选择器 $('.LoginTextBox')

 如何在点击一个按钮时使用 jQuery 隐藏一个图片?

$('#ButtonToClick').click(function(){
  $('#ImageToHide').hide();
});

$(this) 和 this 关键字在 jQuery 中有何不同?

$(this) 返回一个 jQuery 对象,你可以对它调用多个 jQuery 方法,比如用 text() 获取文本,用val() 获取值等等。而 this 代表当前元素,它是 JavaScript 关键词中的一个,表示上下文中的当前 DOM 元素。你不能对它调用 jQuery 方法,直到它被 $() 函数包裹,例如 $(this)。

 JavaScript window.onload 事件和 jQuery ready 函数有何不同?(答案)

这个问答是紧接着上一个的。JavaScript window.onload 事件和 jQuery ready 函数之间的主要区别是,前者除了要等待 DOM 被创建还要等到包括大型图片、音频、视频在内的所有外部资源都完全加载。如果加载图片和媒体内容花费了大量时间,用户就会感受到定义在 window.onload 事件上的代码在执行时有明显的延迟。

另一方面,jQuery ready() 函数只需对 DOM 树的等待,而无需对图像或外部资源加载的等待,从而执行起来更快。使用 jQuery $(document).ready() 的另一个优势是你可以在网页里多次使用它,浏览器会按它们在 HTML 页面里出现的顺序执行它们,相反对于 onload 技术而言,只能在单一函数里使用。鉴于这个好处,用 jQuery ready() 函数比用 JavaScript window.onload 事件要更好些。

 如何找到所有 HTML select 标签的选中项?(答案如下)

这是面试里比较棘手的 jQuery 问题之一。这是个基础的问题,但是别期望每个 jQuery 初学者都知道它。你能用下面的 jQuery 选择器获取所有具备 multiple=true 的 <select > 标签的选中项:

 
$('[name=NameOfSelectedTag] :selected')

这段代码结合使用了属性选择器和 :selected 选择器,结果只返回被选中的选项。你可按需修改它,比如用 id 属性而不是 name 属性来获取 <select> 标签。

常见的js事件:

https://www.cnblogs.com/yujon/p/5467579.html

a.窗口事件,只在body和frameset元素中才有效
onload      页面或图片加载完成时
onunload     用户离开页面时

b.表单元素事件,在表单元素中才有效
onchange     框内容改变时
onsubmit     点击提交按钮时
onreset     重新点击鼠标按键时
onselect     文本被选择时
onblur      元素失去焦点时
onfocus     当元素获取焦点时

c.键盘事件,在base,bdo,br,frame,frameset,head,html,iframe,meta,param,script,style,title元素里都无效
onkeydown    按下键盘按键时
onkeypress    按下或按住键盘按键时
onkeyup     放开键盘按键时

d.在base,bdo,br,frame,frameset,head,html,iframe,meta,param,script,style,title元素里都无效
onclick     鼠标点击一个对象时
ondblclick    鼠标双击一个对象时
onmousedown 鼠标被按下时
onmousemove 鼠标被移动时
onmouseout    鼠标离开元素时
onmouseover 鼠标经过元素时
onmouseup    释放鼠标按键时

e.其他
onresize     当窗口或框架被重新定义尺寸时
onabort     图片下载被打断时
onerror     当加载文档或图片时发生错误时

5.对ajax的理解,原理

首先他是异步的js和xml,叫做ajax

同步,是发送方发送数据之后,必须等接收方接收数据必须做出回应之后,才可以进行下一步。

异步的话则是发送方发送数据之后不需等接收方做出回应,可以进行下一步操作。

Ajax原理

简单来说,就是通过XMLHttpRequest对象像服务器发送异步请求,从服务器获取数据之后,再通过JS来操作DOM节点。

ajax优点:

1.无刷新更新数据,减少用户等到时间,更好的用户体验

2.异步与服务器通信,无需打断用户,响应更加迅速

3.可以把服务器的一些负担转到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,节约空间和宽带租用成本。并且减轻服务器的负担,AJAX的原则是“按需取数据”,可以最大程度的减少冗余请求和响应对服务器造成的负担,提升站点性能。

5.基于标准化,广泛被支持

ajax缺点

1.破坏了前进后退功能,用户往往通过后退按钮来取消上一步操作,但是使用ajax无法实现。可以使用Gmail来解决这个问题,它只是采用的一个比较笨但是有效的办法,即用户单击后退按钮访问历史记录时,通过创建或使用一个隐藏的IFRAME来重现页面上的变更。

2.安全问题。ajax技术就如同对企业数据建立了一个直接通道。这使得开发者在不经意间会暴露比以前更多的数据和服务器逻辑。ajax的逻辑可以对客户端的安全扫描技术隐藏起来,允许黑客从远端服务器上建立新的攻击。还有自身受到如跨站脚本攻击,SQL注入等攻击。

3.对搜索引擎支持较弱

4.一些手持设备不能很好的支持等
https://blog.csdn.net/zhi_miss/article/details/50932018

css的绝对相对定位

https://www.cnblogs.com/heroine/p/5852748.html

首先说relative ,相对定位。

它原来位于文档流中的位置仍然会存在,不会被第三个块浮动过来填补掉。
同时,它的偏移也不会把别的块从文档流中原来的位置挤开,如果有重叠的地方它会重叠在其它文档流元素之上,而不是把它们挤开,就像图中那样,它已经覆盖在了第三个块之上。
我们可以设置它的z-index属性来调整它的堆叠顺序。

他就是相对于自己之前的位置进行偏移,而之前的位置还会存在

接下来我们来看看绝对定位:position:absolute

被设置了绝对定位的元素,在文档流中是不占据空间的,如果某元素设置了绝对定位,那么它在文档流中的位置会被删除,那这个元素到哪去了呢?它浮了起来,其实设置了相对定位relative时也会让该 元素浮起来,但它们的不同点在于,相对对定位不会删除它本身在文档流中占据的那块空间,而绝对定位则会删除掉该元素在文档流中的位置,完全从文档流中抽了出来,我们可以通过z-index来设置它们的堆叠顺序

首先,如果它的父元素设置了除static之外的定位,比如position:relative,或者position:absolute以及position:fixed,那么它就会相对于它的父元素来定位,位置通过left , top ,right ,bottom属性来规定,如果它的父元素没有设置定位,那么就得看它父元素的父元素是否有设置定位 ,如果还是没有就继续向更高层的祖先元素类推,总之它的定位就是相对于设置了除static定位之外的定位(比如position:relative)的第一个祖先元素,如果所有的祖先元素都没有以上三种定位中的其中一种定位,那么它就会相对于文档body来定位(并非窗口,相对于窗口定位的是fixed)

绝对定位就是相对自己的符合条件的父类进行偏移,之前的位置会被删掉。

 

6.MVC模式的理解

Model -View-Controller

模型 视图 控制器

模型:处理业务逻辑,与数据库打交道,存储读取数据

视图:显示从模型处理返回的数据,用户看到的界面就是视图层

控制器:接收用户的请求,数据。传入有模型层进行业务逻辑处理,并得到数据让视图层加载出来

MVC的框架模式,有利于人员的分工,让设计人员专注于眼前的设计

有利于代码的重用

7.面向对象的理解

面向对象的三大特性  封装,继承 ,多态   抽象,

什么是类和对象:万物皆对象   的思想  把任何东西都按它相同的属性和行为抽象成一类事务

就是类 一类拥有相同的属性和行为,属性就叫做类的属性,行为就叫做类的方法

那类是抽象的,当我们要实例一个类后,就会有一个实在的东西那就是对象

什么是封装:把一系列事物封装成抽象的类,对外暴露公开的方法,调用这个方法就可以实现什么,但是内部的具体怎么实现是隐藏的

这样当一个大方法需要很多次使用时,可以把他封装起来,需要使用就调用,提高代码的复用性

什么是继承:当一个类可以派生出很多含有他的属性和方法的类时,那派生出来的类就是继承父类而存在,他们有部分属性和方法继承自父类,但是也有自己的属性和方法,提高代码复用性

什么是多态:

多态的三大特征:

  • 子类继承父类
  • 子类重写父类
  • 父类指向子类

多态实现的前提:必须是类与类之间要有关系,要么继承,要么实现,存在重写(override),其实就是抽象函数或接口。 
多态的应用:父类对象的引用指向子类对象,其实本质上就是一个向上转型。

方法的调用:$this->方法名();如果子类中有该方法则调用的是子类中的方法,若没有则是调用父类中的

          parent::则始终调用的是父类中的方法。

          self::来调用自己static方法

         类名::静态方法  调用静态方法

静态方法不需要通过类的实例进行访问,而是通过类名直接访问

8.前加加后加加的区别

int i=9
如果是++i<10。这里i值已经是10,所以比较失败
如果是i++<10,这里i值还是9,比较成立
++i相当于直接进行了i+=1的运算,而i++相当于依次循环后运算i+=1,具有滞后的特点

9.常见的状态码含义

200:ok 请求成功,一般是getpost请求成功

301:  请求的url被永久移动

400: bad request 客户端请求的语法错误,服务器无法理解

401: 请求要求用户的身份认证

403: 服务器理解请求客户端的请求,但是拒绝执行此请求

404: not found

500; 服务器内部错误,无法完成请求

505: 服务器不支持请求的HTTP协议的版本,无法完成处理

猜你喜欢

转载自www.cnblogs.com/zzw555/p/9905105.html