1. GET和POST的区别
区别:
Get从服务器获取数据,Post向服务器传送数据
Get传值在url中可见,Post在url中不可见
Get传值一般在2KB以内,Post传值大小可以在php.ini中进行设置
Get安全性非常低,Post安全性较高,执行效率却比Post高
建议:
get式安全性较Post式要差些包含机密信息建议用Post数据提交式;
做数据查询建议用Get式;做数据添加、修改或删除建议用Post方式
2. SESSION和COOKIE的区别
cookie数据存放在客户的浏览器上,session数据放在服务器上。
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
3. SESSION多服务器间共享
服务器实现的 session 复制或 session 共享,如 webSphere或 JBOSS 在搭集群时配置实现 session 复制或 session 共享.致命缺点:不好扩展和移植。
利用成熟技术做session复制,如12306使用的gemfire,如常见内存数据库redis或memorycache,虽较普适但依赖第三方.
将 session维护在客户端,利用 cookie,但客户端存在风险数据不安全,且可以存放的数据量较小,所以将session 维护在客户端还要对 session 中的信息加密。
第二种方案和第三种方案的合体,可用gemfire实现 session 复制共享,还可将session 维护在 redis中实现 session 共享,同时可将 session 维护在客户端的cookie 中,但前提是数据要加密。
4. 浏览器禁用cookie后php如何保持session会话
可以用隐藏表单手动带上sessid
在使用session时,服务器会发送sessionid,标志为PHPSESSID(这个关键字可以在php.ini文件中配置),我们可以在超链接传输地址参数时,把PHPSESSID带上/或者带上常量sid,sid是php中sessionid的常量,一般sid的格式为PHPSESSID=6ibdh4timhdpi14acq1ianqte6,以key=value键值对方式记录,value是session文件的名称,可以在启动session之前,指定sessionid
if (isset($_GET['PHPSESSID'])){
session_id($_GET['PHPSESSID']);
}
session_start();
5. Redis
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势:性能极高 丰富的数据类型 原子性 丰富的特性。
6.什么是存储过程?用什么来调用? MySQL存储过程
7. 数据库优化
(1)选择正确的存储引擎(2)优化字段的数据类型(3)为搜索字段添加索引(4)只返回需要的字段,避免使用Select *(5)使用 ENUM 而不是 VARCHAR(6)尽可能的使用 NOT NULL(7)固定表的长度(8)数据分页处理(9)减少交互次数(10)使用存储过程(11)防止SQL注入(11)提高SQL可读性(12)Like模糊查询
8. HTTP协议
基于客户端/服务端(C/S)的架构模型,是一个无状态的请求/响应协议,通过URL进行数据传输和建立连接。
客户端请求格式:请求行(request line)、请求头部(header)、空行和请求数据。
服务器响应分别是:状态行、消息报头、空行和响应正文。
HTTP请求方法:GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE 和 CONNECT。
HTTP状态码:1**(信息), 2**(成功), 3**(重定向), 4**(客户端错误), 5**(服务器错误)
HTTP content-type(内容类型).
9. 微信开发
1. 微信运行机制
公众号与php之间用什么语言通信:Xml
如何接收公众号数据的:
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//接收数据 XML数据
2. 消息类型
微信目前提供了7种基本消息类型,分别为:
(1)文本消息(text);(2)图片消息(image);(3)语音(voice)(4)视频(video)(5)地理位置(location);(6)链接消息(link);(7)事件推送(event)类型。掌握不同的消息类型发送时的数据传递格式
10. PHP7新特性
10PHP 7 异常
11. 浏览器数据库
随着浏览器的处理能力不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少用户等待从服务器获取数据的时间。
一、localStorage — 本地存储 可以长期存储数据,没有时间限制。
可以存储 :数组、json数据、图片、脚本、样式文件
function test(){
if(window.localStorage){//判断浏览器是否支持 localStorage
var ls=window.localStorage;
ls.setItem("name","张三");//设置值
var name= ls.getItem("name");//取值
ls.removeItem("name");//删除数据
}else{
alert('浏览器不支持 localStorage');
}
}
存在的局限性: 子域名之间不能共享存储数据;超出存储范围后可以使用 LRU、FIFO 技术处理;
二、sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了。
三、IndexedDB
1、使用IndexedDB的原因
现有的浏览器端数据储存方案,都不适合储存大量数据:cookie不超过4KB,且每次请求都会发送回服务器端;Window.name属性缺乏安全性,
且没有统一的标准;localStorage在2.5MB到10MB之间(各家浏览器不同)。所以,需要一种新的 解 决方案,这就是IndexedDB诞生的背景。
2、什么是IndexedDB
通俗地说,IndexedDB就是浏览器端数据库,可以被网页脚本程序创建和操作。它允许储存大量数据,提供查找接口,还能建立索引。
这些都是localStorage所不具备的。就数据库类型而言,IndexedDB不属于关系型数据库(不支持SQL查询语 句),更接近NoSQL数据库。
3、IndexedDB的特点。
(1) 键值对储存。 IndexedDB内部采用对象仓库(object store)存放数据。所有类型的数据都可以直接存入,包括JavaScript对象。在对象仓库中,
数据以“键值对”的形式保存,每一个数据都有对应的键名,键名是独一无二的,不能有重复,否则会抛出一个错误。
(2)异步。 IndexedDB操作时不会锁死浏览器,用户依然可以进行其他操作,这与localStorage形成对比,后者的操作是同步的。异步设计是为了防止大量数据的读写,拖慢网页的表现。
(3)支持事务。 IndexedDB支持事务(transaction),这意味着一系列操作步骤之中,只要有一步失败,整个事务就都取消,数据库回到事务发生之前的状态,不存在只改写一部分数据的情况。
(4)同域限制 IndexedDB也受到同域限制,每一个数据库对应创建该数据库的域名。来自不同域名的网页,只能访问自身域名下的数据库,而不能访问其他域名下的数据库。
(5)储存空间大 IndexedDB的储存空间比localStorage大得多,一般来说不少于250MB。IE的储存上限是250MB,Chrome和Opera是剩余空间的某个百分比,Firefox则没有上限。
(6)支持二进制储存。 IndexedDB不仅可以储存字符串,还可以储存二进制数据。
目前,Chrome 27+、Firefox 21+、Opera 15+和IE 10+支持这个API,但是Safari完全不支持。
IndexedDB是HTML5规范里新出现的浏览器里内置的数据库。对于在浏览器里存储数据,你可以使用cookies或local storage,但它们都是比较简单的技术,而IndexedDB提供了类似数据库风格的数据存储和使用方式。存储在IndexedDB里的数据是永久保存,不像cookies那样只是临时的。IndexedDB里提供了查询数据的功能,在online和offline模式下都能使用。你可以用IndexedDB存储大型数据。
IndexedDB里数据以对象的形式存储,每个对象都有一个key值索引。IndexedDB里的操作都是事务性的。一种对象存储在一个objectStore里,objectStore就相当于关系数据库里的表。IndexedDB可以有很多objectStore,objectStore里可以有很多对象。每个对象可以用key值获取。
IndexedDB vs LocalStorage
IndexedDB和LocalStorage都是用来在浏览器里存储数据,但它们使用不同的技术,有不同的用途,你需要根据自己的情况适当的选择使用哪种。LocalStorage是用key-value键值模式存储数据,但跟IndexedDB不一样的是,它的数据并不是按对象形式存储。它存储的数据都是字符串形式。如果你想让LocalStorage存储对象,你需要借助JSON.stringify()能将对象变成字符串形式,再用JSON.parse()将字符串还原成对象。但如果要存储大量的复杂的数据,这并不是一种很好的方案。毕竟,localstorage就是专门为小数量数据设计的,它的api是同步的。
IndexedDB很适合存储大量数据,它的API是异步调用的。IndexedDB使用索引存储数据,各种数据库操作放在事务中执行。IndexedDB甚至还支持简单的数据类型。IndexedDB比localstorage强大得多,但它的API也相对复杂。
对于简单的数据,你应该继续使用localstorage,但当你希望存储大量数据时,IndexedDB会明显的更适合,IndexedDB能提供你更为复杂的查询数据的方式。
IndexedDB vs Web SQL
WebSQL也是一种在浏览器里存储数据的技术,跟IndexedDB不同的是,IndexedDB更像是一个NoSQL数据库,而WebSQL更像是关系型数据库,使用SQL查询数据。W3C已经不再支持这种技术。具体情况请看:http://www.w3.org/TR/webdatabase/。
因为不再支持,所以你就不要在项目中使用这种技术了。
IndexedDB vs Cookies
Cookies(小甜点)听起来很好吃,但实际上并不是。每次HTTP接受和发送都会传递Cookies数据,它会占用额外的流量。例如,如果你有一个10KB的Cookies数据,发送10次请求,那么,总计就会有100KB的数据在网络上传输。Cookies只能是字符串。浏览器里存储Cookies的空间有限,很多用户禁止浏览器使用Cookies。所以,Cookies只能用来存储小量的非关键的数据。
IndexedDB的用法
想要理解IndexedDB,最好的方法是创建一个简单的web应用:把你们班的学生的学号和姓名存储在IndexedDB里。IndexedDB里提供了简单的增、删、改、查接口。
打开一个IndexedDB数据库
首先,你需要知道你的浏览器是否支持IndexedDB。请使用最新版的谷歌浏览器或火狐浏览器。低版本的IE是不行的。
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
if(!window.indexedDB)
{
console.log("你的浏览器不支持IndexedDB");
}
一旦你的浏览器支持IndexedDB,我们就可以打开它。你不能直接打开IndexedDB数据库。IndexedDB需要你创建一个请求来打开它。
var request = window.indexedDB.open("testDB", 2);
第一个参数是数据库的名称,第二个参数是数据库的版本号。版本号可以在升级数据库时用来调整数据库结构和数据。
但你增加数据库版本号时,会触发onupgradeneeded事件,这时可能会出现成功、失败和阻止事件三种情况。
var db;
request.onerror = function(event){
console.log("打开DB失败", event);
}
request.onupgradeneeded = function(event){
console.log("Upgrading");
db = event.target.result;
var objectStore = db.createObjectStore("students", { keyPath : "rollNo" });
};
request.onsuccess = function(event){
console.log("成功打开DB");
db = event.target.result;
}
onupgradeneeded事件在第一次打开页面初始化数据库时会被调用,或在当有版本号变化时。所以,你应该在onupgradeneeded函数里创建你的存储数据。如果没有版本号变化,而且页面之前被打开过,你会获得一个onsuccess事件。如果有错误发生时则触发onerror事件。如果你之前没有关闭连接,则会触发onblocked事件。
在上面的代码片段里,我们创建了一个Object Store,叫做“students”,用“rollNo”做数据键名。
往ObjectStore里新增对象
为了往数据库里新增数据,我们首先需要创建一个事务,并要求具有读写权限。在indexedDB里任何的存取对象的操作都需要放在事务里执行。
var transaction = db.transaction(["students"],"readwrite");
transaction.oncomplete = function(event) {
console.log("Success");
};
transaction.onerror = function(event) {
console.log("Error");
};
var objectStore = transaction.objectStore("students");
objectStore.add({rollNo: rollNo, name: name});
从ObjectStore里删除对象
删除跟新增一样,需要创建事务,然后调用删除接口,通过key删除对象。
db.transaction(["students"],"readwrite").objectStore("students").delete(rollNo);
我把语句合并到了一起,变得更简单,但效果是一样的。
通过key取出对象
往get()方法里传入对象的key值,取出相应的对象。
var request = db.transaction(["students"],"readwrite").objectStore("students").get(rollNo);
request.onsuccess = function(event){
console.log("Name : "+request.result.name);
};
更新一个对象
为了更新一个对象,首先要把它取出来,修改,然后再放回去。
var transaction = db.transaction(["students"],"readwrite");
var objectStore = transaction.objectStore("students");
var request = objectStore.get(rollNo);
request.onsuccess = function(event){
console.log("Updating : "+request.result.name + " to " + name);
request.result.name = name;
objectStore.put(request.result);
};
13.三层结构
所谓三层体系结构,是在客户端与数据库之间加入了一个中间件层,也叫组件层。这里所 说的三层体系,不是指物理上的三层,不是简单地放置三台机器就是三层体系结构,也 不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层,即使这三个层放置到一 台机器上。 三层体系的应用程序将业务规则、数据访问、合法性校验等工作放到了中 间层进行处理。通常情况下,客户端不直接与数据库进行交互,而是通过COM/DCOM通 讯与中间层建立连接,再经由中间层与数据库进行交换。
概念
表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、查找等。
优点
无需开发客户端软件,维护和升级方便。
可跨平台操作。
具有良好的开放性和可扩充性。
便于数据库移植。
安全性好
资源重用性好。
缺点
有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
相对于不分层的编程方法,使用三层或多层架构的应用于程序运行效率低,代码量大,难度增加。