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>

相關文章
相關標籤/搜索