近期去面试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协议的版本,无法完成处理