1、相同商品ID的属性不同,怎么办??

商品表中的属性存成一个集合,属性表

2、购物车的实现原理

分两种情况:

1、用户没有登录,将数据存储在cookie中,若用户登录,再将cookie中的数据转存到数据库。

2、用户登录后,将数据直接存储到数据库。

3、RBAC权限管理
基于角色的权限访问控制(Role-Based Access Control)

五张表:两个中间表 admin、role、rule、admin_role、role_rule

三张表:一个中间表

通过代码控制不同的管理员是否能够访问某个方法的过程就是权限控制。

RBAC(Role-Based AccessControl,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。

4、短信验证码如何防止短信轰炸??

JS客户端验证验证

手机号限制短信条数(计数器)

5、数据库优化从哪几个方面做??

1、设计数据库方面

2、建立索引

3、读写分离

4、缓存

6、优化MySQL的查询

1、避免全表查询,给相应字段建立索引

2、避免查询语句过长,分批查询。

3、where后面不能有函数运算

4、左原则like第一个字段要有索引

5、在where和group by后面建立索引

7、Redis实用案例--抢购秒杀、计数器、推荐、收藏案例

秒杀:

使用Redis的list链表,pop操作,即使是很多用户同时到达也是依次执行

1、现将商品表的库存存入队列

2、抢购开始,设置库存的缓存周期

3、客户端执行下单操作,下单前判断redis队列库存量

8 单例模式和工厂模式

我用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会 存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都 是对数据库的一种极大考验和浪费。

需要一个保存类的唯一实例的静态成员变量(通常$instance为私有变量)

构造函数和克隆函数必须声明为私有的,为了防止外部程序new类从而失去单例模式意义

必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用

//设计模式
//单例模式 都是使用同一个对象
//class Ren
//{
// public $name;
// private static $dx; //存储对象
//
// private function __construct()
// {
//
// }
//
// public static function DuiXiang()
// {
//  if(empty(self::$dx))
//  {
//   self:;$dx=new Ren();
//  }
//  return self::$dx;
// }
//}
//
//$r= Ren::DuiXiang();
//把构造函数变为私有
//做了一个方法来间接造对象
//在该方法里面加限制
 

工厂类

是指包含一个专门用来创建其他对象的方法的类,工厂类在多态性编程实践中是至关重要的,它允许动态的替换类,修改配置,通常会使应用程序更加灵活,熟练掌握工厂模式高级PHP开发人员是很重要的。

工厂模式通常用来返回符合类似接口的不同的类,工厂的一种常见用法就是创建多态的提供者,从而允许我们基于应用程序逻辑或者配置设置来决定应实例化哪一个类,例如,可以使用这样的提供者来扩展一个类,而不需要重构应用程序的其他部分,从而使用新的扩展后的名称 。

通常,工厂模式有一个关键的构造,根据一般原则命名为Factory的静态方法,然而这只是一种原则,工厂方法可以任意命名,这个静态还可以接受任意数据的参数,必须返回一个对象。

class YunSuan
{
 public $a;
 public $b;
 function Suan()
 {
  echo "对两个数进行运算";
 }
class gongchang
{ //功能 : 给一个参数,返回一个对象
 static function chanpin($name)
 {
  switch($name)
  {
   case "'+":
    return new jia();
    break;
   case "-";
    return new jian();
    break;
  }
 }
}
$a=gongchang::chanpin("+");
9 cookie和session
当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置
客户端发送一个http请求到服务器端 服务器端发送一个http响应到客户端,
其中包含Set-Cookie头部 客户端发送一个http请求到服务器端,其中包含Cookie头部 服务器端发送一个http响应到客户端
 
创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;
在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;
当客户端再次发送请求的时候,会将这个Session id带上(Session ID 也是大多保存在 cookie 里面的),服务器接受到请求之后就会依据Session id找到相应的Session
 
10 CSRF攻击和XSS攻击
XSS 全称“跨站脚本”,是注入攻击的一种。其特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径,例如发布评论,提交含有 JavaScript 的内容文本。这时服务器端如果没有过滤或转义掉这些脚本,作为内容发布到了页面上,其他用户访问这个页面的时候就会运行这些脚本
PHP 可以用 htmlspecialchars 函数
CSRF 的全称是“跨站请求伪造”,而 XSS 的全称是“跨站脚本”。看起来有点相似,它们都是属于跨站攻击——不攻击服务器端而攻击正常访问网站的用户,但前面说了,它们的攻击类型是不同维度上的分 类。CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作。我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的。所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求。(laraval自带的令牌或者token验证)
 
11 addslashes() 和htmlspecialchars()

PHP防sql注入方法 htmlspecialchars addslashes

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(')
双引号(")
反斜杠(\)

NULL

可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。
默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。所以您不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

htmlspecialchars()将特殊字符转成 HTML 格式。将特殊字符转成 HTML 的字符串格式 ( &....; )。最常用到的场合可能就是处理客户留言的留言版。
& (和) 转成 &
" (双引号) 转成 "
< (小于) 转成 &lt;
> (大于) 转成 &gt;
只转换上面的特殊字符,并不会全部转换成 HTML 所定的 ASCII 转换。

防注入方法(https://blog.csdn.net/snow_love_xia/article/details/79782118)

12  RESTFUL API是一种接口规范

13、PHP语言的一大优势是跨平台,什么是跨平台?

PHP的运行环境最优搭配为Apache+mysql+PHP,此运行环境可以在不同操作系统(例如windows、linux等)上配置,不受操作系统的限制,所以叫跨平台

14. 安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?

①防远程提交(token机制);②防SQL注入,对特殊代码进行过滤;③防止注册机灌水,使用验证码;

15 慢查询日志

Slow Query日志,虽然帮助你记录了那些执行过了的SQL语句。但它不是万能的,意义可能没有你想象的那么大。它只告诉了你哪些语句慢,但是为什么慢?具体 原因,还是需要你自己去分析,不断的调试  。

其实通过慢查询日志来分析是一种比较简单的方式,如果不想看日志,可以借助工具来完成,

一个语句是否用到索引如何判断  explain sql