PHP总结
1.Web服务器的分类:
(1)静态Web服务器:
提供的内容在任何时间由任何人访问都是完全相同的!
所包含技术:HTML、CSS、JS、Flash、Gif、音视频
常见的静态Web服务器:
Apache Http
Microsoft IIS
NginX
(2)动态Web服务器:
提供的内容在不同时间由不同人访问是变化的!
所包含的技术:
JSP = HTML + Java
PHP = HTML + Php
ASP.NET = HTML + C#
Node.js = HTML + NodeJS
2.搭建PHP服务器
(1)服务器端:下载并安装一款静态Web服务器
C:\xampp\apache\bin\httpd.exe
(2)服务器端:下载并安装PHP语言的解释器
C:\xampp\php\php.exe
推荐使用软件套装(如XAMPP/WAMP等)完成上述两步
(3)服务器端:编写网页,保存在htdocs目录
C:\xampp\htdocs\
(4)服务器端:启动Web服务器,等待客户端发起请求
确保80端口被httpd.exe占用
------------------------------------------
(5)客户端:向服务器发起请求,获取服务器端响应内容
http://服务器的域名或IP地址:80
http://127.0.0.1:80 127.0.0.1指代当前计算机
3.PHP基础语法:
运算法:字符串拼接: . .=
逻辑结构:
foreach:
foreach(数组名 as 值变量名){}
foreach(数组名 as 下标变量名=>值变量名){} foreach($list as $k=>$v){ }
函数的使用:
注意:函数内默认是无法使用外部的全局变量的!必须用global声明一下才可以使用!
$x=10;
function f1(){
global $x;
}
4.PHP常用语句:
PHP提供了大量的应用函数,查找手册’函数参考’
PHP为了连接MySQL数据库,提供了多套函数,比如:
mysql_connect() 早期的函数库
mysqli_connect() improved,mysql 库的性能升级版
a)连接到MySQL服务器
$conn=mysqli_connect(...);
b)发送SQL命令提交给MySQL服务器
$result=mysqli_query($conn,$sql);
c)查看MySQL服务器返回的执行结果
if($result){...}
d)关闭连接
mysqli_close($conn)
5.PHP常用函数:
a) @... 放在一行的开头,用于压制此行的警告消息
b) die(...) 终止页面的执行,输出一个错误消息
c) mysqli_insert_id($conn) 返回刚刚执行的insert语句产生的自增编号
d) mysqli_affected_rows($conn) 返回刚刚执行的DML语句影响的行数
e) mysqli_fetch_row($conn) 从结果集中抓取一行(索引数组)
f) mysqli_fetch_assoc($conn) 从结果集中抓取一行(关联数组)
g) mysqli_fetch_all($result,MYSQLI_ASSOC)从结果集中抓取所有记录行
h) require('x.php') 在当前位置包含指定文件中的内容
6.mysqli_query()的返回值
1)DML: insert delete update
失败:false
成功:true
2)DQL:select
失败:false
成功:查询结果集描述对象
7.SQL语句的分类
(1)DDL: Data Define Language,数据定义语言——定义列
Create(创建表) drop(删除表) alter(修改表) truncate(清空)rename(重命名)
(2)DML: Data Manipulate Language,数据操作语言——操作行
Insert(增加) delete(删除) update(修改)
(3)DQL: Data Query Language,数据查询语言
Select(查询数据)
(4)DCL: Data Control Language,数据控制语言——控制用户权限
grant:授予权限/revoke:收回权限
(5)事务控制
Commit(提交) rollback(回滚) savepoint(设置保存点)
commit:提交 insert(插入)执行完成.如果想真正执行
数据库中,需要commit操作.该数据才完全插入到数据库中.如果没有执行commit,当前插入到数据库,关掉终端在此打开就不存在
8.URL地址
URL:Unified Resource Locator,统一的资源定位符
URN:Unified Resource Naming,统一的资源命名符
URI:Unified Resource Idenfier,统一的资源识别符
9.面试题:HTTP/1.0到HTTP/1.1有哪些改进?
(1)虚拟主机:在一个Web服务器中并存多个站点
Host: tmooc.cn
(2)持久连接:一次请求完成后,不要马上断开连接,再保持一会儿
Connection: keep-alive
(3)代理连接:客户端可以通过代理服务器间接访问目标服务器
Proxy: xxxx
10.HTTP协议的具体内容,规定了如下两种消息的格式:
(1)请求消息: 客户端发给服务器的
(2)响应消息: 服务器发给客户端的
11.
GET请求和POST请求的比较 | ||
| GET | POST |
如何发起 | 浏览器中输入URL回车、超链接跳转、JS跳转、SRC/HREF属性请求、GET方式提交表单、AJAX-GET | POST方式提交表单、AJAX-POST |
请求数据的位置 | 追加在URI后,作为查询字符串,以?开头 | 放在请求主体中 |
请求数据的类型 | 只能是文本字符 | 可以是任意类型,如包含图片、视频等 |
能否用于上传文件 | 否 | 能 |
请求数据长度限制 | 有,浏览器/服务器对请求URI长度有限制(如1KB、4KB等) | 请求主体没有长度限制! |
请求数据需编码? | 需要!一个UTF-8汉字编码为9个字节 | 需要!一个UTF-8汉字编码为9个字节 |
表达的语义 | 表客户端想获取 | 表客户端想传递 |
12.MIME: (Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
13.如何修改响应消息的头部
(1)修改Web服务器的配置文件
比较复杂,有些情况下无法修改,如新浪云服务器
(2)若响应文件是HTML,则可以声明<meta http-equiv="响应头部">
仅适用于HTML文件,且只是“等价物”,并非真正的响应头部
(3)使用动态语言代码来控制响应消息头部
如PHP: //设置一个响应消息头部
header('Cache-Control: no-cache');
header('Content-Type: image/png');
14.根据HTTP协议的知识进行网站访问优化 有哪些方案?
(1)域名解析
尽可能减少域名解析次数——减少跨站外部资源的引用
(2)创建连接
努力减少连接创建次数——启用持久连接避免重复连接
(3)发送请求
尽力减少请求次数——合理设置缓存、资源合并
(4)等待响应
提高服务器端运行速度——提高数据运算及查询速度
(5)接收响应
尽可能减小响应数据长度——启用压缩
15.使用AJAX的步骤(底层AJAX写法就这两种,下面那些是关于不同传值方式的写法)
(1)创建XHR对象
var xhr = new XMLHttpRequest();
(2)监听服务器返回响应消息事件
(3)使用XHR连接到Web服务器
(4)使用XHR对象发起异步的HTTP请求消息
16.使用XHR发起两种请求之一——GET
//1 var xhr = new XMLHttpRequest();
//2 xhr.onreadystatechange = function(){}
//3 xhr.open('GET', 'x.php?k=v&k=v', true)
//4 xhr.send(null);
17.使用XHR发起两种请求之二——POST
//1 var xhr = new XMLHttpRequest();
//2 xhr.onreadystatechange = function(){}
//3 xhr.open('POST', 'x.php', true)
//3.5 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
//4 xhr.send('k=v&k=v')
18.
服务器如何返回批量的复合数据给客户端? 复合数据:一个数据有多个属性 批量复合数据:有多个复合数据 —— 二维数组 |
方式1:用text/plain格式 101#三星#35.5#1.jpg@102#闪迪#34.5#2.jpg@金士顿#... 好处:简单 不足:不易读取、很容易出错 |
方式2:用text/html格式 <tr><td>101</td><td>三星</td><td>35.5</td></tr> <tr><td>102</td><td>闪迪</td><td>35.5</td></tr> <tr><td>103</td><td>金士顿</td><td>35.5</td></tr> 好处:情形,方便使用 tbody.innerHTML = xhr.responseText 不足:把数据和格式混在一起,限制了数据的应用场合 |
方式3:用application/xml格式 <productList> <product pid="101"> <pname>三星</pname> <price>35.5</price> <pic>1.jpg</pic> </product> <product pid="102"> <pname>闪迪</pname> <price>34.5</price> <pic>2.jpg</pic> </product> </ productList> 好处:是纯数据,不附带任何的显示格式限制 不足:太复杂了,阅读和解析都太麻烦 |
方式3:用application/json格式 [ { "pid":"101", "pname":"三星", "price":35.5, "pic":"1.jpg" }, { "pid":"102", "pname":"闪迪", "price":34.5, "pic":"2.jpg" } ] 有点:简单、易于阅读,处理速度快! |
19.HTML和XML的区别——面试题
HTML语法随意;XML语法严格;
HTML标签预定义好了;XML标签都是自定义的;
HTML用于描述网页的结构;XML标签用于描述数据;
20.使用AJAX接收五种响应消息:
(1)text/plain
服务器端:
header('Content-Type: text/plain');
echo 'succ';
客户端:
if(xhr.responseText==='succ'){ ... }
(2)text/html
服务器端:
header('Content-Type: text/html');
echo "<tr><td>$data</td></tr>";
客户端:
tbody.innerHTML = xhr.responseText
(3)application/javascript
服务器端:
header('Content-Type: application/javascript');
echo "alert($data); f1(); f2($data)";
客户端:
eval( xhr.responseText )
(4)application/xml
服务器端:
header('Content-Type: application/xml');
echo "<bookList><book>$b</book></bookList>";
客户端:
var document = xhr.responseXML
(5)application/json
服务器端:
header('Content-Type: application/json');
//echo "[ {"bname":"","price":35.5},{} ]";
$list = ...;
echo json_encode($list);
客户端:
var obj = JSON.parse( xhr.responseText )
21.面试题:如何使用jQuery的AJAX相关函数,监听失败的响应消息??——使用万能AJAX封装函数:$.ajax
22.使用jQuery的AJAX封装函数之六——$.ajax()——重点
使用方法:
$.ajax( {
type: 'GET', //POST/PUT/DELETE...
url: 'x.php',
data: 'k=v&k=v', //{k:v, k:v}
beforeSend: fn, //在请求发送前的回调
success: fn, //响应成功后的回调
error: fn, //响应失败后的回调
complete: fn //响应完成后(不论成败)的回调
} )
成功的调用: beforeSend() => success() => complete()
失败的调用: beforeSend() => error() => complete()
对应于原生AJAX: //1 var xhr = new XMLHttpRequest(); //2 xhr.onreadystatechange = function(){ if(xhr.readyState===4){ if(xhr.status===200){ success(); }else { error(); } complete() } } //3 xhr.open() beforeSend(); //4 xhr.send() |
23.JS中如何处理JSON字符串
把JSON格式的字符串解析为JS对象:
var str = '{"ename":"Tom", "age":20}';
var obj = JSON.parse(str); //方法1
var obj = eval( '('+str+')' ); //方法2,不推荐使用
把JS对象编码为JSON字符串:
var obj = {ename:'Tom', age: 20};
var str = JSON.stringify(obj);
-ify: 使变为..., sheepify stoneify frogify
=================================
PHP中把数组编码为JSON字符串:
$list = [{},{},{}];
$str = json_encode( $list );
PHP中JSON字符串解析为PHP数组/对象:
$str = '{"ename":"Tom", "age":20}';
$obj = json_decode( $str );
24.异步请求涉及到跨域请求的问题:
面试题:跨域请求和JSONP
Cross Domain Request:从一个资源请求另一个资源,二者所在的请求地址不同,域名不同、端口号不同、请求协议不同。
提示:localhost和127.0.0.1也算跨域!
浏览器允许跨域请求的情形:
IMG、LINK、SCRIPT、IFRAME ...
浏览器禁止跨域请求的情形:
XHR —— 浏览器处于安全考虑,禁用了XHR的跨域请求(其实服务器给出了响应消息,但浏览器不让使用)
面试题:我们公司项目很大,页面很多,出于性能考虑,把静态资源(html等)放在http://static.cn服务器上了,把动态资源(php)放在http://dynamic.cn服务器上了,如何让一个x.html异步请求x.php呢? |
如何解决浏览器的XHR跨域请求限制 —— 八种方案:
(1)
(2)
(3)
(4)
(5)
(6)
(7) 修改响应消息头部,添加Access-Control-Allow-Origin头部
(8) 使用JSONP——非常巧妙
JSON: JavaScript Object Notation,是一种字符串数据格式(羊肉)。
JSONP:JSON with Padding,填充式JSON,与JSON完全两码事,是一种使用JSON数据的方式(把羊肉红烧)。意思是在JSON字符串左右添加函数名: doResponse( {"ename":"Tom", "age":20} );
JSONP是专用于解决XHR跨域限制一种手段。基本原理:使用动态创建的一个SCRIPT标签代替XHR发起异步请求,要求服务器必须返回application/javascript,立即在客户端执行——要执行的函数本体在客户端浏览器中声明。
<script src="x.php" async></script>
25.jQuery中如何使用JSONP发起异步请求:
(1) $.getJSON()
用途1:使用XHR发起异步请求(不能跨域)
$.getJSON('x.php', doResponse)
用途2:使用JSONP发起跨域异步请求
$.getJSON('http://跨域地址/x.php?callback=?', doResponse)
(2) $.ajax()
用途1:使用XHR发起异步请求(不能跨域)
$.ajax({ })
用途2:使用JSONP发起跨域异步请求
$.ajax({ dataType: 'jsonp' })
26.JS和CSS加载外部资源的路径问题
JS是运行于HTML网页中,JS中请求的资源的路径使用相对于HTML文件的路径;
CSS是独立被浏览器解释,CSS中使用外部资源(如图片)路径使用相对于CSS文件的路径;
27..表单序列化
$('#formId').serialize( );
jQuery中提供的表单序列化函数,可以把选定的表单中所有带name属性的输入域连同值转换为k=v形式,全部使用&符号拼接在一起,组成一个大的字符串,用于异步请求数据提交。
28.Web项目中的分页查询 —— 难点 & 重点
当一个页面需要呈现的数据很多时,不可能一次性全部显示,必须使用分页显示:
初始时显示第1页,用户点击某个页号,异步请求对应页中的内容。
分页查询客户端提交的请求消息形如:
GET /select.php?pageNum=3 HTTP/1.1
分页查询服务器返回的响应消息形如:
{
recordCount: 36,//满足条件的记录的总数
pageSize: 8,//页面大小,每页最多显示的记录数
pageCount: 5, //总的页数
pageNum: 3,//当前显示的页号
data: [ {},{}...{} ]//当前页中的数据
}
(1)MySQL如何查询出符合条件的总的记录数量
SELECT COUNT(*) FROM jd_product WHERE...;
查询结果集中有一行一列的数据
(2)PHP如何计算页面的总数量:
ceil( recordCount / pageSize ) //上取整函数
(3)MySQL如何实现查询指定页面中的记录
提示:不同的数据库实现分页查询的SQL各不相同!
SELECT * FROM jd_product WHERE ... LIMIT start, count;
LIMIT: 限制,结果集中从哪一行开始获取数据(从0开始),最多要多少行。
第1页: LIMIT 0, 8 01234567
第2页: LIMIT 8, 8 89101112131415
第3页: LIMIT 16, 8
第4页: LIMIT 24, 8
第5页: LIMIT 32, 8
第pageNum页:
LIMIT (pageNum-1)*pageSize, pageSize
1 2 3
1 2 3 4
1 2 3 4 5
2 3 4 5
3 4 5
29.关系型数据库中两个表间的关系——数据设计理论
(1)一对一关系
可以在任一表中添加引用对方表的外键列
(2)一对多关系
部门vs员工、板块vs帖子、商品vs留言、分类vs商品
只能在多方表中添加外键列,引用一方的主键
(3)多对多关系
商品vs购物车、学生vs课程、工人vs车间、员工vs项目
只能再创建一个中间表,有两个外键列,分别指向每个表的主键
30.如何访问异步加载的页头和页尾中的元素:
事件绑定: 可以委托给DOM树上已有的父元素
HTML内容操作:
$(...).load('x.php', function(){
//异步请求完成后,再处理后加载的DOM元素
})
31.SQL中的多表查询
CREATE TABLE dept( did INT, dname VARCHAR(32) );
INSERT INTO dept VALUES
(10, '研发部'),
(20,'市场部');
CREATE TABLE emp( eid INT, ename VARCHAR(32), deptId INT );
INSERT INTO emp VALUES
(1, 'Tom', 10),
(2,'Mary', 10),
(3,'John', 20);
请查询出每个员工姓名及其所在部门名称:
SELECT ename, dname FROM emp, dept; //该语句会得到一个笛卡尔积:从每个表中任取一行记录,与另一表中的每一行记录匹配,配对总可能数:m * n
SELECT ename, dname FROM emp, dept
WHERE deptId = did;
跨表查询:查询得到的结果集来自于多个表!为了避免产生笛卡尔积,必须有两个表的相等条件!