1、数据库应用
1.1 数据库的定义
数据库是计算机应用系统中的一种专门管理数据资源的系统。数据库就是一组通过计算机整理后的数据,
存储在一个或者多个文件中,数据库就是存储数据的仓库
1.2 数据的存储方式
人类经历了三种数据存储的阶段:
① 人工管理阶段
② 文件系统阶段
③ 数据库系统阶段
1.3 数据库在Web开发中的重要做用
动态网站都是对数据进行操做,咱们平时浏览网页时,会发现网页的内容会常常变化,而页面的主体结构框架没变,
Web系统的开发基本上都离不开数据库,由于任何东西都要存放在数据库中。所谓的动态网站就是基于数据库开发的系统,
最重要的就是数据管理,或者说咱们在开发时都是在围绕数据库在写程序。
1.4 数据库的相关概念
① 数据库系统 DBS data base system
② 数据库 DB data base
③ 数据库管理系统 DBMS data base manage system
④ 数据库管理员 DBA data base administrator
DBS 主要由 DB、DBMS和DBA等组成
1.5 常见的数据库系统
甲骨文 Oracle
IBM DB2
微软的Access和SQL Server(MSSQL)
开源PostgreSQL
开源MySQL
SQLlite
开源 redis
mongoDB
2、MySQL基础
2.1 mysql的特色
① 开放源代码
② 跨平台性
③ 价格优点
④ 功能强大且使用方便
2.2 PHP为何会选择MySQL做为本身的好基友
① PHP几乎可使用现有的全部的数据库系统
② MySQL与其余的大型数据库例如Oracle,DB2,SQL Server等相比,自有它的不足之处,如规模小,功能有限,可是丝毫没有影响它受欢迎的程度。
③ 对于通常的我的使用者和中小型企业来讲,MySQL提供的功能已经绰绰有余
④ 并且因为MySQL是开放源码软件,所以能够大大下降整体拥有成本。LAMP和LNMP中的其余三个软件也都是免费的,
因此咱们能够不花一分钱就能够创建起一个稳定,免费的网站系统。
2.3 PHP 与 MySQL的合做方式
① 在同一个MySQL数据库服务器中能够建立多个数据库,若是把每一个数据库当作是一个“仓库”,
则网站中的内容数据就存储在这个仓库中,而对数据库中数据的存取及维护等,都是经过数据库系统软件管理的。
同一个数据库管理系统能够为不一样的网站分别创建数据库,但为了使网站中的数据便于维护,备份及移植,最好为一个网站建立一个数据库。
② MySQL数据库管理系统是一种“客户机/服务器”体系结构的管理软件,因此必须同时使用数据库服务器和客户机两个程序才能使用MySQL。
服务器程序用于监听客户机的请求,并根据这些请求访问数据库,以便向客户机提供它们所要求的数据。
而客户机程序则必须经过网络链接到数据库服务器,才能向服务器提交数据操做请求。
PHP脚本程序做为MySQL服务器的客户机程序,是经过PHP中的MySQL扩展函数,对MySQL服务器中存储的数据进行获取,插入,更新及删除等操做。
2.4 关系型数据库和非关系数据库
① 关系型数据库
MySQL服务器 --> 数据库 -->数据表 ---> 行(记录)---->字段
② 非关系型 数据库 no-sqlphp
3、结构化查询语言SQL
3.1 数据定义语言(DDL)
用于定义和管理数据对象,包括数据库,数据表等。例如:CREATE,DROP,ALTER等。
3.2 数据操做语言(DML)
用于操做数据库对象中所包含的数据。例如:INSERT,UPDATE,DELETE语句。
3.3 数据查询语言(DQL)
用于查询数据库对象中所包含的数据,可以进行单表查询,链接查询,嵌套查询,以及集合查询等各类复杂程度不一样的数据库查询,
并将数据返回客户机中显示。例如:SELETE
3.4 数据控制语言(DCL)
是用来管理数据库的语言,包括管理权限及数据更改。例如:GRANT,REVOKE,COMMIT,ROLLBACK等。mysql
4、MySQL 基本操做
4.2 MySQL数据库的链接与关闭
① 链接(登录mysql服务器)
mysql –h 服务器主机地址 –u 用户名 –p 用户密码
只有客户机所在的主机被授予权限才能去链接MySQL服务器
② 退出
能够经过\q、exit、ctrl+c或者quit来退出当前客户端
4.3 SQL 命令注意事项:
每一个SQL命令都须要使用分号来完成
能够将一行命令拆成多行
能够经过\c来取消本行命令
4.4 咱们可使用help命令来查询快捷键:
将查询后的数据立起来:\G
取消当前未完成的操做:\c
退出当前客户端:\q
显示当前服务器状态:\s
显示帮助信息:\h(同help命令)
更改执行符:\d
4.5 更改root 用户的密码
① 使用root 登录 mysql服务区 mysql -u root -p密码
② 选择mysql数据库 use mysql;
③ 修改 User表中中 root 用户的密码 update user set Password=password('新密码') where User='root';
④ 更新权限 flush privileges;
4.6 忘记root 密码
① 关闭mysql服务
② 使用安全模式 打开mysql服务 mysqld --skip-grant-tables;
③ 使用root用户不用密码登录 mysql -u root
④ 登录后 进入mysql数据库 use mysql;
⑤ 更改root密码 update user set Password=password('新密码') where User='root';
⑥ 更新权限 flush privileges;
⑦ 退出mysql安全模式 mysqladmin -u root -p shutdown
⑧ 从新开启mysql服务redis
5、数据库的操做
查看数据库服务器上的全部数据库
show databases;(带S,一条sql语句结束记得加分号)sql
选择数据库
use 数据库名 如 use test数据库
建立一个数据库
create database if not exists 库名;数组
查看当前所在的数据库
select database();安全
删除数据库
drop database if exists 数据库名;服务器
6、数据表的操做
查看当前数据库有多少表
show tables;网络
查看一个表的表结构
desc 表名;php7
修改表引擎
alter table 表名字 engine=innodb;
查看某个表的建表语句
Show create table 表名;
建立表
create table 表名(
字段名 类型 [字段约束(有没有默认 可不能够为空 . . .)],
字段2 类型2 [约束]
)engine=innodb default charset=utf8;
查看建表语句
Show create table 表名;
删除表
drop table 表名;
修改表结构(添加字段,修改字段 ,删除字段)
添加字段
alter table 表名 add 字段名 字段类型 字段约束; 字段添加的位置(first 第一列 after 列名 那一列后面)
修改字段
①不能修改字段名称
alter table 表名 modify 字段名 字段类型 [类型约束];
②修改字段名称
alter table 表名 change 源字段名 新字段名 字段类型 [类型约束];
若是表已经存在,添加主键索引
alter table 表名 modify id int primary key auto_increment;
删除主键索引(不能删除自增的)
先把自增去掉 而后删主键
alter table nn drop primary key;
惟一索引 : 添加惟一索引后,此列的值不能重复
建表时添加惟一索引 unique
在已存在的表上添加惟一索引
格式:alter table 表名 add unique 要添加的惟一索引的名字(在哪一列上)
例子:alter table stu add unique uni_name(name);
删除惟一索引
alter table 表名 drop index 惟一索引的名字
查看当前表的索引清单
show index from 表名
建表时添加常规索引
alter table 表名 add index 常规索引名本身建(在哪一列上)
删除常规索引
alter table 表名 drop index 索引名;
修改表名
alter table 表名 rename 新的表名;
修改自增值 把自增值重置回1
alter table 表名 auto_increment=1;
删除字段
Alter table 表名 drop 字段名
7、操做数据
添加数据
Insert into 表名(字段名1 ,字段名2,…) values(值1,值2,…..);
Insert into 表名 values(值1,值2,值3….)
像这种结构,表有多少字段,就必须赋多少个值
插入多条数据
Insert into 表名(字段名1 ,字段名2,…) values(值1,值2,…..), (值1,值2,…..)…..;
插入多条记录的第二种写法
insert into stu values(2,'lisi',1),(3,'wangwu',10);
删除数据(跟修改数据记得必定要加条件)
Delete from 表名 where 条件;
修改数据
Update 表名 set 字段名=要设置的字段值 where 条件;
数据查询
Select 字段1,字段2,…… from 表名;
8、数据库类型
1.整型
1.1 tinyint
取值范围:
有符号:-128 ~ 127
无符号:0 ~ 255
做用:能够用于存年龄、标记,好比商品的状态:1新添加,2表示在售中,3已下架;订单状态、性别
tinyint(n) 只有跟zerofill 配合到时候 才生效
若是使用了zerofill 自动把字段用0补全到指定长度 自动转换成无符号
1.2 int
取值范围:
有符号:正负二十多个亿
无符号:0~40多个亿
做用:用于计数、时间戳、不能放手机号
2.浮点型
float(总位数,小数点后几位) 小数 整数 1.00
小数点后面 若是溢出 , 四舍五入保留
3.字符串
char varchar 字符串 (n)表明字符串的长度
char 固定长度 速度快 手机号 身份证
varchar 非固定长度 省空间 用户名 邮箱 姓名
text 长文本 使用于小说、论文
枚举 enum 多选1 安全(相似于单选按钮)
集合 set 多选多 爱好 (相似于复选框)
注意:
3.1 字符串的值必需要加引号(单双引号均可以)
3.2 无论是char仍是varchar超出指定长度都不行
3.3 char会截取掉后面的空格,而varchar不会
3.4 char(10)或者varchar(10)表示是10个字符,而不是10个字节。存储时实际占用的字节数跟字符集相关。
9、列的类型约束(字段)
default 默认值 函数的参数的默认值
auto_increment 字段值自增 ,此约束只能用在主键上
unsigned 无符号 只有正数 , 没有负数 0~255
zerofill 不够的位数用0进行填充 跟数值类型有关
not null 不能插入空值
10、索引
1.索引简介
1.1 在MySQL中,主要有四类索引:
主键索引(PRIMARY KEY)
惟一索引(UNIQUE)
常规索引(INDEX)
全文索引(FULLTEXT)
外键(foreign key)
1.2 主键索引
主键索引是关系数据库中最多见的索引类型,主要做用是肯定数据表里一条特定的数据记录的位置。
咱们能够在字段后添加PRIMARY KEY来对字段设置为主键索引。
注意:
1.最好为每张表指定一个主键,但不是必须指定。
2.一个表只能指定一个主键,并且主键的值不能为空
3.主键能够有多个候选索引(例如NOT NULL,AUTO_INCREMENT)
1.3 惟一索引
惟一索引与主键索引同样,均可以防止建立重复的值。
可是,不一样之处在于,每一个数据表中只能有一个主键索引,但能够有多个惟一索引。
咱们使用关键字UNIQUE对字段定义为惟一索引。
1.4 普通索引(常规索引)
常规索引技术是关系数据查询中最重要的技术,
若是要提高数据库的性能,索引优化是首先应该考虑的,由于它能使咱们的数据库获得最大性能方面的提高。
常规索引也存在缺点:
1.多占用磁盘空间
2.会减慢插入,删除和修改操做
3.须要按照索引列上排序格式执行
建立索引咱们可使用INDEX和KEY关键字随表一同建立。
1.5 全文索引
全文索引在MySQL中是一个FULLTEXT类型索引,但FULLTEXT索引只能用于MyISAM表,
而且只能够在CHAR、VARCHAR或TEXT类型的列上建立,也容许建立在一个或多个数据列上。
可是FULLTEXT是不支持中文全文索引的,因此咱们未来会使用效率更高的全文索引引擎Sphinx。
2. 查看索引
SHOW INDEXES FROM 表名
3. 建立索引
3.1 建表时
CREATE TABEL 表名(
.....
.....
[UNIQUE | INDEX | KEY] [别名] [属性名]
)
3.2 在已存在表上建立索引
CREATE [UNIQUE | FULLTEXT] INDEX 索引名 ON 表名(属性名)
3.3 使用ALTER语句
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT] INDEX 索引名 (属性名)
4. 删除索引
DROP INDEX 索引名 ON 表名
11、MySQL数据类型的选择
1. 整数类型和浮点类型
整型 无小数的数字,数据可能会参与运算 如 id、年龄、时间戳....
经常使用的整型: tinyint int
tinyint 表示 范围小的数, 好比 年纪、标记...
int 表示 范围相对较大的数 好比 时间戳、个数.....
浮点: 有小数点的数字 用浮点 如 价格、金额、长度......
2. 浮点和定点
2.1 浮点 float
2.2 定点 (双精度)double: 能够表示的分为更大, 精度更高
2.3 浮点能够指定长度: float(6,2); 表示 整数+小数(不算小数点)共6位,其中小数部分2位
插入的数据若是小数过多,会保留指定的位数
若是长度超过了限制, 会使用 指定位数 的最大数
double(6, 2);
3. CHAR和VARCHAR
3.1 char(定长)
取值范围:0~255
定长:char(10)表示固定的占10个字节,哪怕你存的是abc,在存储的时候占的空间也是10个字节
何时定长?
手机号、邮编、md5的密码(32)
3.2 varchar(变长)
取值范围:0~65535
变长:varchar(10)表示最大只能存10个字符,可是你存个abc,实际占的字节数是4,由于它须要用1个字节来表示字符串的长度;超出255以后,须要用2位来表示长度,还须要用1个字节来表示是否为null
4. 时间和日期
并不太经常使用
一般用 时间戳 表示 时间
5. ENUM和SET
ENUM (枚举) 多个选项中选择一个 enum('w','m','n') 如:性别
SET 多个选项中选择多个 set('a','b','c','d')
6. TEXT和BLOB
TEXT 存储 比较长的字符串 好比 一篇文章,一条新闻
7. 经常使用的数据类型
整型: int tinyint
浮点: float double
字符串: char varchar text enum
12、存储引擎的选择
1.同一个数据库 可使用多种存储引擎的表,经常使用存储引擎的适用环境
2.InnoDB
用于事务处理应用程序,具备众多特性,包括ACID事务支持
优势 提供了良好的事务管理、崩溃修复能力和并发控制
缺点 读写效率稍差,占用的数据空间相对比较大
3.MyISAM
默认的MySQL插件式存储引擎,它是在Web、数据仓储和其余应用环境下最常使用的存储引擎之一
优势 占用空间小,处理速度快
缺点 不支持事务的完整性和并发性
Memory:将全部数据保存在RAM中,在须要快速查找引用和其余相似数据的环境下,可提供极快的访问
优势 处理速度很是快
缺点 数据易丢失
十3、数据备份与还原
1.数据库的备份
1.1 退出mysql环境,进入dos环境
1.2 输入mysqldump -u root -p 要备份的数据库>数据备份的文件名
mysqldump -u root -p lamp143>lamp143.sql
1.3 备份一个数据库
mysqldump -u username -p dbname table1 table2 ... > backupName.sql
dbname 表示数据库名 table是表名 没有改参数备份整个数据库
1.4 备份多个数据库
mysqldump -u username -p --database dbname1 dbname2 ... > backupName.sql
1.5 备份所有数据库
mysqldump -u username -p --all-databases > backupName.sql
注意:如今数据库会被备份到C:\Users\Administrator>,若是想将备份后的数据库放到指定的位置,记得先将路径切换到指定的路径
2.数据库的还原
2.1 先进mysql环境,建立一个空的数据库,接收一会要导入的数据
2.2 退出mysql环境,进入dos环境
2.3 输入mysql -u root -p 要还原的数据库<数据备份的文件名
mysql -u root -p lamp143<lamp143.sql
注意:要还原的路径要有向还原的数据库文件,若是没有,先将向还原的数据库备份文件考到相应的路径上
十4、多表查询
1.两表查询:
1.1 where关联查询
取两个表交集的方法
select * from 表1,表2 where 表1.主键=表2.外键
select * from stu s,grade g where s.id=g.sid;能够建别名
1.2 join 链接查询:
left join左联
左联查询就是以左侧表为主查询,右侧表没有的补null
select * from 表1 left join 表2 on 表1.主键=表2.外键
right join右联
右联联查询就是以右侧表为主查询,左侧表没有的补null
select * from 表1 right join 表2 on 表1.主键=表2.外键
inner join内联(等价于上面where的结果)交集
select b.id as bid,b.name as bname,s.id as sid,s.name as sname from brand as b inner join shop as s on b.id =s.brand_id;
2.三表查询:
2.1 where普通:表1,表2,表3 where 条件2 and 条件2
select c.id as cid,c.name as cname,b.id as bid,b.name as bname,s.id as sid,s.name as sname from class as c,brand as b,shop as s where c.id =b.class_id and b.id=s.brand_id;
2.2 左连接: 表1 left join 表2 on 条件 left join 表3 on 条件
select * from class as c left join brand as b on c.id=b.class_id left join shop as s on b.id =s.brand_id;
2.3 右链接: 表1 right join 表2 on 条件 right join 表3 on 条件
select * from class as c right join brand as b on c.id=b.class_id right join shop as s on b.id =s.brand_id;
2.4 内链接: 表1 inner join 表2 on 条件 inner join 表3 on 条件
select * from class as c inner join brand as b on c.id=b.class_id inner join shop as s on b.id =s.brand_id;
十5、MySQL用户管理(设置修改权限都要刷新生效,不然就要重启MySQL服务才能够 flush privileges;且在root下进行添加用户操做和给其它用户加权限)
1.帐户管理
1.2 新建普通用户
①使用INSERT子句新建普通用户
INSERT INTO mysql.user(Host, User, Password) VALUE(主机名, 用户名, PASSWORD(密码))
flush privileges;刷新权限
②使用GRANT来新建普通用户
GRANT 权限 ON 数据库.数据表 TO 用户名@登陆主机 IDENTIFIED BY “密码”
注意:建立完毕以后要刷新 flush privileges;
1.3 删除普通用户
① 使用DROP USER
DROP USER 用户名
② 使用DELETE语句
DELETE FROM mysql.user WHERE User='' AND Password=''
flush privileges;属性权限
1.4 root 用户修改本身的密码
①使用mysqladmin 命令来修改root 用户的密码
mysqladmin -u 用户名 -p password '新密码'
注意:新密码必须用双引号!! 可能会不成功
②修改mysql数据库下的user表
UPDATE mysql.user SET Password=password(新密码) WHERE User='' AND Host=''
刷新权限:FLUSH PRIVILEGES
③使用SET语句
SET PASSWORD = PASSWORD(新密码)
刷新权限:FLUSH PRIVILEGES
1.5 root 修改普通用户密码
①使用set语句
SET PASSWORD FOR 'username'@'hostname'=PASSWORD(新密码)
②修改mysql数据库user表
③用CRANT 语句
GRANT 权限 ON 数据库.数据表 TO 用户名@登陆主机 IDENTIFIED BY “密码”
1.6 普通用户修改密码
①SET PASSWORD = PASSWORD(新密码)
1.7 root 用户丢失的解决方法
① 关闭 mysql服务
② 安全模式 开启mysql服务 mysqld --skip-grant-tables
③ root用户登陆mysql服务器 mysql -u root
④ 修改 mysql数据库 下user表
⑤ 加载权限表 FLUSH PRIVILEGES
⑥ 退出mysql安全模式 mysqladmin -u root -p shutdown
2.权限管理(在root用户进行)
2.1 权限分配(在root用户进行)
grant all(赋予权限) on *.* to 用户名@localhost identified by '用户密码';
权限列表
create 建库建表权限
drop 删库删表权限
insert 数据插入权限
delete 数据删除权限
update 数据修改权限
select 数据读取权限
index 索引操做权限
*.* 数据库 数据表 =>o2o_14.o2o_14.user *表明全部库全部表
分配权限以后:刷新权限 flush privileges;
2.2 收回权限(在root下进行)
①revoke select on *.* from 用户名@localhost;(须要谨慎)
刷新权限flush privileges;
注意: revoke 用户权限后,该用户只有从新链接 MySQL 数据库,权限才能生效。
Test information_schema数据库和test前缀的数据库不授权限控制
受权完毕以后要刷新权限 flush privileges;
2.3 查看权限
①登陆当前用户查看当前用户(本身)权限:
show grants;
②浏览当前MySQL用户信息
select user,host,password from mysql.user;
③查看指定用户的权限信息
show grants for xbb(用户名)@localhost;
十6、日志操做(重点)
1.Mysql日志操做能够快速的记录mysql的操做信息
2.打开mysql配置文件,设置日志记录
3.错误日志(在启动或者关闭数据库信息的时候,出现错误,会记录一些日志信息) log-error=/tmp/mysql-error.log
4.查询日志(在执行增删改查的时候,会把日志信息记录) log=/tmp/mysql-query.log
5.慢查询日志 long_query_time=1 log-slow-queries=/tmp/mysql-slow.log
6.二进制日志 log-bin=1
十7、数据库PDO
1. 面向对象的错误处理
1.2 结构 try catch
try(){
//可能抛出异常的代码 咱们在这里尝试执行
}catch{
//若是一旦抓到错误了 就直接跳转到这个区间执行
}
2. 函数简介
2.1 PDO类
①PDO::exec('执行的 SQL 语句') — 执行一条 SQL 语句,并返回受影响的行数 发送 增、删、改语句
②public PDOStatement PDO::query( string $statement) 执行查询语句 PDO::query执行一条SQL语句,若是经过,则返回一个PDOStatement对象。PDO::query函数有个"很是好处"就是能够直接遍历这个返回的记录集
③string lastInsertId ([ string $name = NULL ])获取上一次插入操做产生的ID
④prepare($sql) 建立SQL的预处理,返回PDOStatement对象
⑤setAttribute() 设置一个"数据库链接对象"属性。
⑥beginTransaction() 开启一个事物(作一个回滚点)
⑦commit() 提交事务
⑧rollBack() 事务回滚操做
⑨errorCode() 获取错误码
④errorInfo() 获取错误信息,返回数组
2.2 PDOStatement 类
①int PDOStatement::rowCount(void);void不用写值 返回上一个由对应的 PDOStatement(预处理)对象执行DELETE、INSERT、或 UPDATE 语句受影响的行数。对于大多数数据库, PDOStatement::rowCount() 不能返回受一条 SELECT 语句影响的行数。替代的方法是,使用 PDO::query()来发出一条和原打算中的SELECT语句有相同条件表达式的 SELECT COUNT(*) 语句,而后用 PDOStatement::fetchColumn()来取得返回的行数。这样应用程序才能正确执行。
② public PDOStatement prepare ( string $statement [, array $driver_options = array() ] ) 返回预处理对象 prepare 执行全部sql,能够彻底替代 query,exec的功能
③ bool PDOStatement::execute ([ array $input_parameters ] ) — 执行一条预处理语句 成功时返回 TRUE, 或者在失败时返回 FALSE。若是执行SELECT等SQL语句,则还须要借助fetch等函数进行结果读取(固然上文的query也是可以使用fetch等函数)
注意:若是是bindParam,bindValue是不须要传参的,是array绑定参数须要传参
④、fetch() 返回结果集的下一行,结果指针下移,到头返回false
参数:PDO::FETCH_BOTH (default):索引加关联数组模式
PDO::FETCH_ASSOC、 :关联数组模式
PDO::FETCH_NUM、 :索引数组模式
PDO::FETCH_OBJ、 :对象模式
PDO::FETCH_LAZY :全部模式(SQL语句和对象)
⑤fetchAll() 经过一次调用返回全部结果,结果是以数组形式保存
参数:PDO::FETCH_BOTH (default)、//混合数组
PDO::FETCH_ASSOC、//关联
PDO::FETCH_NUM、//索引
PDO::FETCH_OBJ、//对象
PDO::FETCH_COLUMN表示取指定某一列
如:$rslist = $stmt->fetchAll(PDO::FETCH_COLUMN,2);取第三列
⑥setAttribute() 为一个预处理语句设置属性
⑦errorCode() 获取错误码
⑧errorInfo() 获取错误信息
⑨bindParam() 将参数绑定到相应的查询占位符上
⑩bindValue() 将一值绑定到对应的一个参数中
3.PDO
3.1 什么是PDO?
PDO:操做数据库的方法,把操做数据库的方法封装成PDO类
3.2 PDO好处
①跨数据库管理
a.跨数据库的话,要开相关的PHP数据库扩展,但php7.0默认开启PDO类的mysql
开启与PDO相关的数据库扩展功能
extension=php_pdo_mysql.dll
b.添加底层驱动文件
目录: C:\wamp\bin\php\php7.0.4\ext
②支持预处理(防止sql语句注入)
③支持事务操做
4.预处理(防止sql语句注入)
4.1 好处:
不须要发送整条sql语句,只须要把发送的值和参数发送过去便可,把sql和值作分离
在发送参数和值的时候,采用的不一样的协议,保证数据安全(了解)
预先加载sql语句,只须要查询一次便可查询出全部数据,减小sql语句的分析时间,提升查询效率
4.2 ?号式 预处理 防止sql语句注入
a.绑定参数(bindparam)
b.绑定值(bindValue)
c.绑定数组(只能是索引数组) array()
4.3 :别名式 预处理 防止sql语句注入
a.绑定参数(bindparam)
b.绑定值(bindValue)
c.绑定数组(只能是关联数组)array()
5.事务操做
①事务定义?
将多条sql语句做为操做单元,要么都成功,要么都失败
②使用事务
a.修改表引擎类型为innodb
alter table stu engine=innodb
b.查看表引擎类型
show create table stu\G
c.开启一次事务:
$pdo->beginTransaction();
提交一次事务:
$pdo->commit();
回滚一次事务:
$pdo->rollback();
③MyISAM和InnodB的区别?
MyISAM(非事务)增删改速度快
InnodB(事务型)安全性高
7.PDOException异常处理类(表明一个由 PDO 产生的错误。在本身的代码不该抛出一个 PDOException 异常。)
参数为void表明无参数
①final public string Exception::getMessage ( void ) 获取异常消息内容
②final public string Exception::getFile ( void ) 发生错误文件
③final public int Exception::getLine ( void ) 发生错误代码行数
8.经过PDO的方法来获取PDOStatement对象
8.1 PDO的query(查询sql)方法获取,用于解析结果集
8.2 PDO的prepare(SQL)方法获取,用于处理参数式sql并执行操做
9.PDO预处理详解
/*预处理 防止sql语句注入
防止sql语句注入 核心
不须要发送整条sql语句,只须要把发送的值和参数发送过去便可,把sql和值作分离
在发送参数和值的时候,采用的不一样的协议,保证数据安全(了解)
注意:
若是id是自增的也要在sql语句也null或者为空字符串''。
①对于使用命名占位符的预处理语句,应是相似 :name 形式的参数名。值和数据库能够不一致
②对于使用问号占位符的预处理语句,应是以1开始索引的参数位置。值的内容也要和数据库字段一致*/
9.1 问号占位符 (必须是从数字1开始)
//准备sql语句
$sql = "insert into content values(null,?,?)";
$list = $pdo->prepare($sql);//返回PDO预处理对象
var_dump($list)
//1.绑定值 bindValue
$list = $pdo->prepare($sql);//返回PDO预处理对象
$list-bindValue(1,'5');
$list->bindValue(1,'苹果man');
$list->bindValue(1,'admins');
$list->execute();
//返回受影响行数 rowCount()
echo $list->rowCount();
//2.绑定参数 bindParam
$list = $pdo->prepare($sql);//返回PDO预处理对象
$list->bindParam(1,$name);
// 赋值
$name = '我是bindParam3';
$list->execute();
//返回受影响行数 rowCount()
echo $list->rowCount();
//3.绑定数组(只能是索引数组)
$list = $pdo->prepare($sql);//返回PDO预处理对象
$data = array('num',2);
$list->execute($data);
//返回受影响行数 rowCount()
echo $list->rowCount();
9.2 命令占位符 :
$sql = "insert into content values('',:content,:tid)";
$list = $pdo->prepare($sql);
var_dump($list);
//1.绑定参数bindParam()
$list->bindParam(":content",$content);
$list->bindParam(":tid",$tid);
//赋值
$content = "海尔";
$tid = '2';
$list->execute();
echo $list->rowCount();
// 2.绑定值bindValue()
$sql = "insert into content values('',:content,:tid)";
$list = $pdo->prepare($sql);
$list->bindValue(":content","小米手环2");
$list->bindValue(":tid",'4');
$list->execute();
//返回受影响行数 rowCount()
echo $list->rowCount();
//3.数组绑定
$sql = "insert into content values('',:content,:tid)";
$list = $pdo->prepare($sql);
$arr = array("content"=>"小米6","tid"=>'9');
$list->execute($arr);
//返回受影响行数 rowCount()
echo $list->rowCount();
十8、数据库天龙八部
Step1:连接数据库 mysqli_connect();
参数:①主机地址
②mysql用户名
③mysql密码
④选择链接的数据库
⑤端口号
返回:若是链接成功,返回资源类型的标志符号;若是链接失败,返回false。
$link=mysqli_connect("localhost","root","password");
Step2:检测数据库链接是否成功?
mysqli_connect_errno()与 mysqli_connect_error()
mysqli_connect_errno(); 返回上次链接数据库错误的错误号,链接成功返回0
mysqli_connect_error(); 返回上次链接数据库的错误信息
if(mysqli_connect_errno($conn)){
die("数据库链接失败!失败信息:".mysqli_connect_error($conn));
}
前面两步合并的写法(Step1+Step2):链接数据库同时判断
$conn = mysqli_connect("localhost", "root", "", "mydb") or die("数据库链接失败!失败信息:".mysqli_connect_error($conn));
Step3:选择数据库 mysqli_select_db($link,$dbname)
参数:①标识符 ②链接数据库名称
链接成功,返回true;链接失败,返回false
若是修改数据库成功,则资源标识符中的数据库就会发生变更;
若是修改失败而没有经过代码终止操做,则后续代码可使用原数据库继续执行
mysqli_select_db($conn, "mydb") or die("数据库选择失败!");
Step4:设置字符集编码格式
mysqli_set_charset($link,$charset) 只能设置为utf8而不能是utf-8
mysqli_set_charset($conn,"utf8") or die("数据库编码集设置失败!");
Step5:编写sql语句
$sql = "select * from tb1";
Step6:执行sql语句 mysqli_query($link,$sql);
若是是(DML)增、删、改,将返回布尔类型是否成功
mysqli_affected_rows($link); 返回上一次操做时受影响的行数
mysqli_insert_id($conn); 执行插入语句是返回上次插入最新插入的主键ID
若是是(DQL)查询,将返回资源结果集
返回资源结果集中的行数
mysqli_num_rows($result);
返回资源结果集中的字段数
mysqli_num_fields($result);
得到结果集中的全部的记录
mysqli_fetch_all($res);
当前指针指向的那一列的信息
mysqli_fetch_field($res);
返回全部列的信息
mysqli_fetch_fields($res)
Step7:解析结果集
var_dump(mysqli_fetch_array($result)); 处理结果集,返回关联数组和索引数组 不经常使用
参数① 须要处理的结果集
参数② 返回哪一种数组格式
MYSQL_ASSOC - 关联数组
MYSQL_NUM - 数字数组
MYSQL_BOTH - 默认。同时产生关联和数字数组
Step8:关闭资源与结果集 mysqli_free_result();和mysqli_close();
mysqli_free_result($res); //释放查询资源结果集
mysqli_close($conn); //关闭数据库链接 (通常咱们只写这个);
检查错误使用的方法:
if (!$result_insert) {
printf("Error: %s\n", mysqli_error($conn));
exit();
}
若是存在变量的作法?
1.$sql_select="select username from USER where username='".$username."'";
2.$sql_insert="insert into user(username,userpsd,creattime,creatip)VALUES('".$username."','".$userpsd."','".$time."','".$ip."')";
十9、在进行修改页面的时候如何默认显示单选框、复选框、文本框 1.文本框:<textarea name="centent" id="" cols="30" rows="10"><?php echo $row['centent'] ?></textarea> 2.复选框:<input type="checkbox" name='hobby[]' value='吃' <?php echo (in_array('吃',$hobby)?'checked':'') ?>>吃 3.单选框:<label><input type="radio" name='sex' value='w' <?php echo ($row['sex']=='w')?'checked':'' ?>>女</label>