| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> PHP知识库 -> php面试整理 -> 正文阅读 |
|
[PHP知识库]php面试整理 |
php面试整理*什么是操作系统?知道那些概念(来源于百度): 操作系统( *什么是面向对象? 面向对象说到底就是一种思想,任何事物都可以看作是一个对象。在有些面试题目中也称之为OOP(Object Oriented Programming)。 面向对象主要的思想是:封装,继承,多态,抽象。
面向对象内容
对象的主要三个特性
preg_match — 进行正则表达式匹配。语法: int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] ) 在 subject 字符串中搜索与 pattern 给出的正则表达式相匹配的内容。如果提供了 matches ,则其会被搜索的结果所填充。 m a t c h e s [ 0 ] 将 包 含 与 整 个 模 式 匹 配 的 文 本 , matches[0] 将包含与整个模式匹配的文本, matches[0]将包含与整个模式匹配的文本,matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。 Cookie 是什么?如何取回 Cookie 的值?cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。 语法
取回 PHP 的 $_COOKIE 变量用于取回 cookie 的值。
Session 的工作机制为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。
php关键词*****变量作用域,什么是引用变量?在php中用什么符号定义引用变量?PHP 变量作用域变量的作用域是脚本中变量可被引用/使用的部分。 PHP 有四种不同的变量作用域:
引用变量概念: ? 在PHP中,引用意味着用不同的名字访问同一个变量内容。 定义方式: ? 使用 & 符号 延伸:PHP引用变量的原理1赋值:? 将一个变量的值赋值给另一个变量,其中一个变量的值进行改变,会重新进行拷贝,此时会再开辟一个新的内存空间。
原理: ? 使用了 COW(Copy On Write)机制 : 对
2引用:? 两个变量无论何时都共用一个内存空间(对其中一个的值进行更改的时候,不会开辟新的内存空间)
原理:
3
|
当前页面url | 被请求页面url | 是否跨域 | 原因 |
---|---|---|---|
http://www.test.com/ | http://www.test.com/index.html | 否 | 同源(协议、域名、端口号相同) |
http://www.test.com/ | https://www.test.com/index.html | 跨域 | 协议不同(http/https) |
http://www.test.com/ | http://www.baidu.com/ | 跨域 | 主域名不同(test/baidu) |
http://www.test.com/ | http://blog.test.com/ | 跨域 | 子域名不同(www/blog) |
http://www.test.com:8080/ | http://www.test.com:7001/ | 跨域 | 端口号不同(8080/7001) |
在服务端填上响应头:
response.addHeader(‘Access-Control-Allow-Origin:*’);//允许所有来源访问
response.addHeader(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式
原理:
? ajax
本身是不可以跨域的,通过产生一个script
标签来实现跨域。因为script
标签的src
属性是没有跨域的限制的。其实设置了dataType: 'jsonp'
后,$.ajax
方法就和ajax XmlHttpRequest
没什么关系了,取而代之的则是JSONP
协议。JSONP
是一个非官方的协议,它允许在服务器端集成Script tags
返回至客户端,通过javascript callback
的形式实现跨域访问。
在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,即一般的ajax
是不能进行跨域请求的。但 img、iframe 、script
等标签是个例外,这些标签可以通过src
属性请求到其他服务器上的数据。利用<script>
标签的开放策略,我们可以实现跨域请求数据,当然这需要服务器端的配合。 Jquery
中ajax
的核心是通过 XmlHttpRequest
获取非本页内容,而jsonp
的核心则是动态添加<script>
标签来调用服务器提供的 js
脚本。
ajax的跨域写法:
//原生js
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<script type="text/javascript">
function jsonpCallback(result) {
//alert(result);
for(var i in result) {
alert(i+":"+result[i]);//循环输出a:1,b:2,etc.
}
}
var JSONP=document.createElement("script");
JSONP.type="text/javascript";
JSONP.src="http://crossdomain.com/services.php?callback=jsonpCallback";
document.getElementsByTagName("head")[0].appendChild(JSONP);
</script>
//jQuery+Ajax
$.ajax({
type : "GET",
async : false,
url : "http://a.a.com/a/FromServlet?userName=644064",
dataType : "jsonp",//数据类型为jsonp
jsonp : "jsonpCallback",//服务端用于接收callback调用的function名的参数
success : function(data) {
alert(data["userName"]);
},
error : function() {
alert('fail');
}
});
//后端servlet
String jsonpCallback = request.getParameter("jsonpCallback");
//构造回调函数格式jsonpCallback(数据)
resp.getWriter().println(jsonpCallback+"("+jsonObject.toJSONString()+")");
//服务端PHP代码 (services.php):
function api_jsonp_encode($json)
{
if (!empty($_GET['callbak'])) {
return $_GET['callbak'] . '(' . $json . ')'; // jsonp
}
return $json; // json
}
原理:
? 若想在B站点中通过Ajax
访问A站点获取结果,固然有ajax
跨域问题,但在B站点中访问B站点获取结果,不存在跨域问题,这种方式实际上是在B站点中ajax
请求访问B站点的HttpClient
,再通过HttpClient
转发请求获取A站点的数据结果。但这种方式产生了两次请求,效率低,但内部请求,抓包工具无法分析,安全。
$.ajax({
type : "GET",
async : false,
url : "http://b.b.com:8080/B/FromAjaxservlet?userName=644064",
dataType : "json",
success : function(data) {
alert(data["userName"]);
},
error : function() {
alert('fail');
}
});
//服务端
@WebServlet("/FromAjaxservlet")
public class FromAjaxservlet extends HttpServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
//创建默认连接
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建HttpGet对象,处理get请求,转发到A站点
HttpGet httpGet = new HttpGet("http://a.a.com:8080/A/FromServlet?userName="+req.getParameter("userName"));
//执行
CloseableHttpResponse response = httpClient.execute(httpGet);
int code = response.getStatusLine().getStatusCode();
//获取状态
System.out.println("http请求结果为:"+code);
if(code == 200){
//获取A站点返回的结果
String result = EntityUtils.toString(response.getEntity());
System.out.println(result);
//把结果返回给B站点
resp.getWriter().print(result);
}
response.close();
httpClient.close();
} catch (Exception e) {
}
}
}
www.a.a.com不能直接请求www.b.b.com的内容,可以通过nginx,根据同域名,但项目名不同进行区分。什么意思呢?这么说可能有点抽象。假设我们公司域名叫www.nginxtest.com
当我们需要访问www.a.a.com通过www.nginxtest.com/A访问,并通过nginx转发到www.a.a.com
当我们需要访问www.b.b.com通过www.nginxtest.com/B访问,并通过nginx转发到www.a.a.com
我们访问公司的域名时,是"同源"的,只是项目名不同,此时项目名的作用只是为了区分,方便转发。如果你还不理解的话,先看看我是怎么进行配置的:
server {
listen 80;
server_name www.nginxtest.com;
location /A {
proxy_pass http://a.a.com:81;
index index.html index.htm;
}
location /B {
proxy_pass http://b.b.com:81;
index index.html index.htm;
}
}
我们访问以www.nginxtest.com开头且端口为80的网址,nginx将会进行拦截匹配,若项目名为A,则分发到a.a.com:81。实际上就是通过"同源"的域名,不同的项目名进行区分,通过nginx拦截匹配,转发到对应的网址。整个过程,两次请求,第一次请求nginx服务器,第二次nginx服务器通过拦截匹配分发到对应的网址。
sudo // 超级用户
su // 用于切换当前用户身份到其他身份,变更时需输入所要变更的用户账号与密码。
chmod // 用来变更文件或目录的权限
setfacl // 设置文件访问控制列表
w // 用于显示已经登陆系统的用户列表,并显示用户正在执行的指令。
top // 可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。
ps // 用于报告当前系统的进程状态。
kill // 用来删除执行中的程序或工作。
pkill // 可以按照进程名杀死进程。
pstree // 以树状图的方式展现进程之间的派生关系,显示效果比较直观。
killall // 使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程。
id // 可以显示真实有效的用户ID(UID)和组ID(GID)。
usermod // 用于修改用户的基本信息。
useradd // 用于 Linux中创建的新的系统用户。
groupadd // 用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。
userdel // 用户删除给定的用户,以及与用户相关的文件。若不加选型,则进删除用户账号,而不删除相关文件。
mount // 用户加载文件系统到指定的加载点。
umount // 用于卸载已经加载的文件。
fsck // 用于检查并且试图修复文件系统中的错误。
df // 用于显示磁盘分区上的可使用的磁盘空间。
du // 对文件和目录磁盘使用的空间的查看。
shutdown // 关机
reboot // 重启
curl // 是一个利用URL规则在命令行下工作的文件传输工具。
telnet // 用于登录远程主机,对远程主机进行管理。
mail // 命令行的电子邮件发送和接收工具。
elinks // 能实现一个纯文本界面的WWW浏览器,操作方式与"lynx"类似。
ping // 用于测试主机之间网络的连通性。
netstat // 用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况。
host // 常用的分析域名查询工具,可以用来测试域名系统工作是否正常。
hostname // 用于显示和设置系统的主机名称。
ifconfig // 被用于配置和显示Linux内核中网络接口的网络参数。
ssh // 时openssh套件中的客户端连接工具,可以给予ssh加密协议实现安全的远程登录服务器。
screen // 是一款由GNU计划开发的用于命令行终端切换的自由软件。
clear // 用于清除当前屏幕终端上的任何信息。
who // 显示当前登录系统的用户信息。
date // 显示或设置系统时间与日期。
yum // 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
rpm // rpm软件包的管理工具。
apt-get // Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个包管理系统。deb包可以把一个应用的文件包在一起,大体如同 Windows上的安装文件。
locate // 用来查找文件或目录。
find // 用来在指定目录下查找文件。
head // 用于显示文件的开头的内容。在默认情况下,head命令显示文件的头10行内容。
tail // 用于输入文件中的尾部内容。tail命名默认在屏幕上显示指定文件的末尾10行。
more // 用来浏览文件档案的内容(只能向前浏览)。
less // 用来浏览文字档案的内容,允许用户向前或向后浏览文件。使用该命令时,用PageUp键向上翻页,用PageDown键向下翻页。要退出less程序,应按Q键。
unlink // 用于系统调用函数 unlink 去删除指定的文件。
rename // 用字符串替换的方式批量改变文件名。
cat // 连接文件并打印到标准输出设备上,cat经常用来显示文件的内容。
touch // 有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建新的空文件。
ln // 用来为文件创建连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用"-s"选项(注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限时没有意义的)
cd // 用来切换工作目录至 dirname。
mv // 用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。
rm // 可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉。
pwd // 以绝对路径的方式显示用户当前工作目录。
tree // 以树状图列出目录的内容。
cp // 用来将一个或过个源文件或者目录复制到指定的目的文件或目录。
ls // 用来显示目录列表,在 Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以区分不同类型的文件。
setfacl // 用来变更文件或目录的权限。
chmod // 设置文件访问控制列表。
chgrp // 用来改变文件或目录所属的用户组。
chown // 改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者。或者改变所属的组。(用户可以是用户或者是用户ID,用户组可以是组名或组ID。文件可以是由空格分开的文件列表,在文件名中可以包含通配符)【只有文件主和超级用户才可以使用该命令】
ftp // 用来设置文件系统相关功能。
scp // 用于在Linux下远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system 时,用 scp 可以帮你把文件移出来。另外,scp还非常节省资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync 比 scp 会快一点,但当小文件众多的情况下,rsync 会导致硬盘 I/O 非常高,而 scp 基本不影响系统正常使用。
contab -e // 创建定时任务
* * * * * 命令 // 分、时、日、月、周(每过多长时间去执行,根据我们所设置的分、时、日、月、周)
# at 2:00 tomorrow // 在明天的两点去执行
at>/home/Jason/do_job // 执行结果是这种格式的
at>Ctrl + D // 退出
#总体意思,明天两点执行 do_job,最终退出
切换 编辑模式:i、I、a、A、o、O、r、R
切换 命令行模式::、/、?
【:w】:保存文件
【:w!】:若文件为只读,强制保存文件
【:q】:退出 vi
【:q!】:不保存,强制退出 vi
【:wq】:保存并退出
【:wq!】:强制保存,并退出
【:set nu】:显示行号
【:set nonu】:取消显示行号
【Ctrl + F】 :到下一页
【Ctrl + B】 :到上一页
【[0] 或者功能键 [Home]】:光标移动到当前行的最前面
【[$] 或者功能键 [End]】:光标移动到当前行的末尾
【G】:光标移动到文件的最后一行(第一个字符处)
【gg】:光标移动到文件的第一行,相当于 “1G”
【N + [Enter]】:光标向下移动 n 行
/word:在文件中查找内容为 word 的字符串(向下查找)
?word:在文件中查找内容为 word 的字符串(向上查找)
:n1, n2s/word1/word2/g:n1,n2 为数字,在第 n1 行到第 n2 行之间查找 > word1,并将其替换成 word2
:1,$s/word1/word2/g:从第一行(第n行同理)到最后一行查找 word1 注册,并替换成 word2
:1,$s/word1/word2/gc:功能同上,只不过每次替换时都会让用户确认
【x】:向后删除一个字符,相当于**【Delete】**
【X】:向前删除一个字符,相当于**【Backspace】**
【dd】:删除光标所在的一整行
【ndd】:删除光标所在的向下 n 行
【yy】: 复制光标所在的那一行
【nyy】:复制光标所在的向下 n 行
【p】:为将已将复制的数据在光标下一行粘贴
【P】:为将已将复制的数据在光标上一行粘贴
【Ctrl + r】:多次撤销
【v】:将光标经过的地方反白选择
【V】:将光标经过的行反白选择
【Ctrl + v】:块选择,可用长方形的方式选择文本
【y】:将反白的地方复制到剪贴板
【d】:将反白的内容删除
【:set nu】:显示行号
【:set nonu】:取消显示行号
1)赋予权限,直接执行,例:chmod + x test.sh; ./test.sh
2)调用解释其使得脚本执行,例:bash、csh、ash、bsh、ksh等等
3)使用source命令,例:source test.sh
1)开头用 #! 指定脚本解释器,例如:#!/bin/sh
2)编写具体功能
? 关于SQL语句的注意事项:
1、SQL语句中的 [ ] 中的内容为可选,可以写也可以不写。
2、每个SQL语句句末的分号可以写也可以不写。
3、SQL语句对大小写不敏感,大写小写都行。-- 为注释符号。
4、除了汉字,所有的SQL语句必须是英文状态下输入的才行,不然会报错。
5、数据库名、表名或字段名上的``符号(我叫它斜引号),这个符号不是单引号,而是tab键上面的那个键的符号,这个符号可写可不写。如果你的数据库名、表名或字段名是一个特殊字符或者关键字时,就需要带上这个符号。
CREATE DATABASE [IF NOT EXISTS] 数据库名;
DROP DATABASE [IF EXISTS] 数据库名;
USE 数据库名;
SHOW DATABASE;#查看所有的数据库。
SHOW CREATE DATABASE 数据库名;#查看某个已创建的数据库。
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 编码方式 COLLATE 编码方式_bin;
类型名 | 描述 |
---|---|
tinyint | 十分小的数据,只占1个字节 |
smallint | 较小的数据,占2个字节 |
mediumint | 中等大小的数据,占3个字节 |
int | 标准的整数,占4个字节(常用) |
bigint | 较大的数据,占8个字节 |
float | 浮点数,占4个字节 |
double | 浮点数,占8个字节 |
decimal | 字符串形式的浮点数,占8个字节 |
类型名 | 描述 |
---|---|
char | 固定的字符串大小,范围0~255 |
varchar | 可变字符串,范围0~65535(常用) |
tinytext | 微型文本,范围2^8-1 |
text | 文本串,范围2^16-1 |
类型名 | 描述 |
---|---|
date | 日期,格式为YY-MM-DD |
time | 时间,格式为HH:mm:ss |
datetime | 日期与时间,格式为YY-MM-DD HH:mm:ss (常用) |
timestamp | 时间戳,从1970年1月1日到现在的毫秒数 |
year | 年份 |
Unsigned: Unsigned属性,指无符号的整数,如果声明了该属性,则该字段对应的列的数据不能为负数。
zerofill: zerofill属性,指0填充,即不足的位数用0来填充。
自增: 自动在上一条记录的基础上加1(默认),一般用来设置唯一的主键。可以自定义自增的起始值和步长。
非空: 如果设置为not null,则必须填写值,否则会报错;如果设置为null,可以不填写值,则默认值为null。
默认: 设置为默认的值,如果不指定该列的值,则会有默认值。
? 概念:对数据库表中的一列或多列的值进行排序后的一种结构。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
? 优点:提高表中数据的查询速度。
? 缺点: 同时会降低更新表的速度,建立索引会占用磁盘空间的索引文件。
-- 创建表时创建
CREATE TABLE [IF NOT EXISTS] 表名 (字段名 数据类型 [索引类型] INDEX [别名] (字段名)|KEY [别名] (字段名) );
-- 已存在的表上创建索引
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名 ON 表名 (字段名 [长度] [ASC|DESC]);
-- 用ALTER TABLE已存在的表上创建索引
ALTER TABLE 表名 ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名 (字段名 [长度] [ASC|DESC]);
-- 删除索引
DROP INDEX 索引名 ON 表名;
-- 用ALTER TABLE删除索引
ALTER TABLE 表名 DROP INDEX 索引名;
-- 显示索引信息
SHOW INDEX FROM 表名\G
CREATE TABLE [IF NOT EXISTS] `表名` (
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
...
`字段名` 列类型 [属性] [索引] [注释]
)[表的类型] [字符集设置] [注释];
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(10) NOT NULL auto_increment COMMENT '学号',
`name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`age` INT(3) NOT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- `id`: 字段名(列名),要用斜引号``,在tab键上方
-- INT(10): 列类型与长度
-- NOT NULL: 非空
-- auto_increment: 自增
-- COMMENT: 注释,后面是字符串,要用单引号或双引号
-- PRIMARY KEY: 设置字段`id`为主键,即学号为主键
-- 注意:每个字段之间需要用逗号隔开
-- 修改表名
ALTER TABLE 旧表名 RENAME AS 新表名
-- 增加表的字段
ALTER TABLE 表名 ADD 字段名 列类型
-- 修改表的字段约束
ALTER TABLE 表名 MODIFY 字段名 列类型 [类属性]
-- 修改表的字段名(重命名)
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 [列类型] [列属性]
-- 删除表的字段
ALTER TABLE 表名 DROP 字段名
-- 删除表
DROP TABLE [IF EXISTS] 表名
? DML语言,即数据库操作语言,包括数据的插入、修改与删除操作,即insert、update、delete。
-- 插入多条数据
INSERT INTO 表名([字段名1],[字段名2],[字段名3],...) VALUES(值1,值2,值3,...)
-- 插入单条数据
INSERT INTO 表名 VALUES(值1,值2,值3,...)
-- 修改多条数据
UPDATE 表名 SET 字段名1=值1,字段名2=值2,... WHERE 条件语句
-- 修改单条数据
UPDATE 表名 SET 字段名=值 WHERE 条件语句
--删除表的所有数据
DELETE FROM 表名
--删除指定的数据
DELETE FROM 表名 WHERE 条件语句
操作符 | 含义 |
---|---|
= | 等于 |
<> 或 != | 不等于 |
> | 大于 |
< | 小于 |
>= | 大等于 |
<= | 小等于 |
BETWEEN … AND … | 在某个范围内 |
AND | 用于连接多个条件,相当于 && |
OR | 用于连接多个条件,相当于 ll |
-- 查询全部记录
SELECT * FROM 表名
-- 查询指定字段
SELECT 字段名1,字段名2,字段名3,... FROM 表名
-- 查询指定字段,并设置别名,别名不需要加引号
SELECT 字段名1 AS 别名1,字段名2 AS 别名2,字段名3 AS 别名3 FROM 表名
-- 去重查询,去掉重复的记录
SELECT DISTINCT 字段名 FROM 表名
SELECT DISTINCT 字段名1,字段名2,字段名3,... FROM 表名
SELECT ... FROM 表名 WHERE 条件语句
-- AND关键字
SELECT *|字段名1,... FROM 表名 WHERE 条件表达式1 AND 条件表达式2 [...AND 条件表达式n]
-- OR关键字
SELECT *|字段名1,... FROM 表名 WHERE 条件表达式1 OR 条件表达式2 [...OR 条件表达式n]
-- IN关键字 查询学号为202101,202102,202103的学生
SELECT * FROM `student` WHERE id IN (202101,202102,202103)
-- BETWEEN AND关键字指定范围
SELECT *|字段名1,... FROM 表名 WHERE 字段名 [NOT] BETWEEN 值1 AND 值2;
-- 查询年龄不为空的学生的姓名
SELECT `name` FROM `student` WHERE age IS NOT NULL;
-- 查询姓张的学生,如张三、张小明,名字后面有任意个字
SELECT * FROM `student` WHERE `name` LIKE '张%'
-- 查询姓张的学生,如张三,名字后面只有一个字
SELECT * FROM `student` WHERE `name` LIKE '张_'
-- 查询姓张的学生,如张大爷,名字后面有两个字
SELECT * FROM `student` WHERE `name` LIKE '张__'
-- 查询名字中间有‘三’的学生,如张三丰,名字后面有两个字
SELECT * FROM `student` WHERE `name` LIKE '%三%'
函数名 | 作用 |
---|---|
COUNT() | 返回某列的行数 |
SUM() | 返回某列的和 |
AVG() | 返回某列的平均值 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SELECT COUNT(字段名) FROM 表名;
SELECT AVG(字段名) FROM 表名;
SELECT SUM(字段名) FROM 表名;
SELECT MAX(字段名) FROM 表名;
SELECT MIN(字段名) FROM 表名;
-- 排序
SELECT 字段名1,字段名2,字段名3,... FROM 表名 ORDER BY 字段名1 [ASC|DESC] 字段名2 [ASC|DESC]...
-- 分组
SELECT 字段名1,字段名2,字段名3,... FROM 表名 GROUP BY 字段名1,字段名2,...[HAVING 条件表达式];
-- 分页
SELECT 字段名1,字段名2,字段名3,... FROM 表名 LIMIT [OFFSET,] 记录数;
-- 内连接:
-- 查询相同的记录,至少有一个匹配就会返回
SELECT 别名1.字段名1 别名2.字段名2 FROM 左表表名 别名 INNER JOIN 右表表名 别名 ON 别名1.字段名 = 别名2.字段名
-- 外连接:
-- 左查询
-- 即使右表中没有匹配,也会从左表中返回所有的值
SELECT 别名1.字段名1 别名2.字段名2 FROM 左表表名 别名 LEFT JOIN 右表表名 别名 ON 别名1.字段名 = 别名2.字段名
-- 右查询
-- 即使左表中没有匹配,也会从右表中返回所有的值
SELECT 别名1.字段名1 别名2.字段名2 FROM 左表表名 别名 RIGHT JOIN 右表表名 别名 ON 别名1.字段名 = 别名2.字段名
SELECT name,age
FROM `student` s
INNER JOIN `result` r
ON s.id = r.id
INNER JOIN `subject` sub
ON r.subNo = sub.subNo
WHERE subName = 'MySQL从入门到删库跑路'
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句。一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
? 选择一个合适的存储引擎是一个比较复杂的问题。每种存储引擎都有自己的优缺点,不能笼统地说谁比谁好。
存储引擎的对比 | |||
---|---|---|---|
特性 | InnoDB | MyISAM | MEMORY |
事务安全 | 支持 | 无 | 无 |
存储限制 | 64TB | 有 | 有 |
空间使用 | 高 | 低 | 低 |
内存使用 | 高 | 低 | 高 |
插入数据的速度 | 低 | 高 | 高 |
对外键的支持 | 支持 | 无 | 无 |
InnoDB概念:是事务型数据库的首选引擎,支持事务安全表(ACID),其它存储引擎都是非事务安全表,支持行锁定和外键,MySQL5.5以后默认使用InnoDB存储引擎。
InnoDB特点:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制**(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库**,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
InnoDB的聚簇索引:就是表本身,它由表的数据与B+Tree索引组成。其中内部节点中包括索引列和指向下一节点的指针,而叶子节点包括表所有列上的数据,比如主键列,MVCC列,回滚列其它列等等。所以我们在查询数据时直接就能够查找到我们想要的数据。
InnoDB的二级索引(非聚簇索引):内部结点中包含索引列与指向下个节点的指针,而叶子节点则包括索引列和主键值。这也就造成了如果我们想要通过二级索引去查询一条数据的啥时候需要两轮的查询,第一轮是通过B+Tree查找到主键值,第二轮就是拿着主键值再经过一次B+Tree的查找找到真实的值。
MyISAM概念:基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务,不支持外键。
MyISAM特点:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。
MyISAM的索引聚簇索引和非聚簇索引:原理相同,就是内部结点都包含有索引列和指向下一个节点的指针,在叶子节点中包含的是行号,指向实际的物理地址。
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址
MEMORY存储引擎概念:将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。
MEMORY特点:**所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。**它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。
创建数据库,数据表:
CREATE DATABASE test;
CREATE TABLE `testmsg` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`msg` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`creatdate_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
留言提交页msg.php
//留言提交页
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<!-- 新 Bootstrap4 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
<!-- bootstrap.bundle.min.js 用于弹窗、提示、下拉菜单,包含了 popper.min.js -->
<script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>
<!-- 最新的 Bootstrap4 核心 JavaScript 文件 -->
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
<title></title>
</head>
<body>
<div class="container">
<div class="row clearfix">
<div class="col-md-12 column">
<div class="card bg-light text-dark">
<div class="card-header" style="text-align: center;">
<h3>欢迎来到网抑留言板</h3>
</div>
<div class="card-body">
<form action="insert.php" method="post">
<div class="form-group">
<label for="usr">用户名:</label>
<input type="text" class="form-control" id="usr" name="user" value="user">
</div>
<div class="form-group">
<label for="comment">留言:</label>
<textarea class="form-control" rows="5" id="comment" name="comment"></textarea>
</div>
<div class="form-group">
<div class="col-sm-offset-1 col-sm-10">
<button type="submit" class="btn btn-success btn-lg">提交</button>
</div>
</div>
</form>
</div>
<div class="card-footer">
<a href="http://localhost:8888/test/test.php" class="btn btn-info" role="button">查看留言</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
留言存入数据库insert.php
//留言存入数据库
<?php
$servername = "localhost";
$username = "root";
$password = "wyl59420wyl999";
$dbname = "phptest";
//var_dump($_POST);
$user = $_POST['user'];
//echo $user;
$comment = $_POST['comment'];
$date = date("Y-m-d h:i:s");
//echo $date;
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
echo "连接成功<br>";
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if($comment!=""){
$insert = "INSERT INTO `testmsg` (`user`, `msg`, `creatdate_at`) VALUES ('{$user}', '{$comment}', '{$date}');";
$conn->exec($insert);
echo "评论成功<br>";
echo '<br><a href="http://localhost:8888/test/test.php" role="button">查看留言</a>';
//关闭连接
$conn = null;
}
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
留言展示页test.php
//留言展示页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 新 Bootstrap4 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
<!-- bootstrap.bundle.min.js 用于弹窗、提示、下拉菜单,包含了 popper.min.js -->
<script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>
<!-- 最新的 Bootstrap4 核心 JavaScript 文件 -->
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
<title>Document</title>
</head>
<body>
<div class="container">
<div class="row clearfix">
<div class="col-md-12 column">
<div class="col-md-12 column bg-secondary">
<br />
<div class="card bg-info text-white">
<div class="card-header" style="text-align: center;">
<h3>留言板</h3>
</div>
</div>
<div class="row clearfix">
<?php
$servername = "localhost";
$username = "root";
$password = "wyl59420wyl999";
$dbname = "phptest";
//$user = $_POST['user'];
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
//echo "连接成功";
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT `user`, `msg`, `creatdate_at` FROM `testmsg`;");
$stmt->execute();
$rows=$stmt->fetchAll(PDO::FETCH_ASSOC);
echo '<div class="col-md-12 column"><ul class="list-group">';
//var_dump($rows);
foreach($rows as $row){
echo '<li class="list-group-item list-group-item-info" style="position:relative;">';
echo "{$row['user']}:";
echo '<span style="position:absolute; left:150px">';
echo "{$row['msg']}</span>";
echo '<span style="position:absolute; right:20px">';
echo "{$row['creatdate_at']}";
echo "</span></li>";
}
echo "</ul></div>";
//释放查询结果
$stmt = null;
//关闭连接
$conn = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
</div>
<br />
</div>
</div>
</div>
</div>
</body>
</html>
MVC分别指model,view,controler。
Model - 数据模型层:通常情况下对数据进行加工,进行一些其他的处理,与数据相关的一些操作都在 Model层 操作。
View - 视图层:跟用户进行交互的一些界面上的东西。
Controller - 控制层:用来处理业务逻辑的。
核心思想是:视图和用户交互,通过事件导致控制器改变,控制器改变导致模型改变或者控制器同时改变两者,模型改变导致视图改变或者视图改变潜在的从模型里面获得参数来改变自己。
它的优势在于:开发人员可以只关注整个结构中的其中某一层,可以很容易的用新的实现来替换原有层次的实现,可以降低层与层之间的依赖,有利于标准化,利于各层逻辑的复用。
php流行的MVC框架
yii,codelgniter,cakephp
(9条消息) 十大排序算法_不知名Coder - javatv.net-CSDN博客
冒泡排序
选择排序
插入排序
希尔排序
归并排序
快速排序
堆排序
计数排序
桶排序
基数排序
防盗链处理
把一些恶意的请求拒之问外。如:现在有A,B两个站,A站 想用 B站 的资源,直接在页面嵌入了一些图片,JS,CSS,本身来说,A站并不关心B站会消耗多少流量,但是对于B站来说,如果我们调用了B站的一些图片,JS或者CSS,都会对它做一个HTTP请求,就会消耗流量和带宽,所以本身对B站来说,会有不好的影响。从另一个角度来说,也侵犯了B站的版权问题,因此在这儿,要做 防盗链处理,这是流量的优化。
① 减少HTTP请求
假设打开一个界面,可以把一些CSS,JS文件,图片进行合并,这样做虽然会使文件变大,但是减少了请求的次数。
② 添加异步请求
如:不是一些很重要的数据,用户首次请求界面的时候,先不进行展示,需要的时候再进行展示,我们可以在旁边放一些事件,通过一些JS、jQuery等第三方库做一些AJAX的相关的异步请求,这样对于HTTP请求在性能上回有一个大幅度的提升,不要一次性把数据都加载过来,这样会对服务器造成很大的压力。
③ 启用浏览器缓存和文件压缩
如:启用浏览器 去缓存HTML文件给其设定过期时间,设定缓存文件相关的指纹等等。还可以将静态资源文件(如:JS、image等一些前端资源)设置过期时间缓存,为其指定过期时间,把它缓存到浏览器中,这样下一次再去访问的时候,不需要去请求服务端,可以直接通过浏览器把缓存读取出来。对于 文件压缩,可以通过一些压缩方式,如:把图片压缩的小一些,展示的时候图片就会下载的更快些,响应速度会加深,并且减少了流量的消耗,减少了带宽的消耗。同时也可以启用 Nginx 的 GCPR服务,将文件整体来说压的小一些。
④ CDN 加速
可以把一些前端的文件,前端的资源全部都放到CDN当中,用户过来访问的时候,可以就近来进行访问,从而提高访问速度,并且从一定意义上来说,也解决了带宽不够用的问题,可以把数据缓存到CDN的节点中,在用户去访问的时候,都会就近的选择CDN的节点进行访问,从一定意义上来说,就不会访问我们真实的服务器。
⑤ 建立独立图片服务器
因为本身来说,图片服务器是比较吃I/O的,为了解决对 I/O的损耗,可以把它与我们的 Web 服务器完全分离开,这样 Web 服务器本身的I/O 不会被我们的图片损耗,然后还可以针对性的对我们的图片服务器做一些优化,如:提高硬盘的转速;把CPU的计算能力降低下来;把图片服务器做一个集群。
① 页面静态化
把现有的服务端的逻辑(如:PHP),把PHP的一些逻辑,PHP的一些数据,PHP最终生成的要显示给用户的一些HTML内容缓存起来,直接缓存成HTML代码速度会更快,并且对我们的CPU负载,对我们的服务器的压力都会减小很多。
② 并发处理
如:页面做了一些静态化,但是静态化会有一个过期时间,不可能永远显示页面,如果是这样创建一些动态的内容就没有意义了,但是对于实质性要求比较高的来说,我们可能在做一些静态化的时候,不是特别的合理。这时需要穿透静态化,即绕过静态化,来直接访问真实的数据。访问真实数据的时候,可能就需要做一些程序上的并发处理,如 多线程多进程的异步处理、队列处理 等等,都可以异步完成数据的处理,从而提升请求的响应的速度,同时也提升了并发数。
③ 队列处理
① 数据库缓存
memcache 缓存
redis 缓存等
② 分库分表、分区操作
垂直拆分、水平拆分;
分区
③ 读写分离
把一些服务器,一些数据完全分开;
一些服务器做数据库的读操作(查询),一些服务器做写操作(增、删、该)
④ 负载均衡
负载均衡
可以使用 Nginx 的反向代理来实现负载均衡;
使用七层,使用四层(LVS)软件来实现负载均衡。
3001.4450)
防盗链处理
把一些恶意的请求拒之问外。如:现在有A,B两个站,A站 想用 B站 的资源,直接在页面嵌入了一些图片,JS,CSS,本身来说,A站并不关心B站会消耗多少流量,但是对于B站来说,如果我们调用了B站的一些图片,JS或者CSS,都会对它做一个HTTP请求,就会消耗流量和带宽,所以本身对B站来说,会有不好的影响。从另一个角度来说,也侵犯了B站的版权问题,因此在这儿,要做 防盗链处理,这是流量的优化。
① 减少HTTP请求
假设打开一个界面,可以把一些CSS,JS文件,图片进行合并,这样做虽然会使文件变大,但是减少了请求的次数。
② 添加异步请求
如:不是一些很重要的数据,用户首次请求界面的时候,先不进行展示,需要的时候再进行展示,我们可以在旁边放一些事件,通过一些JS、jQuery等第三方库做一些AJAX的相关的异步请求,这样对于HTTP请求在性能上回有一个大幅度的提升,不要一次性把数据都加载过来,这样会对服务器造成很大的压力。
③ 启用浏览器缓存和文件压缩
如:启用浏览器 去缓存HTML文件给其设定过期时间,设定缓存文件相关的指纹等等。还可以将静态资源文件(如:JS、image等一些前端资源)设置过期时间缓存,为其指定过期时间,把它缓存到浏览器中,这样下一次再去访问的时候,不需要去请求服务端,可以直接通过浏览器把缓存读取出来。对于 文件压缩,可以通过一些压缩方式,如:把图片压缩的小一些,展示的时候图片就会下载的更快些,响应速度会加深,并且减少了流量的消耗,减少了带宽的消耗。同时也可以启用 Nginx 的 GCPR服务,将文件整体来说压的小一些。
④ CDN 加速
可以把一些前端的文件,前端的资源全部都放到CDN当中,用户过来访问的时候,可以就近来进行访问,从而提高访问速度,并且从一定意义上来说,也解决了带宽不够用的问题,可以把数据缓存到CDN的节点中,在用户去访问的时候,都会就近的选择CDN的节点进行访问,从一定意义上来说,就不会访问我们真实的服务器。
⑤ 建立独立图片服务器
因为本身来说,图片服务器是比较吃I/O的,为了解决对 I/O的损耗,可以把它与我们的 Web 服务器完全分离开,这样 Web 服务器本身的I/O 不会被我们的图片损耗,然后还可以针对性的对我们的图片服务器做一些优化,如:提高硬盘的转速;把CPU的计算能力降低下来;把图片服务器做一个集群。
① 页面静态化
把现有的服务端的逻辑(如:PHP),把PHP的一些逻辑,PHP的一些数据,PHP最终生成的要显示给用户的一些HTML内容缓存起来,直接缓存成HTML代码速度会更快,并且对我们的CPU负载,对我们的服务器的压力都会减小很多。
② 并发处理
如:页面做了一些静态化,但是静态化会有一个过期时间,不可能永远显示页面,如果是这样创建一些动态的内容就没有意义了,但是对于实质性要求比较高的来说,我们可能在做一些静态化的时候,不是特别的合理。这时需要穿透静态化,即绕过静态化,来直接访问真实的数据。访问真实数据的时候,可能就需要做一些程序上的并发处理,如 多线程多进程的异步处理、队列处理 等等,都可以异步完成数据的处理,从而提升请求的响应的速度,同时也提升了并发数。
③ 队列处理
① 数据库缓存
memcache 缓存
redis 缓存等
② 分库分表、分区操作
垂直拆分、水平拆分;
分区
③ 读写分离
把一些服务器,一些数据完全分开;
一些服务器做数据库的读操作(查询),一些服务器做写操作(增、删、该)
④ 负载均衡
负载均衡
可以使用 Nginx 的反向代理来实现负载均衡;
使用七层,使用四层(LVS)软件来实现负载均衡。
|
PHP知识库 最新文章 |
Laravel 下实现 Google 2fa 验证 |
UUCTF WP |
DASCTF10月 web |
XAMPP任意命令执行提升权限漏洞(CVE-2020- |
[GYCTF2020]Easyphp |
iwebsec靶场 代码执行关卡通关笔记 |
多个线程同步执行,多个线程依次执行,多个 |
php 没事记录下常用方法 (TP5.1) |
php之jwt |
2021-09-18 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/14 14:47:55- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |