1. Get与post两种方式?
ans:
GET->一般用于查询,参数可见不安全,且传值支持的大小不能超过2kb,效率高。
post-> 一般用于修改保存数据,参数不可见比较安全。
2. AJAX的优势是什么?
ans:ajax是异步传输技术,可以通过javascript实现,也可以通过JQuery框架实现,实现局部刷新,减轻了服务器的压力,也提高了用户体验。
3.path相关:
pathinfo:解析文件(文件名及扩展)
path_url:解析URL(文件名及路由及参数)
4.left join 与 right join
left join: 先找出左表所有匹配的数据,右边不匹配的为null
5.如何无限分类
id,parentid,path(相对路径)
6. 安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?
ans:①防远程提交;②防SQL注入,对特殊代码进行过滤;③防止注册机灌水,使用验证码;
7. 如何防sql注入?
ans:
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,注入者可以在表单中输入一段数据库查询代码并提交,程序将提交的信息拼凑生成一个完整sql语句,服务器被欺骗而执行该条恶意的SQL命令。注入者根据程序返回的结果,成功获取一些敏感数据,甚至控制整个服务器,这就是SQL注入。
主要两阶段防止:1.用户输入时候的数据校验 2.查询数据库时候的转义。3.尽量不要用mysql_error来抛出错误(错误信息进行封装)
(1)查询条件尽量使用数组方式,这是更为安全的方式(post提交);
(2)如果不得已必须使用字符串查询条件,使用预处理机制?;
(3)开启数据字段类型验证,可以对数值数据类型做强制转换;(3.1版本开始已经强制进行字段类型验证了)(safe_mode = on 在php ini 中设置)
(4)使用自动验证和自动完成机制进行针对应用的自定义过滤;(magic_quotes_gpc = on) 对sql 查询进行转换
(5)使用字段类型检查、自动验证和自动完成机制等避免恶意数据的输入。
(6)addslashes(特使字符转义) 防止sql注入。
用户输入校验:
/*
过滤用户代码
*/
function security($str){
$str = trim($str); //清理空格
$str = strip_tags($str); //过滤html标签
$str = htmlspecialchars($str); //将字符内容转化为html实体
$str = addslashes($str);
return $str;
}
8. XSS 与 CSRF?
XSS:跨站脚本(cross—site script)发生在客户端,修复方式和防止sql注入类似
ans:注入脚本的一种,例如提交评论中参杂javascript脚本,如果服务器没有进行过滤或转移这些脚本
CSRF:跨站请求伪造(Cross_site_request_forgery) 发生在服务端(伪造成合法用户请求)(缓存中的session_id)
CSFR攻击就是类似复制用户的session_id来冒充合法用户
9.php正则函数
php正则匹配掉js代码';
$preg = "/<script[sS]*?</script>/i";
$newstr = preg_replace($preg,"",$str,3); //第四个参数中的3表示替换3次,默认是-1,替换全部
$newstr = preg_match($resg,$str,$newstr);
echo $newstr;
10. SESSION与COOKIE的区别?
ans:
①存储位置:session存储于服务器,cookie存储于浏览器
②安全性:session安全性比cookie高
③session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用
11. PHP处理数组的常用函数
ans:
①array()创建数组;
②count()返回数组中元素的数目;
③array_push()将一个或多个元素插入数组的末尾(入栈);
④array_column()返回输入数组中某个单一列的值;
⑤array_combine()通过合并两个数组来创建一个新数组;
⑥array_reverse()以相反的顺序返回数组;
⑦array_unique()删除数组中的重复值;
⑧in_array()检查数组中是否存在指定的值
12. PHP处理字符串的常用函数?
ans:
①trim()移除字符串两侧的空白字符和其他字符;
②substr_replace()把字符串的一部分替换为另一个字符串;
③substr_count()计算子串在字符串中出现的次数;④substr()返回字符串的一部分;
⑤strtolower()把字符串转换为小写字母;
⑥strtoupper()把字符串转换为大写字母;
⑦strtr()转换字符串中特定的字符;
⑧strrchr()查找字符串在另一个字符串中最后一次出现;
⑨strstr()查找字符串在另一字符串中的第一次出现(对大小写敏感);
strrev()反转字符串;
strlen()返回字符串的长度;
str_replace()替换字符串中的一些字符(对大小写敏感);
print()输出一个或多个字符串;
explode()把字符串打散为数组;
is_string()检测变量是否是字符串;
strip_tags()从一个字符串中去除HTML标签;
mb_substr()用来截中文与英文的函数
strpos 查找字符串所在位置
13. 常用的魔术方法有哪些?
__construct() 实例化类时自动调用。
__destruct() 类对象使用结束时自动调用。
__set() 在给未定义的属性赋值的时候调用。
__get() 调用未定义的属性时候调用。
__isset() 使用isset()或empty()函数时候会调用。
__unset() 使用unset()时候会调用。
__sleep() 使用serialize序列化时候调用。
__wakeup() 使用unserialize反序列化的时候调用。
__call() 调用一个不存在的方法的时候调用。
__callStatic()调用一个不存在的静态方法是调用。
__toString() 把对象转换成字符串的时候会调用。比如 echo。
__invoke() 当尝试把对象当方法调用时调用。
__set_state() 当使用var_export()函数时候调用。接受一个数组参数。
__clone() 当使用clone复制一个对象时候调用。
14. serialize与unserialize的认识?
ans:
serialize:将内存数据转化为字符串,写入硬盘 __sleep
unserialize:将字符串转为内存数据如php变量 __wakeup
15. include 与 require 的区别?
include:根据流程引入,且不存在流程也能正常进行。 有返回值
requeire:不管放在哪都是最先引入该文件,如果不存在则会报错。 无返回值
include_once :只引入一次,如果引入过则不在引入。
requeire_once :只引入一次,如果引入过则不在引入。
16. 什么是composer可以解决自动加载类?
ans:
Composer 是 PHP 的一个依赖管理工具,"快速安装类库"。工作原理就是将已开发好的扩展包从 packagist.org composer仓库下载到我们的应用程序中,并声明依赖关系和版本控制。
composer命令:
composer list 列出所有可用的命令
composer init 初始化composer.json文件(就不劳我们自己费力创建啦),会要求输入一些信息来描述我们当前的项目,还会要求输入依赖包
composer install 读取composer.json内容,解析依赖关系,安装依赖包到vendor目录下
composer update 更新最新的依赖关系到compsoer.lock文件,解析最新的依赖关系并且写入composer.lock文件
composer search packagename 搜索包,packagename替换为你想查找的包名称
composer require packagename 添加对packagename的依赖,packagename可修改为你想要的包名称
composer show packagename
composer self-update 更新 composer.phar文件自身
composer dump-autoload --optimize 优化一下自动加载
17. PHP7 和 PHP5 的区别,具体多了哪些新特性?
ans:
性能提升了两倍(
因为:变量存储字节减小,减少内存占用,提升变量操作速度
改善数组结构,数组元素和 hash 映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率
改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率)
结合比较运算符 (<=>)
标量类型声明
返回类型声明
try...catch 增加多条件判断,更多 Error 错误可以进行异常处理
匿名类,现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义
18. PHP 的设计模式?
1. 单例模式(重点):
ans:实例化出来的对象是唯一的。
why: 当存在大量数据库操作时,可以避免大量new对象,减少数据库连接
implement: 私有化实例,私有化构造方法,私有化克隆方法,公有化静态获取实例的方法(getinstant)
2. 工厂模式(重点)
ans:建立一个工厂来根据所需创建对象(解决紧耦合:改一个类就要改很多其他调用的地方)。
工厂模式分为:简单工厂模式,工厂方法模式,抽象工厂模式
3. 观察者模式(重点)
4. 依赖注入(重点)
19. 依赖注入实现原理?
ans:实现低耦合高扩展。
依赖注入DI:应用程序依赖容器创建并注入到所需的外部资源
控制反转IOC:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源
依赖注入就是组件通过构造器,方法或者属性字段来获取相应的依赖对象。
为什么用依赖注入:解决高耦合。
注入的途径:construct注入,set注入
20. 请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确。
if(isset($_POST['action']) && $_POST['action']==’submitted’){
$email=$_POST['email'];
if(!preg_match(“/^[0-9a-zA-Z-]+@[0-9a-zA-Z-]+(.[0-9a-zA-Z-]+){1,3}$/”,$email)){
echo“电子邮件检测失败”;
}else{
echo“电子邮件检测成功”;
}
}
21. sql注入之预处理(pdo)?
22. 防止盗链?
1.服务器防止: apach 或 nginx 做rewrite(重定向) 基于源来做判断防止盗链(防止别的网站请求我们网站的资源)
2.代码防止: $_SERVER[‘HTTP_REFERER’] 判断是否来自我们网站的请求(通过判断域名和ip)
所以一般来说,只有通过 <a></a> 超链接以及 POST 或 GET 表单访问的页面,$_SERVER['HTTP_REFERER'] 才有效。
23 echo true =>1
echo false => 空
echo 默认打印十进制 echo012 => 18
print 非函数
eval():将字符串表达式执行
$str = '$a = 1+1;' 注意要加上封号
echo eval($str);
24. 跨域问题?
常见跨域方式:
1.JSONP(只支持get)
2.空iframe加form
3.CORS:CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)跨域资源共享 CORS 详解。看名字就知道这是处理跨域问题的标准做法。CORS有两种请求,简单请求和非简单请求。
例子:
header('Access-Control-Allow-Origin: http://*.baidu.com'); //设置http://*.baidu.com允许跨域访问
4.Nginx代理设置