高級篇中將涉及數據庫的使用以及Cookie和Session會話,提高PHP的開發效率和運行效率
PHP程序員需要掌握的MySQL操作
- 為項目設計表
- 使用SQL語句
- MySQL的目錄結構
- data目錄中存放的是庫文件
- bin目錄中存放的是MySQL管理命令
- *.ini文件記錄的是MySQL的配置
連接MySQL DB:
- mysql -h sql地址 -u 用戶名 -p密碼,如mysql -h localhost -u root -p123456
- 安全的方法:先輸入“mysql -h sql地址 -u 用戶名 -p”,回車,再輸入密碼
數據定義語言(DDL)
- 定義:用來創建數據庫中的各種對象-----表、視圖、索引、同義詞、聚簇等
- SQL語句
- 創建數據庫
-
CREATE DATABASE [IF NO EXISTS] DatabaseName
- 創建表
CREATE TABLE [IF NOT EXISTS] TableName ( colname1 type [property] [index], colname2 type [property] [index], ... )[tableType] [tableCharSet];
- 修改表
- alter table 操作
- 數據類型
- 數值型
- UNSIGNED:指定為無符號存儲
- 整型
- TINYINT 1 Byte (-128,127) (0,255) 小整數值
SMALLINT 2 Byte (-32 768,32 767) (0,65 535) 大整數值
MEDIUMINT 3 Byte (-8 388 608,8 388 607) (0,16 777 215) 大整數值
INT或INTEGER 4 Byte (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整數值
BIGINT 8 Byte (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 極大整數值
- TINYINT 1 Byte (-128,127) (0,255) 小整數值
- 浮點型
- FLOAT 4 字節 (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38)
- DOUBLE 8 字節 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
- 字符型
- CHAR 0-255Byte 定長字符串,
VARCHAR 0-255Byte 變長字符串,必須指定長度
TINYBLOB 0-255Byte 不超過 255 個字符的二進制字符串
TINYTEXT 0-255Byte 短文本字符串
BLOB 0-65 535Byte 二進制形式的長文本數據
TEXT 0-65 535Byte 長文本數據
MEDIUMBLOB 0-16 777 215Byte 二進制形式的中等長度文本數據
MEDIUMTEXT 0-16 777 215Byte 中等長度文本數據
LOGNGBLOB 0-4 294 967 295Byte 二進制形式的極大文本數據
LONGTEXT 0-4 294 967 295Byte 極大文本數據 - CHAR的處理速度比較快,VARCHAR具有可變大小
- 二進制保存主要用於保存非文本文件
- ENUM,枚舉類型,最多能存儲65535個值,一個字段只能存一個值
- SET,集合類型,最多可存儲64個值,一個值段可存多個值
- CHAR 0-255Byte 定長字符串,
- 日期型
- DATE 3Byte 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3Byte '-838:59:59'/'838:59:59' HH:MM:SS 時間值或持續時間
YEAR 1Byte 1901/2155 YYYY 年份值
DATETIME 8Byte 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值
TIMESTAMP 8Byte 1970-01-01 00:00:00/2037 年某時 YYYYMMDD HHMMSS 混合日期和時間值,時間戳
- DATE 3Byte 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
- 數值型
※任何數據類型以字符串的形式存入,都可以自動轉換類型
※將時間保存為php時間戳,方便運算
數據字段屬性
- unsigned:設置該字段為無符號數值,只能是數值型
- zerofill:設置該字段的記錄的值未達到指定位數時,用“0”填充,只能是數值型
- auto_increment:設置該字段的值自動增長,也可設定自定義值,需要同時設定索引或主鍵,只能是數值型
- null和not null:設置該字段是否允許為空,建議設定為非空,配合default使用
- default:設置該字段的默認值,若不輸入,使用默認值
索引
- 優點:
- 提高查詢速度
- 缺點:
- 創建和維護成本比較高
- 占用資源
- 主鍵索引(primary key):索引值必須唯一,每張表只有一個
- 唯一索引(unique):索引值必須唯一,但一張表可以有多個
- 常規索引(index):最基本的索引,沒有太多的限制
- 全文索引(filltext):只能在MyISAM上使用,表越大,效果越好,但速度較慢
- 創建和使用,可查看MySQL索引類型一覽表 讓MySQL高效運行起來
數據表類型及存儲位置
- MySQL可以針對不同的存儲引擎需求可以選擇最優的存儲引擎
- 數據表類型即存儲引擎
- 使用type或engine關鍵字指定表類型
- 常用的表類型
- MyISAM
- 強調快速讀取操作
- 對一些功能不支持(事務)
- InnoDB
- 支持一些MyISAM不支持的功能
- 不支持全文索引
- 占用空間比較大
功能 MyISAM InnoDB 事務處理 不支持 支持 數據行鎖定 不支持 支持 外鍵約束 不支持 支持 表空間占用 相對較小 較大 全文索引 支持 不支持
- 占用空間比較大
- MyISAM
MySQL默認字符集
- 推薦utf8
- 字符集:用來定義MySQL存儲字符串的方式
- 使用character set關鍵字指定字符集
- 校對規則:對規則定義了比較字符串的方式
- 使用collate指定校對規則
數據操作語言(DML)
- 主要有三種形式:
- 1) 插入:INSERT
- insert into tablename[(字段列表)] values(值列表1)[,(值列表2)...]
- 表名后面,若有字段列表,則值列表與字段列表一一對應,若沒有字段列表,則值列表與表中的字段一一對應
- insert into tablename[(字段列表)] values(值列表1)[,(值列表2)...]
- 2) 更新:UPDATE
- update tablename set 字段名='值' [條件]
- 1) 插入:INSERT
-
- 3) 刪除:DELETE
- delete from tablename [條件]
- 可以使用運算符,包括算術運算符、邏輯運算符、比較運算符、位運算符
- 3) 刪除:DELETE
數據查詢語言(DQL)
- 基本結構是由SELECT[ALL|DISTINCT]子句,FROM子句,WHERE
- 子句組成的查詢塊:
- SELECT <字段列表>
- FROM <表或視圖名>
- [WHERE<查詢條件>/GROUP BY/ORDER BY]
- DISTINCT表示不顯示重復的記錄
- 使用as關鍵字,可為字段名起別名,用於可能產生歧義的字段名
- 子句組成的查詢塊:
數據控制語言(DCL)
- 定義:用來授予或回收訪問數據庫的某種特權,並控制數據庫操縱事務發生的時間及效果,對數據庫實行監視等。
MySQL內置函數
- 位置:select語句,及子句where order by having 中,update delete語句及子句
- 函數中可以將字段名當作變量來用,變量的值就是該列對應的所有值
- 常用
- 字符串函數
- concat:把傳入的參數連接成一個字符串
- insert(str,x,y,insert):從str的x位置開始,替換y長度的字符串為insert
- lower(str),upper(str):將字符串轉換為大寫,小寫
- left(str,x) right(str,x) 返回str左邊(右邊)x個字符,x為null則返回null
- lpad(str,n,pad) rpad(str,n,pad) 用pad對字符串str從最左邊(右邊)進行填充,直到總長度n
- trim(str),ltrim(str),rtrim(str)去掉兩邊,左邊,右邊空格
- replace(str,a,b) 在字符串str中用字符串b替換所有的字符串a
-
strcmp(s1,s2):如果S1比S2小,返回-1;如果S1比S2大則返回1;如果相等則返回0(比較的是ASCII碼)
- substring(str,x,y) 返回字符串str中從位置x起,長度為y的子字符串
- 數值函數
- abs(x):返回絕對值
- ceil(x):返回大於x的最小整數
- floor(x):返回小於x的最大整數
- mod(x,y):返回x與y的模
- rand():返回0-1之間的隨機數
- round(x,y):返回參數x的y位小數的四舍五入結果
- truncate(x,y):返回數字x截斷為y位小數的結果
- 日期函數
- curdate():返回當前年月日
- curtime():返回當前時分秒
- now():返回當前日期
- unix_timestamp(time):返回unix時間戳
- from_unixtime():將Unix時間戳轉換為日期
- week():返回時間戳的周
- year():返回時間戳的年
- hour():返回時間戳的小時
- minute():返回時間戳的分鍾
- month():返回時間戳的月
- date_format(time,"%Y-%m-%d %H:%i:%s"):格式化返回時間
- 流程控制函數
- if(value,t,f):如果value值為true,返回t,如果value值為false,返回f
- ifnull(value1,value2):如果value1為空,則返回value2,如果value1不為空,返回value1
- case
when value1 then value2
when value3 then value4
......
else fault END
- 當value1為true,返回value2,當value3位true,返回value4,以此類推,否則返回fault
- 其他用法:mysql 語句case when
- 其他函數
- database():返回數據庫名
- version():返回MySQL版本
- user():返回MySQL的用戶
- inet_aton(ip):將IP轉換為網路字節序
- inet_nton():將網絡字節序轉為IP
- password():MySQL用戶密碼加密
- md5(str):將字符串加密
- 字符串函數
PHP操作數據庫
- 連接數據庫
- mysql_connect(IP,user,psw):IP為數據庫地址,user為用戶名,psw為用戶密碼,連接成功,返回數據庫資源,連接失敗,返回false
- 選擇庫
- mysql_select_db($dbname,[$res]):$dbname為庫名稱;$res為連接數據庫是返回的資源,若不添加該參數,則默認為最近創建的數據庫資源
- SQL語句輸入
- mysql_query():執行SQL語句,若語句有返回結果集,則函數執行成功返回結果集,若語句沒有返回結果集,函數執行成功返回true
- 解決錯誤
- mysql_errno():返回錯誤號
- mysql_error():返回錯誤信息
- 關閉數據庫資源
- mysql_close():關閉數據庫資源,不使用參數,默認關閉開啟的資源(推薦)
- 函數
- mysql_insert_id():返回自動增長的id,若沒有設置AUTO_INCREMENT,則返回false
- mysql_affected_rows():獲取受影響的行數
- 從結果集中取出數據
- mysql_fetch_row($result):從結果集中取得一條數據,返回索引數組
- mysql_fetch_assoc($result):從結果集中取得一條數據,返回關聯數組
- mysql_fetch_array($result):從結果集中取得一條數據,返回索引數組和關聯數組
- mysql_fetch_object($result):從結果集中取得一條數據,返回對象
- mysql_data_seek($result,$row):將指針移動到指定位置
- 從結果集中獲取字段
- mysql_num_rows($result):獲取結果集的字段數
- mysql_num_fields($result):獲取結果集的列數
- mysql_field_name($result):獲取結果集的字段名
mysqli操作數據庫
- PHP5以后的新添加的功能都是面向對象的,所以mysqli是以對象的形式添加的
- mysqli優點
- 表示改進
- 功能增加
- 效率大大增加
- 更穩定
- mysqli擴展提供的三個類
- mysqli:和連接有關的類
- 構造方法
- mysqli([$host [, $username [, $passd[, $dbname [,$port [, $socket ]]]]]] )
- 連接成功返回對象,失敗返回false
- 查看連接失敗信息
- connect_errno():返回連接錯誤號碼
- connect_error():返回連接錯誤信息
- SQL語句輸入
- query(sql):執行SQL語句,若語句有返回結果集,則函數執行成功返回結果集對象mysqli_result,若語句沒有返回結果集,函數執行成功返回true
- 方法
- affected-rows():返回影響行數
- errno():返回錯誤號
- error():返回錯誤信息
- insert_id():返回自動增長的id
- 關閉資源
- close():關閉連接
- 構造方法
- mysqli_result:表達對數據庫的查詢所返回的結果集
- 屬性:
- $num_rows:結果集中記錄數
- $field_count:結果集中字段數
- $current_field:獲取當前列的位置
- 方法:
- 處理記錄
- fetch_row():與mysql_fetch_row()一致
- fetch_assoc():與mysql_fetch_assoc()一致
- fetch_array():與mysql_fetch_array()一致
- fetch_object():與mysql_fetch_object()一致
- data_seek():與mysql_data_seek()一致
- free():釋放結果集
- 處理字段
- fetch_field():取出列信息,並作為對象返回
- fetch_fields():取出所有列信息,並作為對象返回
- field_seek():移動字段指針
- 執行多條SQL語句
- multi_query(sql1[;sql2]):可執行多條sql語句,語句間用“;”隔開,若有多個結果集,則均會被返回
- next_result():返回multi_query()的下一個結果集
- more_results():檢查是否含有下一個結果集
- 處理記錄
- 屬性:
- mysqli_stmt:預處理類
- 優點:
- mysqli和mysqli_result能完成的功能,mysqil_stmt都能完成
- 效率比較高,執行多條相同的sql語句,只有數據不同的話,不用重復傳語句,直接傳數據即可
- 防止sql注入,因為出入的數據只會當做值類使用,不會當做可執行語句
- 創建對象
- 創建好mysqli對象后,使用該對象的stmt_init()方法初始化mysqli_stmt對象
- 准備並發送語句
- 語句中的參數值要使用占位符“?”代替
- 使用mysqli_stmt中的prepare($sql)方法將語句發送到服務器准備
- 不用創建mysqli_stmt對象,直接使用mysqli中的prepare($sql)准備sql語句,並返回mysqli_stmt對象
- 語句中的參數值要使用占位符“?”代替
- 給占位符傳值(綁定參數)
- 使用bind_param($type,$var1[,$var2...])綁定參數
- $type可以為i、d、s、b,分別代表integer、double、string和二進制資源
- $type中的類型個數要與占位符相同,$var個數也要與占位符個數相同
- 給變量$var賦值
- 使用bind_param($type,$var1[,$var2...])綁定參數
- 執行sql語句
- 沒有結果集返回
- 使用execute()方法執行插入的參數,返回boolean類型
- 有結果集返回
- 使用bind_result($var1[,$var2...])綁定結果集
- 使用fetch()執行語句,每次獲取一條結果,並傳遞到bind_result()中的變量
- 使用store_result()執行語句,將所有結果一次性取出,返回結果集,再用fetch()獲取每一條記錄
- result_matedate()返回結果集,用於獲取字段信息
- 使用result_free()釋放結果集
- 使用bind_result($var1[,$var2...])綁定結果集
- 沒有結果集返回
- 關閉資源
- 使用close()方法關閉
- 函數
- mysqli和mysqli_result支持函數,mysqli_stmt基本都支持
- 優點:
- mysqli:和連接有關的類
- 事務處理
- 建立表
- 表類型為MyISAM不支持事務功能,需要建立InnoDB類型的表
- 關閉自動提交
- autocommit():參數為0或false時,關閉自動提交
- 提交事務
- commit():提交事務(多條執行后的sql語句)
- 回滾事務
- rollback():回滾事務(多條已執行的sql語句)
- 建立表
- 其他方法
- set_charset($string):設置取出字符集
PDO
- 優點:
- 更換數據庫時,不用更改代碼
- 缺點:
- 效率不如mysql和mysqli高
- 三個類
- PDO:代表 PHP 和數據庫服務之間的一個連接
- 創建PDO對象
- dpo($dsn,$username,$passd[,$array]):$dsn連接mysql數據庫時,設置為'mysql:host=ip:port;dbname=$string',$array為調優參數
- DSN(data source name)數據源:包括主機位置、庫名和不同數據庫所需驅動
- 可用getattribute($attribute)查看屬性,使用setattribute($attribute,$value)設置屬性
- 執行sql語句
- query($string):執行有結果集返回的語句,返回預處理對象PDOStatement
- exec($string):執行對表有影響的語句,返回被影響行數
- 設計錯誤報告
- 使用setAttribute()設置錯誤報告模式
- ERRMODE_SILENT:不顯示錯誤,開發人員自行檢查錯誤
- errorCode:返回錯誤號碼
- errorInfo:返回錯誤信息數組
- ERRMODE_WARNING:發生錯誤,顯示一個E_WARNING消息
- ERRMODE_EXCEPTION:發生錯誤,拋出PDOException異常
- 事務處理
- 使用setAttribute(),設置開啟事務處理,關閉自動提交
- 使用commit()提交已執行的sql語句
- 使用rollback()回滾已執行的sql語句
- 創建PDO對象
- PDOStatement:代表一條預處理語句,並在該語句被執行后代表一個相關的結果集
- 作用
- 准備一條語句
- 處理結果集
- 准備並發送語句
- 語句中的參數值可使用占位符“?”
- 占位符“:占位符名字”代替
- 作用
- PDO:代表 PHP 和數據庫服務之間的一個連接
-
-
-
- 使用PDO::prepare($sql)方法將語句發送到服務器准備,返回PDOStatement對象,存儲結果集
-
-
-
-
- 給占位符傳值(綁定參數)
- 使用bind_param($key,$value)綁定參數
- “?”占位符
- $key設置為索引號,
- $value設置為傳送值
- 名字占位符
- $key設置為鍵名
- $value設置為傳送值
- “?”占位符
- 使用bind_param($key,$value)綁定參數
- 給占位符傳值(綁定參數)
-
-
-
- sql語句執行
- 使用execute()方法執行已綁定參數的語句
- 使用execute($array),$array數組中添加參數,避免綁定參數
- 記錄獲取
- 使用fetch()獲取結果集中的每一條記錄,返回索引和關聯混合數組
- 參數為PDO::FETCH_ASSOC,返回關聯數組
- 參數為PDO::FETCH_NUM,返回索引數組
- 參數為PDO::FETCH_BOTH,返回索引關聯混合數組
- fetchAll()獲取結果集的每一條記錄,返回二維數組
- 使用setFatchMode()設置獲取模式,就可以避免每次獲取都要設置模式
- 使用fetch()獲取結果集中的每一條記錄,返回索引和關聯混合數組
- 字段獲取
- columnCount()獲取字段數
- getColumnMeta()返回結果集中一列的元數據
- sql語句執行
- PDOException:代表一個由 PDO 產生的錯誤。在自己的代碼不應拋出一個 PDOException 異常
- 使用try catch捕獲各種異常,包括連接異常、sql語句異常等
-
mamcache/memcached
- 一個高性能的分布式的內存對象緩存系統。通過在內存中維護一個巨大的hash表,維護內存中的數據
- 工作原理
- PHP第一次查詢數據時,會將數據存儲在mamcache中,下次查詢時,先訪問mamcache。
- 安裝
- Linux下安裝
-
基於libevent事件,所以必須先安裝libevent庫
-
- Windows下安裝
- 默認端口11211
- Linux下安裝
- memcache命令
Command | Description | Example |
---|---|---|
get | Reads a value | get mykey |
set | Set a key unconditionally | set mykey 0 60 5 |
add | Add a new key | add newkey 0 60 5 |
replace | Overwrite existing key | replace key 0 60 5 |
append | Append data to existing key | append key 0 60 15 |
prepend | Prepend data to existing key | prepend key 0 60 15 |
incr | Increments numerical key value by given number | incr mykey 2 |
decr | Decrements numerical key value by given number | decr mykey 5 |
delete | Deletes an existing key | delete mykey |
flush_all | Invalidate specific items immediately | flush_all |
Invalidate all items in n seconds | flush_all 900 | |
stats | Prints general statistics | stats |
Prints memory statistics | stats slabs | |
Prints memory statistics | stats malloc | |
Print higher level allocation statistics | stats items | |
stats detail | ||
stats sizes | ||
Resets statistics | stats reset | |
version | Prints server version. | version |
verbosity | Increases log level | verbosity |
quit | Terminate telnet session | quit |
PHP中使用memcache
- 類:memcache
- 連接:memcache::connect($host,$port)
-
1 <?php 2 $memcache = new Memcache; 3 $memcache->connect("localhost",11211) or die("could not connect");
- 其他方法
- add:添加數據
- set/replace:修改數據
- get:獲取數據
- delete:刪除數據
- ......
- 何時使用memcache
- 數據庫中讀出來的數據,方便下次使用
- 會話控制中使用
- 技巧
- 用sql語句作為key
- 用md5()修改sql語句,使sql語句變短,便於保存
會話控制:面向連接的可靠的連接方式,通過會話控制,判斷用戶的登錄行為
- cookie技術
- 服務器給客戶端的一個文件,通過客戶端的這個文件,保存用戶信息,服務器根據文件,區分用戶
- 設置cookie
- setcookie($key,$value,$time):頭信息,不能有任何輸出
- 獲取cookie
- 使用全局數組$_COOKIE[]獲取cookie內容
- 刪除cookieti
- 用setcookie設置$value為空或不設置,$time設置為0或不設置
- session技術
- 在服務器中保存用戶數據,會產生一個SessionID,可使用cookie和url傳遞該id
- session配置
- 配置服務器端的php.ini
- 開啟會話
- session_start():讓php的核心程序將和session有關的內建環境變量預先載入到內存中
- 開啟一個會話
- 基於cookie的session,使用該函數不能有任何輸出
- 返回已開啟的會話
- 開啟一個會話
- session_start():讓php的核心程序將和session有關的內建環境變量預先載入到內存中
- 設置和獲取session
- 使用$_SESSION[]設置和獲取session
- session_id()獲取和設置session的id
- 刪除session
- $_SESSION=array();將session設置為空數組
- 刪除cookie中的session
- session_destory():銷毀session
- 基於url傳遞sessionid,設置url的參數為session_name,session_start()后,會自動尋找該參數
- 常量SID,當用戶關閉cookie時,該常量表示session_name和session_id;當用戶開啟cookie時,該常量為空
- 設置php.ini中的session.use_trans_sid=1,會使頁面跳轉(超鏈接、header、表單)后面自動添加SID
- session高級技術
- php.ini中,session的設置
- session_name:設置存在cookie以及SID中的session_name
- session.use_trans_sid:設置SID是否開啟,開啟后,可自動添加SID
- session.save_path:設置session文件的保存位置,如果不設置,則不生成session文件
- session.gc_maxlifetime:設置session文件有效時間,超過該時間session未刷新,session文件將失效
- session.gc_probability和session.gc_divisor結合使用,定義session垃圾回收概率,算法為session.gc_probability/session.gc_divisor
- session.use_cookie:設置session寫入到cookie中
- session.cookie_path:設置哪些文件的session寫入到cookie中
- session.cookie_lifetime:設置session的生命周期
- session.save_handler:設置session寫入方式及位置,當值為user時,可使用session_set_save_handler()函數
- session_set_save_handler(open(),close(),read(),write(),destroy(),gc()):可自定義session文件的存儲路徑及存儲方式等
- 使用該函數定義了各個方法,像往常一樣使用session
- open():在執行session_start()時,被調用
- close():在執行session_write_close()時,被調用
- read():在調用open()后,被調用
- write():腳本結束時和session_write_close()執行時,被調用
- destroy():當session使用session_destroy()或者session_regenerate_id()被銷毀時,被調用
- gc():由session.gc_probability和session.gc_divisor決定,任何時候軍可能被調用
- 具體用法
- 將Session寫入數據庫
- 將Session寫入Memcache
- php.ini中,session的設置
至此,PHP的基礎學習算是完成了,需要多做多學,方能提高!