php 日常问题
1、isset、empty、is_null的区别
isset 判断变量是否定义或者是否为空
变量存在返回ture,否则返回false
变量定义不赋值返回false
unset一个变量,返回false
变量赋值为null,返回false
empty:判断变量的值是否为空,能转换为false的都是空,为空返回true,反之返回false。
"",0,"0",NULL,FALSE都认为为空,返回true
没有任何属性的对象都认为是空
is_null:检测传入的值(值、变量、表达式)是否为null
定义了,但是赋值为Null
定义了,但是没有赋值
unset一个变量
2、前端调试的工具
- Firefox的firebug
- Chrome的开发工具
- Emmet
- JSON格式校验工具
3. 简单描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)(新浪网技术部)
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。
普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。
主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。
索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引。
索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。
4.数据库中的事务是什么?
事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。ACID 四大特性,原子性、隔离性、一致性、持久性。
5.了解XSS攻击吗?如何防止?
XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的Activex控件执行恶意的行为。
使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。
6.SQL注入漏洞产生的原因?如何防止?
SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。
防止SQL注入的方式:
- 开启配置文件中的magic_quotes_gpc 和 magic_quotes_runtime设置
- 执行sql语句时使用addslashes进行sql语句转换
- Sql语句书写尽量不要省略双引号和单引号。
- 过滤掉sql语句中的一些关键词:update、insert、delete、select、 * 。
- 提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。
- Php配置文件中设置register_globals为off,关闭全局变量注册
- 控制错误信息,不要在浏览器上输出错误信息,将错误信息写到日志文件中。
7.PHP网站的主要攻击方式有哪些?
- 命令注入(Command Injection)
- eval 注入(Eval Injection)
- 客户端脚本攻击(Script Insertion)
- 跨网站脚本攻击(Cross Site Scripting, XSS)
- SQL 注入攻击(SQL injection)
- 跨网站请求伪造攻击(Cross Site Request
Forgeries, CSRF) - Session 会话劫持(Session Hijacking)
- Session 固定攻击(Session Fixation)
- HTTP 响应拆分攻击(HTTP Response Splitting)
- 文件上传漏洞(File Upload Attack)
- 目录穿越漏洞(Directory Traversal)
- 远程文件包含攻击(Remote Inclusion)
- 动态函数注入攻击(Dynamic Variable
Evaluation) - URL 攻击(URL attack)
- 表单提交欺骗攻击(Spoofed Form
Submissions) - HTTP 请求欺骗攻击(Spoofed HTTP Requests)
8、框架中什么是单一入口和多入口 , 单一入口的优缺点?
- 多口就是通过访问不同的文件来完成用户请求。单一入口只 web 程序所有的请求都指向一个脚本文件的。
- 单一入口更容易控制权限,方便对 http 请求可以进行安全性检查。
缺点:URL 看起来不那么美观,特别是对搜索引擎来说不友好。
9、 对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题:
a)、索引的目的是什么?
- 快速访问数据表中的特定信息,提高检索速度
- 创建唯一性索引,保证数据库表中每一行数据的唯一性。
- 加速表和表之间的连接
- 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
b)、索引对数据库系统的负面影响是什么?
负面影响:
创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。
c)、为数据表建立索引的原则有哪些?
- 在最频繁使用的、用以缩小查询范围的字段上建立索引。
- 在频繁使用的、需要排序的字段上建立索引
d)、 什么情况下不宜建立索引?
- 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。
- 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。
10、 简述在MySQL数据库中MyISAM和InnoDB的区别
区别于其他数据库的最重要的特点就是其插件式的表存储引擎。切记:存储引擎是基于表的,而不是数据库。
InnoDB与MyISAM的区别:
InnoDB存储引擎: 主要面向OLTP(Online Transaction Processing,在线事务处理)方面的应用,是第一个完整支持ACID事务的存储引擎(BDB第一个支持事务的存储引擎,已经停止开发)。
特点:
- 行锁设计、支持外键;
- 支持类似于Oracle风格的一致性非锁定读(即:默认情况下读取操作不会产生锁);
- InnoDB将数据放在一个逻辑的表空间中,由InnoDB自身进行管理。从MySQL4.1版本开始,可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中;
- InnoDB通过使用MVCC(多版本并发控制:读不会阻塞写,写也不会阻塞读)来获得高并发性,并且实现了SQL标准的4种隔离级别(默认为REPEATABLE级别);
- InnoDB还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能;
- InnoDB采用了聚集(clustered)的方式来存储表中的数据,每张标的存储都按主键的顺序存放(如果没有显式的在建表时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键);
- InnoDB表会有三个隐藏字段:除了上面提到了6字节的DB_ROW_ID外,还有6字节的DB_TX_ID(事务ID)和7字节的DB_ROLL_PTR(指向对应回滚段的地址)。这个可以通过innodb monitor看到;
MyISAM存储引擎: 是MySQL官方提供的存储引擎,主要面向OLAP(Online Analytical Processing,在线分析处理)方面的应用。 特点:
- 不支持事务,支持表所和全文索引。操作速度快;
- MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。MySQL数据库只缓存其索引文件,数据文件的缓存交给操作系统本身来完成;
MySQL5.0版本开始,MyISAM默认支持256T的单表数据;
11、 解释MySQL外连接、内连接与自连接的区别
先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。
内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。
外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中
的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。
左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。
12、 写出三种以上MySQL数据库存储引擎的名称(提示:不区分大小写)
MyISAM、InnoDB、BDB(BerkeleyDB)、Merge、Memory(Heap)、Example、Federated、
Archive、CSV、Blackhole、MaxDB 等等十几个引擎
13、 什么是面向对象?主要特征是什么?几大原则是什么?
面向对象是程序的一种设计模式,它利于提高程序的重用性,使程序机构更加清晰。 主要特征是:封装、继承、多态。
五大基本原则: 单一职责原则;开放封闭原则;替换原则; 依赖原则; 接口分离原则。
14、什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
参考答案:
静态路由是由系统管理员设计与构建的路由表规定的路由。适用于网关数量有限的场 合,且网络拓朴结构不经常变化的网络。其缺点是不能动态地适用网络状况的变化,当 网络状况变化后必须由网络管理员修改路由表。
动态路由是由路由选择协议而动态构建的,路由协议之间通过交换各自所拥有的路由信 息实时更新路由表的内容。动态路由可以自动学习网络的拓朴结构,并更新路由表。其 缺点是路由广播更新信息将占据大量的网络带宽。
15、使用过 Memcache 缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?
Memcahce 是把所有的数据保存在内存当中,采用 hash 表的方式,每条数据由 key 和 value 组成,每个 key 是独一无二的,当要访问某个值的时候先按照找到值,然后返回结果。
Memcahce 采用 LRU 算法来逐渐把过期数据清除掉。
16. 列举流行的 Ajax 框架?说明 Ajax 实现原理是什么及 json 在 Ajax 中起什么作用?
流行的 Ajax 框架有 jQuery,Prototype,Dojo,MooTools。
Ajax 的工作原理是一个页面的指定位置可以加载另一个页面所有的输出内容,这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以
Ajax 技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。
在使用 Ajax 时,涉及到数据传输,即将数据从服务器返回到客户端,服务器端和客户端分别使用不同的脚步语言来处理数据,这就需要一种通用的数据格式,XML 和 json 就是最常用的两种,而 json 比 XML 更简单。
17、Myql中的事务回滚机制概述
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。
要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚。
18、HTTP状态码
常见的HTTP状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转义到其他URL
- 404 - 请求的资源(网页等)不存在
- 505 - 内部服务器错误
HTTP状态码分类:
- 1** - 信息,服务器收到的请求,需要请求者继续执行操作
- 2** - 成功,操作被成功接收并处理
- 3** - 重定向,需要进一步的操作以完成请求
- 4** - 客户端错误,请求包含语法错误或者无法完成请求
- 5** 服务器错误,服务器在处理请求的过程
中发生了错误
19、echo、print_r、print、var_dump之间的区别
* echo、print是php语句,var_dump和print_r是函数
* echo 输出一个或多个字符串,中间以逗号隔开,没有返回值是语言结构而不是真正的函数,因此不能作为表达式的一部分使用
* print也是php的一个关键字,有返回值 只能打印出简单类型变量的值(如int,string),如果字符串显示成功则返回true,否则返回false
* print_r 可以打印出复杂类型变量的值(如数组、对象)以列表的形式显示,并以array、object开头,但print_r输出布尔值和NULL的结果没有意义,因为都是打印"\n",因此var_dump()函数更适合调试
* var_dump() 判断一个变量的类型和长度,并输出变量的数值
20、表单中get和post提交方式的区别
- get是把参数数据队列加到提交表单的action属性所指的url中,值和表单内各个字段一一对应,从url中可以看到;post是通过HTTPPOST机制,将表单内各个字段与其内容防止在HTML的head中一起传送到action属性所指的url地址,用户看不到这个过程
- 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据
- get传送的数据量较小,post传送的数据量较大,一般被默认不受限制,但在理论上,IIS4中最大量为80kb,IIS5中为1000k,get安全性非常低,post安全性较高
21、常用的超全局变量(8个)
- $_GET ----->get传送方式
- $_POST ----->post传送方式
- $_REQUEST ----->可以接收到get和post两种方式的值
- $GLOBALS ----->所有的变量都放在里面
- $_FILES ----->上传文件使用
- $_SERVER ----->系统环境变量
- $_SESSION ----->会话控制的时候会用到
- $_COOKIE ----->会话控制的时候会用到
22、双引号和单引号的区别
- 双引号解释变量,单引号不解释变量
- 双引号里插入单引号,其中单引号里如果有变量的话,变量解释
- 双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者用{}讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误
- 双引号解释转义字符,单引号不解释转义字符,但是解释'\和\\
- 能使单引号字符尽量使用单引号,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断