博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL学习记录笔记
阅读量:6274 次
发布时间:2019-06-22

本文共 17548 字,大约阅读时间需要 58 分钟。

hot3.png

一、数据库应用
    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
二、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-sql

三、结构化查询语言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.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服务

五、数据库的操作

    查看数据库服务器上的所有数据库
    show databases;(带S,一条sql语句结束记得加分号)

    选择数据库

    use 数据库名   如  use test

    创建一个数据库

    create database if not exists 库名;

    查看当前所在的数据库

    select database();

    删除数据库

    drop database if exists  数据库名;

六、数据表的操作

    查看当前数据库有多少表
    show tables;

    查看一个表的表结构

    desc 表名;

    修改表引擎

    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 字段名

七、操作数据

    添加数据
    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 表名;

八、数据库类型

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个字节。存储时实际占用的字节数跟字符集相关。

九、列的类型约束(字段)

    default           默认值    函数的参数的默认值
    auto_increment    字段值自增 ,此约束只能用在主键上
    unsigned          无符号 只有正数 , 没有负数   0~255
    zerofill          不够的位数用0进行填充 跟数值类型有关
    not null          不能插入空值

十、索引

    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 表名

十一、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

十二、存储引擎的选择

    1.同一个数据库 可以使用多种存储引擎的表,常用存储引擎的适用环境

    2.InnoDB

    用于事务处理应用程序,具有众多特性,包括ACID事务支持
    优点 提供了良好的事务管理、崩溃修复能力和并发控制
    缺点 读写效率稍差,占用的数据空间相对比较大

    3.MyISAM

    默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一
    优点 占用空间小,处理速度快
    缺点 不支持事务的完整性和并发性
    Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问
    优点 处理速度非常快
    缺点 数据易丢失

十三、数据备份与还原

    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
        注意:要还原的路径要有向还原的数据库文件,如果没有,先将向还原的数据库备份文件考到相应的路径上

十四、多表查询

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;

十五、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 用户名 identified by '用户密码';
            权限列表
            create  建库建表权限
            drop    删库删表权限
            insert  数据插入权限
            delete  数据删除权限
            update  数据修改权限
            select  数据读取权限
            index   索引操作权限
            *.*     数据库 数据表 =>o2o_14.o2o_14.user  *代表所有库所有表
            分配权限之后:刷新权限  flush privileges;

        2.2 收回权限(在root下进行)

            ①revoke select on *.* from 用户名;(需要谨慎)
            刷新权限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(用户名);

十六、日志操作(重点)

    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

十七、数据库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();

十八、数据库天龙八部

    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."')";

十九、在进行修改页面的时候如何默认显示单选框、复选框、文本框

   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>

转载于:https://my.oschina.net/u/3887849/blog/1840923

你可能感兴趣的文章
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>
关于再次查看已做的多选题状态逻辑问题
查看>>
动态下拉菜单,非hover
查看>>
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>
简单易懂的谈谈 javascript 中的继承
查看>>
多线程基础知识
查看>>
iOS汇编基础(四)指针和macho文件
查看>>
Laravel 技巧锦集
查看>>
Android 使用 ViewPager+RecyclerView+SmartRefreshLayout 实现顶部图片下拉视差效果
查看>>
Flutter之基础Widget
查看>>
写给0-3岁产品经理的12封信(第08篇)——产品运营能力
查看>>