My Little World

learn and share


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于
My Little World

关于Performance API

发表于 2017-08-03

load/unload事件

load事件

当页面完全加载后(包括所有图像、JavaScript文件、CSS文件等外部资源),就会触发window上面的load事件
使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//方法一
var EventUtil = {
addHandler: function(element, type, handler){
if (element.addEventListener) {
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent("on" + type, handler);
} else {
element["on" + type] = handler;
}
}
}
}
EventUtil.addHandler(window,"load",function(event){
alert("loaded!");
});
//方法二
<!DOCTYPE html>
<html>
<head>
<title>load Event Example</title>
</head>
<body onload = "alert("Loaded!")">
</body>
</html>

document.ready 监控dom是否加载完毕,dom加载完毕时及资源加载之前触发
DOMContentLoaded 当页面的DOM树解析好并且需要等待js执行完才触发

unload事件

在文档被完全卸载后触发,只要用户切换到另一个页面,就会发生unload事件。
利用这个事件最多的情况是清除引用,以避免内存泄漏
使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//方法一
var EventUtil = {
getEvent: function (event) {
return event ? event : window.event;
},
addHandler: function (element, type, handler) {
if (element.addEventListener) {
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent("on" + type, handler);
} else {
element["on" + type] = handler;
}
}
};
EventUtil.addHandler(window, "unload", function (event) {
alert("Unloaded");
})
//方法二
<html>
<head>
<tilte>卸载(unload)事件</tile>
</head>
<body onunload="alert('Unload')">
</body>
</html>

Performance API

Performance 接口会给出某个页面的与时间相关的性能信息
使用方法为 window.performance.属性/方法

Performance API用于精确度量、控制、增强浏览器的性能表现。这个API为测量网站性能,提供以前没有办法做到的精度
目前,所有主要浏览器都已经支持performance对象,包括Chrome 20+、Firefox 15+、IE 10+、Opera 15+。

performance.timing

包含各种与浏览器性能有关的时间数据,提供浏览器处理网页各个阶段的耗时

  • navigationStart:当前浏览器窗口的前一个网页关闭,发生unload事件时的Unix毫秒时间戳。如果没有前一个网页,则等于fetchStart属性。即浏览器处理当前网页的启动时间
  • unloadEventStart:如果前一个网页与当前网页属于同一个域名,则返回前一个网页的unload事件发生时的Unix毫秒时间戳。如果没有前一个网页,或者之前的网页跳转不是在同一个域名内,则返回值为0。
  • unloadEventEnd:如果前一个网页与当前网页属于同一个域名,则返回前一个网页unload事件的回调函数结束时的Unix毫秒时间戳。如果没有前一个网页,或者之前的网页跳转不是在同一个域名内,则返回值为0。
  • redirectStart:返回第一个HTTP跳转开始时的Unix毫秒时间戳。如果没有跳转,或者不是同一个域名内部的跳转,则返回值为0。
  • redirectEnd:返回最后一个HTTP跳转结束时(即跳转回应的最后一个字节接受完成时)的Unix毫秒时间戳。如果没有跳转,或者不是同一个域名内部的跳转,则返回值为0。
  • fetchStart:返回浏览器准备使用HTTP请求读取文档时的Unix毫秒时间戳。该事件在网页查询本地缓存之前发生。
  • domainLookupStart:返回域名查询开始时的Unix毫秒时间戳。如果使用持久连接,或者信息是从本地缓存获取的,则返回值等同于fetchStart属性的值。
  • domainLookupEnd:返回域名查询结束时的Unix毫秒时间戳。如果使用持久连接,或者信息是从本地缓存获取的,则返回值等同于fetchStart属性的值。
  • connectStart:返回HTTP请求开始向服务器发送时的Unix毫秒时间戳。如果使用持久连接(persistent connection),则返回值等同于fetchStart属性的值。
  • connectEnd:返回浏览器与服务器之间的连接建立时的Unix毫秒时间戳。如果建立的是持久连接,则返回值等同于fetchStart属性的值。连接建立指的是所有握手和认证过程全部结束。
  • secureConnectionStart:返回浏览器与服务器开始安全链接的握手时的Unix毫秒时间戳。如果当前网页不要求安全连接,则返回0。
  • requestStart:返回浏览器向服务器发出HTTP请求时(或开始读取本地缓存时)的Unix毫秒时间戳。
  • responseStart:返回浏览器从服务器收到(或从本地缓存读取)第一个字节时的Unix毫秒时间戳。
  • responseEnd:返回浏览器从服务器收到(或从本地缓存读取)最后一个字节时(如果在此之前HTTP连接已经关闭,则返回关闭时)的Unix毫秒时间戳。
  • domLoading:返回当前网页DOM结构开始解析时(即Document.readyState属性变为“loading”、相应的readystatechange事件触发时)的Unix毫秒时间戳。
  • domInteractive:返回当前网页DOM结构结束解析、开始加载内嵌资源时(即Document.readyState属性变为“interactive”、相应的readystatechange事件触发时)的Unix毫秒时间戳。
  • domContentLoadedEventStart:返回当前网页DOMContentLoaded事件发生时(即DOM结构解析完毕、所有脚本开始运行时)的Unix毫秒时间戳。
  • domContentLoadedEventEnd:返回当前网页所有需要执行的脚本执行完成时的Unix毫秒时间戳。
  • domComplete:返回当前网页DOM结构生成时(即Document.readyState属性变为“complete”,以及相应的readystatechange事件发生时)的Unix毫秒时间戳。
  • loadEventStart:返回当前网页load事件的回调函数开始时的Unix毫秒时间戳。如果该事件还没有发生,返回0。
  • loadEventEnd:返回当前网页load事件的回调函数运行结束时的Unix毫秒时间戳。如果该事件还没有发生,返回0。

unloadEventStart 不等于navigationStart,navigationStart比unloadEventStart早
domComplete 等于 loadEventStart

performance.now()

performance.now方法返回当前网页自从performance.timing.navigationStart到当前时间之间的微秒数(毫秒的千分之一)。

performance.mark()

mark方法用于为相应的视点做标记。
window.performance.mark(‘mark_fully_loaded’);
clearMarks方法用于清除标记,如果不加参数,就表示清除所有标记。
window.peformance.clearMarks(‘mark_fully_loaded’);
window.performance.clearMarks();

performance.getEntries()

浏览器获取网页时,会对网页中每一个对象(脚本文件、样式表、图片文件等等)发出一个HTTP请求。performance.getEntries方法以数组形式,返回这些请求的时间统计信息,有多少个请求,返回数组就会有多少个成员.
由于该方法与浏览器处理网页的过程相关,所以只能在浏览器中使用。
window.performance.getEntries()[0] //获取第一个HTTP请求(即网页的HTML源码)的时间统计信息

performance.navigation对象

1、performance.navigation.type
该属性返回一个整数值,表示网页的加载来源,可能有以下4种情况:

  • 0:网页通过点击链接、地址栏输入、表单提交、脚本操作等方式加载,相当于常数performance.navigation.TYPE_NAVIGATENEXT。
  • 1:网页通过“重新加载”按钮或者location.reload()方法加载,相当于常数performance.navigation.TYPE_RELOAD。
  • 2:网页通过“前进”或“后退”按钮加载,相当于常数performance.navigation.TYPE_BACK_FORWARD。
  • 255:任何其他来源的加载,相当于常数performance.navigation.TYPE_UNDEFINED。

2、performance.navigation.redirectCount
该属性表示当前网页经过了多少次重定向跳转.
参考资料

页面请求加载过程

var t = performance.timing;

1、首先,在浏览器地址栏中输入url

2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。

3、在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址。
var dns = t.domainLookupEnd - t.domainLookupStart; //域名解析时间
4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。
var tcp = t.connectEnd - t.connectStart;//浏览器与服务器之间的连接建立时间
5、握手成功后,浏览器向服务器发送http请求,请求数据包。
t.requestStart 浏览器向服务器发出HTTP请求时(或开始读取本地缓存时)的时间
6、服务器处理收到的请求,将数据返回至浏览器

7、浏览器收到HTTP响应
var ttfb = t.responseStart - t.navigationStart;//读取页面第一个字节之前的耗时
8、读取页面内容,浏览器渲染,解析html源码
var getdata = t.responseEnd-t.responseStart;//接收数据时间
9、生成Dom树、解析css样式、js交互
var dom = t.domInteractive-t.domLoading; //从构建DOM到页面与用户可以开始交互的时间
var script= t.domContentLoadedEventEnd-t.domContentLoadedEventStart;//脚本运行时间
var load = t.loadEventEnd-t.loadEventStart;//load事件处理时间

10、客户端和服务器交互

11、ajax查询

步骤二详细步骤

  • 浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求;
  • 操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,获取操作系统的记录(保存最近的DNS查询缓存);
  • 路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存;
  • ISP缓存:若上述均失败,继续向ISP搜索。

浏览器渲染步骤

  • 解析html以构建dom树 分词器器、解析器
  • 构建render树
  • 布局render树
  • 绘制render树

渲染引擎开始解析html,并将标签转化为内容树中的dom节点。接着,它解析外部CSS文件及style标签中的样式信息。这些样式信息以及html中的可见性指令将被用来构建另一棵树——render树。

Render树由一些包含有颜色和大小等属性的矩形组成,它们将被按照正确的顺序显示到屏幕上。

Render树构建好了之后,将会执行布局过程,它将确定每个节点在屏幕上的确切坐标。再下一步就是绘制,即遍历render树,并使用UI后端层绘制每个节点

现代浏览器工作原理

Navigator 对象

包含有关浏览器的信息。
appCodeName 返回浏览器的代码名
appName 返回浏览器的名称
appVersion 返回浏览器的平台和版本信息
cookieEnabled 返回指明浏览器中是否启用 cookie 的布尔值
platform 返回运行浏览器的操作系统平台
userAgent 返回由客户机发送服务器的user-agent 头部的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
js 获取操作系统
function detectOS() {
var sUserAgent = navigator.userAgent;
var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");
var isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC") || (navigator.platform == "Macintosh") || (navigator.platform == "MacIntel");
if (isMac) return "Mac";
var isUnix = (navigator.platform == "X11") && !isWin && !isMac;
if (isUnix) return "Unix";
var isLinux = (String(navigator.platform).indexOf("Linux") > -1);
if (isLinux) return "Linux";
if (isWin) {
var isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 || sUserAgent.indexOf("Windows 2000") > -1;
if (isWin2K) return "Win2000";
var isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 || sUserAgent.indexOf("Windows XP") > -1;
if (isWinXP) return "WinXP";
var isWin2003 = sUserAgent.indexOf("Windows NT 5.2") > -1 || sUserAgent.indexOf("Windows 2003") > -1;
if (isWin2003) return "Win2003";
var isWinVista= sUserAgent.indexOf("Windows NT 6.0") > -1 || sUserAgent.indexOf("Windows Vista") > -1;
if (isWinVista) return "WinVista";
var isWin7 = sUserAgent.indexOf("Windows NT 6.1") > -1 || sUserAgent.indexOf("Windows 7") > -1;
if (isWin7) return "Win7";
}
return "other";
}

document.writeln("您的操作系统是:" + detectOS());

js判断浏览器

My Little World

关于CDN

发表于 2017-08-03

cdn 是一种从网络层面优化页面访问速度的手段
CDN服务商提供一项智能域名解析服务,这种智能DNS服务在浏览器发起域名查询时,会根据用户IP计算并返回离它最近的同网络CDN节点IP,引导浏览器与此节点建立连接以获取资源。
不同地区的用户访问同一个域名,依赖CDN服务商提供的智能域名解析服务得到不同CDN节点的IP地址
不同地区的用户会访问到离自己最近的相同网络线路上的CDN节点,当请求达到CDN节点后,节点会判断自己的内容缓存是否有效,如果有效,则立即响应缓存内容给用户,从而加快响应速度。如果CDN节点的缓存失效,它会根据服务配置去我们的内容源服务器获取最新的资源响应给用户,并将内容缓存下来以便响应给后续访问的用户。因此,一个地区内只要有一个用户先加载资源,在CDN中建立了缓存,该地区的其他后续用户都能因此而受益。
通过将静态资源缓存到离用户很近的相同网络运营商的CDN节点上,不但能提升用户的访问速度,还能节省服务器的带宽消耗,降低负载。
好的cdn服务到源服务器获取文件会通过专用的线路,这样就会比用户直接从源服务器获取资源快
cdn缓存技术原理

My Little World

常见页面布局小结

发表于 2017-08-03

圣杯布局

三栏布局,左右两栏宽度固定,中间一栏宽度随屏幕宽度自适应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<body>
<div id="header">#header</div>
<div id="container">
<div id="center" class="column">#center</div>
<div id="left" class="column">#left</div>
<div id="right" class="column">#right</div>
</div>
<div id="footer">#footer</div>
</body>

<style type="text/css">
body {
min-width: 550px; /* 2x LC width + RC width */
}
#container {
padding-left: 200px; /* LC width */
padding-right: 150px; /* RC width */
}
#container .column {
position: relative;/* 让左右两栏进行相对位移,位移到container的内边距位置 */
min-height: 200px;/* 高度自适应*/
float: left;
}
#center {
width: 100%;
background-color: #e9e9e9;
}
#left {
width: 200px; /* LC width */
right: 200px; /*LC width *//*相对于 container 的右边线向左偏移 200px 将自己位移到container内边距 */
margin-left: -100%;/*浮动到与中间平行 */
background-color: red;
}
#right {
width: 150px; /* RC width */
margin-right: -150px; /* RC width */
background-color: blue;
}
#footer {
clear: both;/*清除 footer 的上下环境,以免遭跟上面三栏一起浮动*/
}
#header,
#footer {
background-color: #c9c9c9;
}
</style>

圣杯1
圣杯2

flex 实现 圣杯布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<!doctype html>
<html>
<head>
</head>
<body>
<header>header</header>
<section>
<nav>nav</nav>
<article>article</article>
<aside>aside</aside>
</section>
<footer>footer</footer>
</body>
<style>
body{
display: flex;
flex-flow: column wrap;
justify-content:flex-start;
}
header,section,nav,aside,footer{
display: block;
}
header{
order: 1;
width: 100%;
min-height: 100px;
padding: 10px 20px;
background-color: antiquewhite;
}
section{
flex: 1;
order: 2;
min-width: 100%;
margin: 20px 0;
display: flex;
}
footer{
order: 3;
min-height: 60px;
min-width: 100%;
padding: 1%;
background-color: burlywood;
}
nav{
order:1;
width: 220px;
padding: 1%;
background-color: aquamarine;
}
article{
flex: 1;/* 可伸缩 */
order:2;
padding: 1%;
margin:0 2%;
background-color: blue;
word-break: break-all;
}
aside{
order:3;
width:220px;
padding: 1%;
background-color: aqua;
}

</style>
</html>

双飞翼布局

效果同圣杯布局,只是写法上DOM在center里面新增加了div,css不再使用relative定位,只是用float和外边距

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<div id="header">header</div>
<div id="container">
<div id="center" class="column">
<div id="innerCenter">center</div>
</div>
<div id="left" class="column">left</div>
<div id="right" class="column">right</div>
</div>
<div id="footer">footer</div>

<style type="text/css">
body {
min-width: 351px; /* LC width + RC width +1*/
}
#container .column {
min-height: 200px;
float: left;
}
#innerCenter { /*代替圣杯container的padding处理*/
margin-left: 200px;
margin-right: 150px;
}
#center {
width: 100%;
background-color: #e9e9e9;
}
#left {
width: 200px;
margin-left: -100%;
background-color: red;
}
#right {
width: 150px;
margin-left: -150px;
background-color: blue;
}
#footer {
clear: both;
}
#header, #footer {
background-color: #c9c9c9;
}

</style>

圣杯3
圣杯4

7种垂直居中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
1.tabel自带
<body>
<table class="parent">
<tr>
<td class="child">
一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字
</td>
</tr>
</table>
.parent{
border: 1px solid red;
height: 600px;
}

.child{
border: 1px solid green;
}
2.在水平居中部分的前后添加inline-block元素,高度100%,三个子元素,vertical-align:middle
<body>
<div class="parent">
<div class="child">
一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字
</div>
</div>
</body>
.parent{
border: 3px solid red;
height: 600px;
text-align: center;
}

.child{
border: 3px solid black;
display: inline-block;
width: 300px;
vertical-align: middle;
}

.parent:before{
content:'';
outline: 3px solid red;
display: inline-block;
height: 100%;
vertical-align: middle;
}
.parent:after{
content:'';
outline: 3px solid red;
display: inline-block;
height: 100%;
vertical-align: middle;
}
如果用标签元素,则前后元素类设置为.parent .after{},.parent .before{}

3.父元素position设置为相对定位relative,子元素位置相对父元素,设置为absolute,通过设置top和left 50%决定距离父元素上边和左边的距离,
再通过margin-top,margin-left为子元素高和宽的一半将子元素和父元素中心重合
<div class="parent">
<div class="child">
一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字
</div>
</div>
.parent{
height: 600px;
border: 1px solid red;
position: relative;
}
.child{
border: 1px solid green;
width: 300px;
height: 100px;
position: absolute;
top: 50%;
left: 50%;
margin:-50px 0 0 -150px;
}


4.父元素relative,子元素absolute,top和left均为 50%,transform:translate(-50%,-50%)
<div class="parent">
<div class="child">
一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字
</div>
</div>
.parent{
height: 600px;
border: 1px solid red;
position: relative;
}
.child{
border: 1px solid green;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
}

5.父元素relative,子元素absolute,子元素,上下左右都是0,margin:auto
<div class="parent">
<div class="child">
一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字
</div>
</div>
.parent{
height: 600px;
border: 1px solid red;
position: relative;
}
.child{
border: 1px solid green;
width: 300px;
position: absolute;
margin: auto;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
6.felx布局,父元素display:flex,justify-content:center;align-items:center
<div class="parent">
<div class="child">
一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字
</div>

</div>
.parent{
height: 600px;
border: 3px solid red;

display: flex;
justify-content: center;
align-items: center;
}
.child{
border: 3px solid green;
width: 300px;
}

清除浮动

1.在父元素上添加样式overflow:hidden/auto
2.给父元素设置高度或者添加float属性(使之成为浮动元素)
3.在子元素结尾添加空div标签或者br标签,或者给父元素添加:after伪类,设置属性clear:both

1
2
3
4
5
6
.clearfix::after{
content: ''; display: block; clear:both;
}
.clearfix{
zoom: 1; /* IE 兼容 */
}

多列布局

column-width —— 列宽,不设置时由其他属性决定
column-count —— 列数,不设置时由其他属性决定
columns —— column-width column-count

column-gap —— 列间距
column-rule —— 间距线,位于列间距中间,介于background和content之间,宽度大于列间距时消失
宽度 样式 颜色

column-fill —— 各列宽度
auto 随内容自动调整 |balance 以内容最多一列统一高度
column-span —— 子元素是否合并列
none/all

静态布局:尺寸不变,布局不变
自适应布局:为不同尺寸屏幕设计不同静态布局
流式布局:通过更改模块大小,保证整体布局
响应式布局:针对不同尺寸屏幕,设计不同流式布局
弹性布局:可以设置模块大小放缩保证布局,也可以固定模块大小,更改布局
各种布局概念区分
react涉及布局
相关资料
CSS布局 ——从display,position, float属性谈起

My Little World

使用QRcode.js生成二维码

发表于 2017-08-01

在页面中引入QRcode.js文件,再js部分进行定义
var qrcode = new QRCode(document.getElementById(“qrcode0”), { //qrcode0放置二维码容器的id
width : 150,//二维码大小
height : 150
});
qrcode.makeCode(url);//url,生成二维码的依据

My Little World

Angularjs 利用图片更换emoji表情

发表于 2017-08-01

在某些浏览器中,emoji表情不能正常显示,只能显示原始状态如下
erroremoji
为使表情正常显示,这里利用转码方法将emoji符号用图片替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//对数据$scope.data.remark做表情替换处理,$scope.data.remark是包含emoji符号的字符串
var str=$scope.data.remark;
str=str.replace(rep,function(code) { //code即匹配到的emoji符号,对该符号通过_escapeToUtf32(code)转码,得到对应图片名,然后图片替换
return '<img class="emoji" style="vertical-align:middle" src="assets/img/emoji/'+_escapeToUtf32(code) + '.png">';
})
$scope.data.remark = str;

//用emoji符号的unicode码匹配emoji符号,例如270c匹配 victory hand符号
var rep =/\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]|\u270c|\u261d/g;

//emoji 表情转码
function _escapeToUtf32(str) {
var escaped = [],
unicodeCodes = _convertStringToUnicodeCodePoints(str),
i = 0,
l = unicodeCodes.length,
hex;

for (; i < l; i++) {
hex = unicodeCodes[i].toString(16);
escaped.push('0000'.substr(hex.length) + hex);
}
return escaped.join('-');
}

function _convertStringToUnicodeCodePoints(str) {
var surrogate1st = 0,
unicodeCodes = [],
i = 0,
l = str.length;

for (; i < l; i++) {
var utf16Code = str.charCodeAt(i);
if (surrogate1st != 0) {
if (utf16Code >= 0xDC00 && utf16Code <= 0xDFFF) {
var surrogate2nd = utf16Code,
unicodeCode = (surrogate1st - 0xD800) * (1 << 10) + (1 << 16) + (surrogate2nd - 0xDC00);
unicodeCodes.push(unicodeCode);
}
surrogate1st = 0;
} else if (utf16Code >= 0xD800 && utf16Code <= 0xDBFF) {
surrogate1st = utf16Code;
} else {
unicodeCodes.push(utf16Code);
}
}
return unicodeCodes;
}

//Angularjs对字符串里面的html标签不会按照HTML去解析,会当做字符串显示,
//所以这里需要对字符串进行过滤,使字符串里面的标签能按照html解析

//新建过滤器trust2Html,这里使用$sce方法
app.filter('trust2Html', ['$sce',function($sce) {
return function(val) {
return $sce.trustAsHtml(val);
};
}])

//在页面里面显示经过图片替换的含emoji符号的字符串
<label ng-bind-html="data.remark|trust2Html"></label>

替换后结果
exactemoji
Emoji Unicode Tables

My Little World

探究jQuery.data

发表于 2017-07-30

jQuery.data用于处理标签数据绑定

使用方法

1.赋值

a.使用js
$(‘’).data(key,value); 一次赋值一个,value可以是任意js数据类型,包括Array 或者 Object
$(‘’).data(obj);一次赋值多个或者更新多个或者新增多个

b.使用HTML标签属性
利用H5 标签的’data-‘属性添加键值对

1
<div data-role="page" data-last-value="43" data-hidden="true" data-options='{"name":"John"}'></div>

2.取值
$(‘’).data(key);获取key对应的数据值
$(‘’).data(); 一次性获取绑定在$(‘’)上的所有数据对象

3.删除
$(‘’).removeData(key);

注意事项

a. <object>(除非是Flash插件),<applet> 或 <embed>> 三个标签不能使用.data方法

b. 通过”data-“属性建立的标签数据,获取时注意
data-last-value=”43” ==> $(‘div’).data(‘lastValue’)
data-options=’{“name”:”John”}’ ==> $(“div”).data(“options”).name ->John
取到的值会自动转化为js的数据类型

c. $(‘’).data()被赋值到js变量A后,之后对$(‘’)进行数据处理,A的内容会进行同步变动,
如果更改A的内容,$(‘’).data()也会同步更改
但如果$(‘’).data()的值被用到了html里面,HTML里面的值不会变动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<html>
<head>
<style>
div { color:blue; }
span { color:red; }
</style>
<script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
</head>
<body>
<div>
The values stored were
<span></span>
and
<span></span>
</div>
<script>
$("div").data("test", { first: 16, last: "pizza!" });
$("span:first").text($("div").data("test").first);
$("span:last").text($("div").data("test").last);
//页面输出 The values stored were 16 and pizza!
var temp = $("div").data();
console.log(temp);
$("div").data({ first: 25, last: "pizza!" ,test:{last:'fruit'}});
// $("span:first").text($("div").data("first"));
// $("span:last").text($("div").data("test").last);
//如果没有以上两句页面不会发生任何变化,添加后
//页面输出 The values stored were 25 and fruit
console.log(temp);//temp与$("div").data()保持一致
console.log($("div").data())
temp.child = 'Jack';
console.log($("div").data()) //增加一项{child: "Jack"}
$("div").removeData("blah");//删除没有的属性不会报错
$("div").removeData("child");
console.log(temp);
</script>
</body>
</html>

JQuery.data源码解析

My Little World

angular样式绑定ng-class

发表于 2017-06-25

ng-class命令可用于绑定不同的样式
使用方法即先在js中,定义样式集合
$scope.STATUS_NAME = [
{‘labelClass’: ‘label1’},
{‘labelClass’: ‘label2’},
{‘labelClass’: ‘label3’},
{‘labelClass’: ‘label4’}
];
对绑定对象赋值
angular.forEach($scope.data, function(data){
//对数组中每一项,根据status属性赋给labelclass属性样式集合中的值
data.labelClass = $scope.STATUS_NAME[data.status].labelClass;
});
在html中定义不同的样式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<style type="text/css">
.label1{
background-color:#87CEFA
}
.label2{
background-color:#90EE90
}
.label3{
background-color:#d2cd93
}
.label4{
background-color:#D3D3D3
}
</style>

在html中使用

1
2
3
<tr role="row" ng-repeat="item in data track by $index">
<td><span class="label" ng-class="item.labelClass">{{item.status_desc}}</span></td>
</tr>

My Little World

cookie和session

发表于 2017-05-26

cookie

设置cookie

1
2
3
4
5
6
7
8
9
bool setcookie  (
string $名字
[, string $值]
[, int $过期时间 = 0]
[, string $路径]
[, string $域名]
[, bool $安全 = false]
[, bool $http只读 = false]
);

参数 描述
$名字 必需。规定 cookie 的名称。
$值 可选。规定 cookie 的值。
$有效期 可选。规定 cookie 的有效期。
$路径 可选。规定 cookie 的服务器路径。
$域名 可选。规定 cookie 的域名。
$安全 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。
$http安读 可选。如果true,那么js就无法读取改cookie,增加安全性。

在服务端通过$_COOKIE[‘name’] 来读取cookie了。

使用cookie例子

session

session_start(); //开启session
$_SESSION[‘userName’] = ‘wang’; //添加session数据
$userName = $_SESSION[‘userName’]; //读取session数据
unset($_SESSION[‘XXX’]);//销毁单个session数据
$_SESSION = array();//销毁全部session数据
session_destory();//这个函数会销毁当前会话中的全部数据,并结束当前会话,但是不会重置当前会话所关联的全局变量,也不会重置会话 cookie

在php.ini配置文件中有这么一行 session.save_handler = files,
files,说明了php默认的是用文件读写的方式来保存session的
session.save_path = “/tmp”, “/tmp”即存储路径

使用session例子

curl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
//初始化
$ch = curl_init();
//设置选项,包括URL
curl_setopt($ch, CURLOPT_URL, "http://www.php.cn");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
//执行并获取HTML文档内容
$output = curl_exec($ch);
//释放curl句柄
curl_close($ch);
//打印获得的数据
print_r($output);
?>

函数 curl_setopt
参数1 curl资源变量
参数2 curl参数选项
参数3 curl参数值

CURLOPT_URL 这个参数选项规定了请求的url地址。
CURLOPT_RETURNTRANSFER curl请求后返回对应的结果 若需要返回值即为1。不需请求后返回的结果可设置为0。

如果是get请求,我们不需要设置发送的参数。在post等请求的时候,我们需要设置发送方法为post方法。并设置发送的数据。
CURLOPT_POST 值设为1是使用POST方法,0为不使用POST方法
CURLOPT_POSTFIELDS 设置传递的数据
//声明使用POST方式来进行发送
curl_setopt($ch, CURLOPT_POST, 1);
//发送什么数据呢
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

如果是https有的时候需要忽略https的安全证书。

CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST 两个参数改为false即忽略了证书。
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
CURLOPT_HEADER 决定是是否处理http的头信息,不接收处理的话可将这个值设置为0。
CURLOPT_TIMEOUT 设置请求的超时时间

$output = curl_exec($ch); 如果执行的结果有数据。使用curl_exec执行后,会将结果返回给$output变量。
curl_close($ch); 关闭curl资源。
curlget 截取页面例子
curlpost例子

My Little World

MySQL的基本知识

发表于 2017-05-26

五个基本单位

数据库服务器:指用来运行数据库服务的一台电脑
数据库:一个数据库服务器里面有可以有多个数据库。主要用来分类使用。
数据表:专门用来区分一个数据库中的不同数据
数据字段:也叫数据列,日常所见表格里面的列
数据行:真正的数据存在每一个表的行里面

语句类别

1.数据定义语言(DDL ,Data Defintion Language)语句:数据定义语句,用于定义不同的数据段、数据库、表、列、索引等。常用的语句关键字包括create、drop、alter等。
2.数据操作语言(DML , Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据的完整性。常用的语句关键字主要包括insert、delete、update和select等。
3.数据控制语言(DCL, Data Control Language)
语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。
这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke等。

操作语句

create database 数据库名; 创建数据库
show databases; 查看当前服务器有哪些数据库,显示所有数据库名
use 数据库名; 选中数据库,进入到相应的数据库中
show tables; 显示当前数据库下的所有表
drop database 数据库名; 删除数据库
create table 表名(字段名1 字段类型,….字段名n 字段类型n); 建表
desc 表名; 查看表结构,显示表中属性

show create table 表名 \G;
查看表的创建语句,“\G”选项的含义是使得记录能够按照字段竖着排列,对于内 容比较长的记录更易于显示。
可以看到表的 engine(存储引擎) 和 charset(字符集)等信息
在创建表的时候能够制定引擎
例
CREATE TABLE emp (
useraname varchar(10) DEFAULT NULL,
password date DEFAULT NULL,
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

drop table 表名; 删除表
alter table 表名 modify 字段名 类型字段; 修改表字段类型
alter table 表名 add column 字段名 类型; 增加表字段
alter table 表名 add 字段名2 字段类型 after 字段名1; 在字段名1后面增加字段名1
alter table 表名 add 字段名2 字段类型 first; 在最开始的位置增加字段
alter table 表名 drop column 字段名; 删除表字段
alter table 表名 change 字段原名 字段新名 字段类型; 表字段改名

alter table 旧表名 rename 新的表名; 修改表名

修改表字段排列顺序
在前的字段增加和修改语句(add/change/modify)中,最后都可以加一个可选项 first|after。

数据类型

整型

MySQL数据类型 所占字节 值范围
tinyint 1字节 -128~127
smallint 2字节 -32768~32767
mediumint 3字节 -8388608~8388607
int 4字节 范围-2147483648~2147483647
bigint 8字节 +-9.22*10的18次方
1.在创建表字段时,性别我们可以使用无符号的微小整型(tinyint)来表示。用0表示女、用1表示男。用2表示未知。
2.同样人类年龄也是,在创建表字段时可用用无符号的整型。因为人类的年龄还没有负数
3.在实际使用过程中。我们业务中最大需要存储多大的数值。我们创建表时,就选择什么样的类型来存储这样的值。

浮点类型

MySQL数据类型 所占字节 值范围
float(m, d) 4字节 单精度浮点型,m总个数,d小数位
double(m, d) 8字节 双精度浮点型,m总个数,d小数位
decimal(m, d) decimal是存储为字符串的浮点数
浮点是非精确值,会存在不太准确的情况,而decimal叫做定点数。
在MySQL内部,本质上是用字符串存储的。实际使用过程中如果存在金额、钱精度要求比较高的浮点数存储,建议使用decimal(定点数)这个类型

字符类型

MySQL数据类型 所占字节 值范围
CHAR 0-255字节 定长字符串
VARCHAR 0-255字节 变长字符串
TINYBLOB 0-255字节 不超过255个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65535字节 二进制形式的长文本数据
TEXT 0-65535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LOGNGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据
VARBINARY(M) 允许长度0-M个字节的定长字节符串 值的长度+1个字节
BINARY(M) M 允许长度0-M个字节的定长字节符串

时间类型

MySQL数据类型 所占字节 值范围
date 3字节 日期,格式:2014-09-18
time 3字节 时间,格式:08:42:30
datetime 8字节 日期时间,格式:2014-09-18 08:42:30
timestamp 4字节 自动存储记录修改的时间
year 1字节 年份

复合类型

MySQL数据类型 说明 举例
set 集合类型 set(“member”, “member2″, … “member64″)
enum 枚举类型 enum(“member1″, “member2″, … “member65535″)
一个 ENUM 类型只允许从一个集合中取得一个值;而 SET 类型允许从一个集合中取得任意多个值。

常用中文字符集

gbk_chinese_ci 简体中文, 不区分大小写
utf8_general_ci Unicode (多语言), 不区分大小写
mysql在写utf-8的时候写的是utf8。不加中间的中横线

存储引擎

使用show engines命令可显示当前服务器支持的所有引擎
引擎名称
MyISAM 常用。读取效率很高的引擎
InnoDB 常用。写入,支持事处等都支持
Archive 不常用。归档引擎,压缩比高达1:10,用于数据归档
NDB 不常用。主要在MySQL 集群服务器中使用,

行锁:写入、更新操作的时候将这一行锁起来,不让其他人再操作了。
表锁:写入、更新操作时,将表给锁起来不让其他人再操作了。
事务:同时操作多个数据,若其中的一个数据操作失败。可回滚到操作之前。常用于银行、电商、金融等系统中

MyISAM
不支持事务,表锁(表级锁,加锁会锁住整个表),支持全文索引,操作速度快。常用于读取多的业务。
myisam存储引擎表由myd和myi组成。.myd用来存放数据文件,.myi用来存放索引文件。
对于myisam存储引擎表,mysql数据库只缓存其索引文件,数据文件的缓存由操作系统本身来完成。

InnoDB
支持事务,主要面向在线事务处理(OLTP)方面的应用。
行锁设计,支持外键,即默认情况下读取操作不加锁。

索引

1.普通索引 最基本的索引,它没有任何限制
alter table 表 add index(字段)

2.唯一索引 某一行企用了唯一索引则不准许这一列的行数据中有重复的值。针对这一列的每一行数据都要求是唯一的
alter table 表 add UNIQUE(字段)

3.主键索引 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,常用于用户ID。类似于书中的页码
alter table 表 add PRIMARY KEY(字段)

4.全文索引 对于需要全局搜索的数据,进行全文索引
alter table 表 add FULLTEXT(字段)

创建表时可在创建表语句后加上对应的类型即可声明索引:
CREATE TABLE test (
id INT NOT NULL ,
username VARCHAR(20) NOT NULL ,
password INT NOT NULL ,
content INT NOT NULL ,
PRIMARY KEY (id),
INDEX pw (password),
UNIQUE (username),
FULLTEXT (content)
) ENGINE = InnoDB;

插入记录

方法一:
insert into 表 values(值1,值2,值n);
表中有多少个字段就必须要插入多少个值。一个不能多,一个也不能少。若有默认值,不想传,可以写上null。
顺序应该和表字段的排序一致。
方法二:
insert into 表(字段1,字段2,字段n) values(值1,值2,值n);
除非有必填字段必须要写入值外。如果有默认值的不想写可以忽略不写。mysql会自动补主默认值。
以表(字段1,字段2,字段n)字段顺序为值的顺序。
基本语法变形:一次插入多条记录
INSERT INTO user(username,password,sex)
values(‘ll’, ‘abcdef’, 1),
( ‘loe’, ‘bcdeef’, 0),
( ‘key’, ‘123456’, 1),
(‘tom’, ‘987654’, 1);

查询

select from 表; 查询表中所有字段中的所有结果,”“ 是一种正则表达式的写法,表示匹配所有
select 字段1[,字段2,字段n] from 表; 指定字段查询
select distinct 字段 from 表; 查询单个字段不重复记录 distinct
select 字段 from 表 where 条件; 条件查询 where,条件可以是逻辑比较运算符的比较式

select 字段 from 表 order by 字段 排序关键词; 查询结果按照字段排序关键词排序
排序关键词:
asc 升序排列,从小到大(默认)
desc 降序排列,从大到小

select 字段 from 表 order by 字段1 排序关键词,… …字段n desc|asc;
order by 后面可以跟多个不同的字段排序,并且排序字段的不同结果集的顺序也不同,
如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序。

select 字段 from 表 limit 数量; 对于查询或者排序后的结果集,如果希望只显示一部分而不是全部,使用 limit 关键字结果集数量限制。
select 字段 from 表 order by 字段 关键词 limit 数量; 限制结果集并排序
select 字段 from 表 limit 偏移量,数量; 结果集区间选择,偏移量从0开始,0是第一条数据
select 函数(字段) from 表; 从表中将按字段查询的结果进行函数处理
函数
sum 求和
count 统计总数
max 最大值
min 最小值
avg 平均值

select from 表 group by 字段; 将表中数据按字段分组
select
from 表 group by 字段 having 条件; 分组结果再过滤。having 是筛选组 而where是筛选记录
例:统计省份数量后再进行分组显示: select count(province),province from money group by province;

整体的SQL语句配合使用的语法结构如下:
SELECT
[字段1 [as 别名1],[函数(字段2) ,]……字段n]
FROM 表名
[WHERE where条件]
[GROUP BY 字段]
[HAVING where_contition]
[order 条件]
[limit 条件]
例
查询money表字段:id,username,balance,province 要求id>1 余额大于50,使用地区进行分组。我们使用用户id进行降序,要求只准显示3条。
select id,username,balance,province from money where id > 1 and balance > 50 group by province order by id desc limit 3;

多表联合查询

内连接

将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。
基本语法1:
select 表1.字段 [as 别名],表n.字段 from 表1 [别名],表n where 条件;
取满足条件的数据的在各表中的各字段
例
select user.uid ,user.username as username,order_goods.oid,order_goods.uid,order_goods.name as shopname from user,order_goods where user.uid = order_goods.uid;
若表user中某条数据x的uid与表order_goods中的某条数据y的uid相同,则取出user表中数据x的 uid、username,取出order_goods中数据y的uid,name,其中order_goods的name的值以shopname的值显示
基本语法2:
select 表1.字段 [as 别名],表n.字段 from 表1 INNER JOIN 表n on 条件;
例
select user.uid ,user.username as username,order_goods.oid,order_goods.uid,order_goods.name as shopname from user inner join order_goods on user.uid = order_goods.uid;
效果同基本语法1

## 外连接
会选出其他不匹配的记录,分为外左联结和外右联结。
左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录
select 表1.字段 [as 别名],表n.字段 from 表1 LEFT JOIN 表n on 条件;
例
select * from user left join order_goods on user.uid = order_goods.uid;
以左边user为主,查询哪些用户未购买过商品,并将用户信息显示出来,user表全部显示

右连接:包含所有的右边表中的记录甚至是右边表中没有和它匹配的记录
select 表1.字段 [as 别名],表n.字段 from 表1 right JOIN 表n on 条件;
例
select * from user right join order_goods on user.uid = order_goods.uid;
查询商品表中哪些用户购买过商品,并将用户信息显示出来,order_goods全部显示

子查询

需要的条件是另外一个select语句的结果,即使用子查询
用于子查询的关键字包括in、not in、=、!=、exists、not exists等。
select 字段 from 表 where 字段 in(条件)
例
select * from user where uid in (select uid from order_goods);
从order_goods取出uid这一列,将uid在user中对应的数据取出来

记录联合

使用 union 和 union all 关键字,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示。
union all 把结果直接合并在一起
union 是将 union all 后的结果进行一次distinct,去除重复记录后的结果。

修改

使用update
update 表名 set 字段1=值1,字段2=值2,字段n=值n where 条件;
例
update emp set balance=balance-500 where userid = 15;
将emp表中userid为15的数据的balance减15
同时对两个表进行更新
update 表1,表2 set 字段1=值1,字段2=值2,字段n=值n where 条件
例
update money m,user u m.balance=m.balanceu.age where m.userid=u.id;
修改money,将money表的别名设置为m;user表的别名设置为u;将m表的余额改为m表的balance
用户表的age。执行条件是:m.userid = u.id

删除

用delete
DELETE FROM 表 [where 条件];
删除时如果不加where条件,会清空掉整个表的记录,返回被删除的记录数

清空表 如果使用,
truncate table 表名;
表中若有自增字段,这个自增字段会将起始值恢复成1

权限

添加权限

grant 权限 on 库.表 to ‘用户‘@’主机’ identified by ‘密码’;
grant select, insert on test.* to ‘liwenkai‘@’localhost’ identified by ‘4311’;
给予liwenkai用户,在本机连接test库所有表的权限。操作的这些表具有查询和写入权限

删除权限

revoke 权限 on 库.表 from ‘用户‘@’主机’;
revoke select, insert on test.* to ‘liwenkai‘@’localhost’ identified by ‘4311’;
给予liwenkai用户,在本机连接test库所有表的权限。操作的这些表具有查询和写入权限

参数说明

grant all 在grant后接all说明给予所有权限
revoke all 在revoke后接all说明删除所有权限
权限 on . . 所明给予所有库所有表的操作权限
‘用户‘@’主机’ 主机里面若为%。任意来源的主机均可以使用这个用户来访问

My Little World

php中MySQL的使用

发表于 2017-05-26

php连接数据库

查看数据库主机,用户名
use myaql;
select Host from user;
select user from user;

连接数据库服务器

mysql_connect函数
$con = mysql_connect(“localhost”,”peter”,”abc123”);
参数1 主机
参数2 数据库服务器登陆名
参数3 密码
参数4 数据库的名称
参数5 数据库服务器端口不填默认3306

若参数4,数据库名称在此步已填并择,不需要执行第三步

判断链接是否正常

如果有错误,存在错误号
if (mysql_errno($conn)) {
echo mysql_error($conn);
exit;
}

mysql_errno 返回连接错误号,无错误返回0
参数1 传入mysql_connect返回的资源

mysql_error 返回连接错误字符串
参数1 传入mysql_connect返回的资源

选择数据库

mysql_select_db函数
mysql_select_db(‘user’,$conn);
参数1 传入mysql_connect返回的资源
参数2 需要连接的数据库名

设置字符集

mysql_set_charset
mysql_set_charset(‘utf8’,$conn);
参数1 字符集类型
参数2 传入mysql_connect返回的资源

准备SQL语句

要传入数据库的操作语句
注意参数如何拼接

如果是int类型的就使用
$sql=”insert into user(mycon) values(“.$my_con.”)”;
//或者
$sql=’insert into user(mycon) values(‘.$my_con.’)’;

如果是字符型的就要使用单引号或者双引号括起来
$sql=”insert into user(mycon) values(‘“.$my_con.”‘)”;
//或者这样写
$sql=’insert into user(mycon) values(“‘.$my_con.’”)’;

多个
$sql = “INSERT INTO user (username,password,createtime,createip)
values
(‘“ . $username . “‘,’” . $password . “‘,” . $time . “,’” . $ip . “‘)”;

发送SQL语句

$result = mysql_query($sql,$conn);

根据不同操作,判断执行是否正常或者遍历数据

发送的是select类别的语句,通常需要将结果输出显示出来。就需要用到遍历显示数据的函数
函数 mysql_fetch_array
功能 得到result结果集中的数据,返回数组进行便利
参数1 传入查询出来的结果变量
参数2 传入MYSQLI_NUM返回索引数组,MYSQLI_ASSOC返回关联数组,MYSQLI_BOTH返回索引和关联

函数 mysql_fetch_assoc
功能 得到result结果集中的数据,返回关联数组进行便利
参数1 传入查询出来的结果变量

函数 mysql_fetch_row
功能 得到result结果集中的数据,返回索引数组进行便利
参数1 传入查询出来的结果变量

函数 mysql_fetch_object
功能 得到result结果集中的数据,返回对象进行遍历
参数1 传入查询出来的结果变量

函数 mysql_num_rows
功能 返回查询出来的结果总数
参数1 传入查询出来的结果变量

函数 sql_num_rows
功能 返回查询出来的结果总数
参数1 传入查询出来的结果变量

如果发送的是insert的语句,通常需要得到是否执行成功,或者同时拿到自增的ID。
函数 mysqli_fetch_field
功能 遍历数据行
参数1 传入查询出来的结果变量

如果发送的是update和delete类别的语句。只需要判断是否执行成功即可。

if ($result) {
echo ‘成功’;
} else {
echo $sql;//查看是否是SQL语句拼接有问题
echo ‘失败’;
}

关闭数据库

函数 mysqli_close
功能 关闭数据库连接
参数1 传入mysqli_connect返回的资源

mysql_close($conn);//关闭数据库

显示服务器信息函数

函数 mysqli_get_server_info
功能 返回服务器信息
参数1 传入mysqli_connect返回的资源

函数 mysqli_get_server_version
功能 返回服务器版本
参数1 传入mysqli_connect返回的资源

一个用户注册的代码链接

数据显示乱码终极解决办法

多个不同的文件系统中一定要统一编码。
9个要点分别是:
1.html编码与MySQL编码一致
2.PHP编码与MySQL编码一致
3.若有header头发送字符集,请与数据库一样
如果php中有header头,一定要是utf-8的
header(‘content-type:text/html;charset=utf-8’);
4.<meta http-equiv=“Content-Type”content=“text/html; charset=utf-8” />要和页面的文字编码一致
5.数据库建库的字符集要统一
6.表的字符集要统一
7.列的字符集要统一(表设了,列就默认写表的)
8.连接,校验的字符集要统一
通过mysqli_set_charset(‘utf8’)来MySQL连接、结果和校验的字符集设置。
注:数据库的字符集声明和文件中的略有不同。utf8为mysql数据库的,utf-8为文件中使用的
9.结果集的字符集要统一

1…202122…29
YooHannah

YooHannah

287 日志
1 分类
25 标签
RSS
© 2026 YooHannah
由 Hexo 强力驱动
主题 - NexT.Pisces