MySQL学习记录笔记


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>

相关文章
相关标签/搜索