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>