文件操作:目錄操作,文件操作
目錄操作步驟:
準備一個目錄(路徑)
判斷一個路徑是否是一個目錄
打開目錄opendir,返回一個目錄資源,包含當前目錄下所有的文件
遍歷目錄資源,循環+readdir,每次獲得一個文件名,將資源指針下移一位
關閉資源closedir
文件操作步驟:
準備一個文件路徑
判斷一個路徑是否是一個文件
打開文件,獲得其中內容
a) PHP5:file_get_contents,file將文件按照行進行獲取返回一個數組
b) PHP4:打開資源fopen(文件名,Mode),fgetc獲取一個字符,fgets獲取指定長度或者一行,fread獲取指定長度
寫入內容
a) PHP5:file_put_contents(文件名,字符串,Mode),Mode:追加,起始位置插入
b) PHP4:fwrite,fputs,往文件中插入數據(數據插入位置默認由fopen決定)
c) Fseek:將文件的指針指向指定的位置。
關閉文件,fclose
文件操作相關函數
Scandir:獲取指定目錄下所有的文件,以數組形式返回
如果自定義遍歷目錄?(筆試的時候經常出現)
寫一個函數遍歷一個文件夾下的所有文件
Function myScandir($dir = “.”){
//定義一個數組,接收遍歷的所有結果
$arr = array();
//循環遍歷當前文件夾下所有文件
dir);
While( o)){
//每次得到一個文件
filename;
}
//返回
Return $arr;
}
如果當前文件夾內,還有子文件夾,需要進入子文件夾再次進行遍歷
//可以採用遍歷當前文件夾的內容的形式來判斷,但是很難做到全部遍歷
Foreach( value){
//拼湊一個路徑
value;
//判斷路徑
If(is_dir($dir)){
//是一個路徑
dir);
}
}
遞歸調用函數本身
Function myScandir($dir = “.”){
//定義一個數組,接收遍歷的所有結果
Static $arr = array();
//循環遍歷當前文件夾下所有文件
dir);
While( o)){
//將.和..必須去除
If( filename == ‘..’)
{
filename;
}else{
//每次得到一個文件
filename;
//也許當前文件是一個文件夾,那麼需要更深層次的遍歷
If(is_dir( filename)){
//子文件夾與當前文件夾有同樣的結構,只需要調用當前函數本身即可
myScandir( filename);
}
}
}
//返回
Return $arr;
}
遞歸:函數內部調用自己
遞歸有兩個要素:遞歸出口,遞歸點
遞歸出口:當條件達到指定要求時,函數不在進行遞歸調用
遞歸點:子問題與父問題結構一樣
1.Mysql基礎知識和應用
Mysql課程體系
Mysql基礎知識和應用
這部分最重要,主要了解數據的操作和基本原理
大型數據庫優化
主要是講如何提高數據庫的效率,索引,分表(垂直分表,水平分表)
數據庫部署
如何對大型數據庫進行服務器部署,服務器集羣,負載均衡
有幾個概念需要了解:
數據庫:Database存放數據的倉庫,高效率存儲和處理數據的軟件(狹義的理解)
廣義的講,凡是能夠存儲數據的介質都稱之爲數據庫
數據庫管理系統:Database Management System,DBMS,管理數據庫的系統
數據庫系統:Database System = DBMS + DB
系統管理員:Database Administrator DBA,負責日常數據庫的維護(部署)
數據庫有兩大陣營:關係型數據和非關係型數據庫
關係型數據庫:建立在關係模型上的數據庫
關係模型:通過數據結構,數據關係,數據約束三部分構成
關係模型可以理解爲是一張二維表,關係指的是二維表(實體)內部的數據聯繫,以及(實體)表與表之間的聯繫
實體:人類世界中,所能看到的各種單位
設計一個教學系統
實體:老師,學生,教室,科目。。。
設計一個學生表
學號 姓名 性別 年齡
PHP1001 李商隱 男 28
PHP1002 屈原 男 34
注意:一個實體創建一張數據表保存,數據表保存的都是一個實體的相關屬性,與實體無關的不放到一起
設計一個班級表
班級名字 教室名字 開班時間 結束時間
PHP1405 B2302M 20140510 20140925
PHP1402 D306 20140320 20140805
班級表裏面維護與班級相關的信息
實體與實體間的聯繫
如何將學生和班級進行關聯?
學號 姓名 性別 年齡 班級名字
PHP1001 李商隱 男 28 PHP1405
PHP1002 屈原 男 34 PHP1402
PHP1003 李清照 PHP1403
實體與實體之間,通過某一個關係進行管理。
對應數據表,如果進行關聯呢?怎麼表示實體與實體之間是有關係的?
在一個實體中,維護一個信息,該信息指向另外一個實體。
世面上有哪些關係型數據庫?
幾乎所有看到數據庫都是關係型數據,Mysql,Oracle,SQLServer,Access。。。
關係型數據庫特點:
都是保存在硬盤
都是使用二維表保存數據
關係型數據庫即便表中的某個字段數據不存在,但是數據庫也會爲該字段保留空間,關係型數據庫比較浪費硬盤空間。
非關係型數據庫:不是關係型數據庫的都叫非關係型數據
NOSQL:NOT ONLY SQL
非關係型數據庫中數據的存在形式
數據運行在內存中,有一個同步機制,將內存中的內容保存硬盤
存在形式:以鍵值對形式存在,學號=>PHP1001
非關係型數據:memcache,mongodb,redis
關係型與非關係型數據比較:
非關係型數據庫效率高
關係型數據庫更安全
2.關係型數據庫的幾個典型概念
行(row):指的是數據表中的橫向結構,行也稱之爲記錄(record),表示一條數據(代表一個實體信息)
行和記錄沒有本質區別,行是從結構的角度出發,記錄從數據(內容)角度出發
列(col):指的數據表中的縱向結構,列也稱之爲字段(field),表示一列數據
列和字段也沒有本質區別,一個從結構出發,一個從數據出發
SQL:Structured Query language,結構化查詢語言。
指的是關係型數據庫中對數據庫進行管理的語言。SQL雖然是關係型數據庫,但是在不同的關係型數據庫中有那麼一點點微小的區別。
SQL:DDL,DML,DCL
DDL:Data Definition Language,數據定義語言,定義結構,通常指的是結構的操作,如數據庫的創建和刪除,數據表的創建、刪除和修改,create,drop
DML:Data Manipulation Language:數據操作語言,對數據的增刪改查,查詢是一門專門的語言:DQL,Data query Language,數據查詢語言,select,insert,update,delete
DCL:Data Control Language:數據控制語言,主要是實現對系統用戶的權限管理,grant,revoke,flush
Mysql
Mysql是一種關係型數據庫,是一種管理數據的軟件。
軟件結構:b/s和c/s
b/s:browser/server,瀏覽器服務器,指的是隻要服務器運行,在客戶端(PC)通過瀏覽器就可以實現訪問
c/s:client/server,客戶端服務器,如果用戶(PC)希望訪問服務器,必須要安裝對應的客戶端,還要保證客戶端和服務端同時運行。
飛秋是c/s結構,飛秋已經扁平化了,沒有嚴格的客戶端和服務端。
Mysql是一種c/s結構
安裝必須要有客戶端和服務端,mysql.exe是客戶端,mysqld.exe是服務端
進行通信,必須保證兩個端都同時在運行
Mysql是如何實現mysql.exe與mysqld.exe進行通信的呢?
連接認證,客戶端發送連接請求,同時服務端對客戶端進行身份認證
a) 保證找到對應的服務端:-h host,服務器所在的地址 –hlocalhost,-h192.160.3.1
b) 指定端口,找到對應的應用軟件:-P port,端口 –P3306,3306是數據庫的默認端口
c) 還要提供身份:用戶名和密碼,-u username,-p password
d) exe –h192.168.3.1 –P3306 –uroot –proot
登錄成功
客戶端準備和發送SQL語句,發給服務端
服務端執行SQL語句,將執行結果返回給客戶端
客戶端要解析結果,並負責顯示
以上三個步驟,是沒有辦法分離顯示,因爲操作太快
退出客戶端
a) Quit
b) Exit
c) q
Mysql操作原理
如何維護mysql服務?
安裝的過程中加入到系統服務,系統在啓動的時候自動加載mysql服務,在控制檯運行
在windows下,服務的管理,使用命令:net [stop,start,restart] [服務名]
關閉mysql服務:net stop mysql
開啓mysql服務:net start mysql
進入服務列表進行操作
3.Mysqld.exe的啓動
Mysql服務端,用戶沒有辦法直接查看裏面到底有哪些東西。
Mysql服務端有四層對象
服務端:最終管理數據,數據最終是落到字段上進行管理
3.SQL基本操作
基本操作指的是增刪改查:C(create新增)R(read/retrieve,查詢)U(update修改)D(delete刪除)
3.1.庫操作
創建數據庫
語法:create Database 數據庫名字 [庫選項]
庫選項
字符集:charset/character set,指定數據庫內容的編碼
校對集:collate,指的是數據庫數據的比較方式
這條語句執行後,mysql服務端做了哪些工作?
在服務器端的數據文件夾內創建一個名爲shop的文件夾
如何找到該路徑呢?
My.ini文件中的datadir配置項
創建一個庫選項文件,在對應的數據庫文件夾裏,有一個db.opt文件,保存數據庫的庫選項
內容就是保存的庫選項
數據庫命名規則
1.使用字母,下劃線和數字來命名,通常,以字母開頭(數據庫名字命名並沒有非常嚴格的要求)
2.如果出現關鍵字或者保留字當做數據庫名字,應當使用反引號對庫名進行包裹,反引號是esc下面的那個鍵,在英文輸入狀態下輸出的內容
Syntax錯誤:語法錯誤,提示錯誤的範圍
正確使用
數據可以使用中文做名字,但是需要使用反引號
但是中文數據庫下創建的數據庫文件夾名字,會以額外的編碼形式存在
規範:
通常數據庫的命名,要做到見名之意
不使用中文
通常,數據庫會有前綴ecs_
查看數據庫
語法1:show databases,顯示所有數據庫
語法2:show databases like [‘pattern’],模糊查詢,指定查詢條件
%:通配符,匹配所有字符,所有數量
_:匹配所有字符,一次
Show databases like “my%”; – 查找以my開頭的所有的數據庫
Show databases like “my_”; – 查找以my開頭,後面跟一個字符的數據庫
原因:下劃線匹配一個字符,%匹配所有字符 ==》以information開始的所有數據
如果要得到下劃線,必須對下劃線進行轉義
查看數據庫創建語句
語法:show create database 數據庫名字
修改數據庫
數據庫名字不可以修改。
修改的是數據庫庫選項
語法:alter database 數據庫名字 [庫選項]
效果
刪除數據庫
結構的刪除都是使用drop關鍵字,而數據庫是一種結構
語法:drop Database 數據庫名字
效果
注意:不能輕易的刪除任何數據,數據庫也不能隨意刪除,因爲數據的刪除是不可逆的。如果非要刪除數據庫,那麼請先對數據庫進行備份
3.2.表操作
對數據庫內的數據表進行CRUD操作,該操作仍然是結構上的。
表應該對應結構才能稱之爲表。
表操作包含自身操作以及字段的操作。表跟字段是密不可分的。
創建表
語法:create table 表名(
–字段列表
字段1 字段類型,
字段2 字段類型,
…
字段N 字段類型
)[表選項];
表選項:字符集和存儲引擎
字符集:該表存儲數據所採用的字符集
存儲引擎:當前表按照上面數據格式來存儲數據
字段爲什麼需要字段類型?
SQL是一門強類型語言,對於數據必需要指定其數據類型,不是同一個數據類型的內容不能存放。
創建數據表
錯誤:沒有選擇數據庫
原因:數據表是依賴數據庫存在的,是數據庫的子對象,所以創建的數據表必須指定數據庫
顯示指定數據庫,指的是在創建表的時候,明確指定該表應該放到哪個數據庫下
語法:數據庫.數據表
默認使用數據庫,前提是當前環境已經進入到某個指定的數據庫。
進入數據庫語法:use 數據庫名字
所有創建語法,都可以先對要創建的對象進行是否存在判斷。
如不能創建已經存在的數據庫
防止衝突的辦法:
If not exists:如果不存在
If exists:如果存在
If not exists使用
If exists使用
數據表的命名規則:跟數據庫基本一致
一般數據表的命名採用下劃線方式。
R:查詢表
語法:show tables;查詢當前數據庫中所有的表
語法:show tables like “c%”;模糊查詢
語法:show create table 數據表名,查看錶的創建語句
語法:desc 表名;查看錶中的字段信息,describe 表名;show columns from 表名
U:更新表結構
語法:alter table 表名 add/modify/change/drop [column] 字段名 [字段類型] [位置]
Add:添加一個字段:add 字段名字 字段類型 [位置]
指定位置
Modify:修改一個字段類型:modify 字段名 字段類型 [位置]
Change:修改一個字段名字:change 舊字段名 新字段名 字段類型 [位置]
Drop:刪除一個字段:drop 字段名
位置:有兩個選項的
First:表示放到表的第一個位置,語法:first
After:表示放到哪個字段的後面,語法:after 字段名
修改表的名字
語法:rename table 舊錶名 to 新表名
D:刪除數據表
語法:drop table 表名
注意:刪除要慎用,表的刪除會將整個表中的數據全部幹掉,而這種操作不可逆。
3.3.數據操作
對數據表裏保存的數據進行增刪改查操作
C:新增數據
語句:insert into 表名 [(字段列表)] values (值列表)
如果沒有字段列表,值列表的數量必須跟表字段數目完全一致,順序要完全對應
如果有字段列表,那麼字段列表與值列表的字段數據必須完全一致,順序要完全對應
如果使用字段列表,該字段列表可以不與數據表的字段列表順序一致
錯誤1:字段類型與值類型不匹配
錯誤2:待插入的字段列表與當前插入的值列表的數量不匹配
R:查詢數據
語法:select [字段列表] from 表名 [where條件]
查詢所有數據
查詢指定字段
查詢指定條件數據
U:更新數據
語法:update 表名 set 字段 = 值 [where條件]
多字段修改
D:刪除數據
語法:delete from 表名 [where條件]
注意:通常update和delete都必須匹配where條件,否則不允許操作,因爲更新和刪除都是永久性的,不可逆的。
中文數據插入
Windows下,命令行模式裏,只識別gbk編碼,而且該編碼不可以改變
要保證mysql.exe在控制檯可以輸入中文並且讓服務端識別的話,有一個快捷方式
Set names gbk; //告訴服務器,客戶端給服務器傳遞數據是gbk編碼的
查看mysql支持的字符集
語法:show character set;
一共支持39種字符集,除了這39種之外,其他的字符集就不能支持。
查看mysql服務器對外設置的默認的字符集
語法:show variables like ‘character_set%’;
保證服務器端能夠識別客戶端的數據,只需要修改character_set_client = gbk;
Set character_set_client = gbk;
就可以使用gbk編碼的數據傳輸給服務器
修改結果集的字符集
Mysql.exe就可以解析數據
客戶端與服務端進行不同字符集編碼數據通信的原理
Set names gbk做了什麼事情?
數據庫數據存儲的最終編碼?
DBMS:安裝數據庫時指定編碼
DB:創建數據庫時指定
Table:創建表時指定
Field:創建字段的時候指定
最終數據的存儲編碼,受最近的字符集影響,如果沒有強制指定,那麼順序依次是:字段à表à數據庫àDBMS
注意:
1 只要用戶設定好了,客戶端的編碼(character_set_client,character_set_results),不管數據庫最終存儲數據是按照什麼字符集,都不會出現亂碼。
2 字符集的最終設定受當前代碼所在的環境影響,代碼在控制檯,就只能是gbk,代碼在文件裏,跟文件的編碼是一致的。
本文轉載自《重蔚自留地:重蔚自留地php學習第三十五天——mysql基礎1》