進階篇中將涉及資料庫的使用以及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”,斷行符號,再輸入密碼
資料定義語言 (Data Definition Language)(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) 極大整數值
浮點型
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個值,一個值段可存多個值
日期型
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 混合日期和時間值,時間戳記
※任何資料類型以字串的形式存入,都可以自動轉換類型
※將時間儲存為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 |
交易處理 |
不支援 |
支援 |
資料行鎖定 |
不支援 |
支援 |
外鍵約束 |
不支援 |
支援 |
資料表空間佔用 |
相對較小 |
較大 |
全文索引 |
支援 |
不支援 |
MySQL預設字元集
推薦utf8
字元集:用來定義MySQL儲存字串的方式
使用character set關鍵字指定字元集
校對規則:對規則定義了比較字串的方式
使用collate指定校對規則
資料操作語言(DML)
主要有三種形式:
1) 插入:INSERT
insert into tablename[(欄位列表)] values(值列表1)[,(值列表2)...]
表名後面,若有欄位列表,則值列表與欄位列表一一對應,若沒有欄位列表,則值列表與表中的欄位一一對應
2) 更新:UPDATE
update tablename set 欄位名='值' [條件]
3) 刪除:DELETE
delete from tablename [條件]
可以使用運算子,包括算術運算子、邏輯運算子、比較子、位元運算符
資料查詢語言(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賦值
執行sql語句
沒有結果集返回
使用execute()方法執行插入的參數,返回boolean類型
有結果集返回
使用bind_result($var1[,$var2...])綁定結果集
使用fetch()執行語句,每次擷取一條結果,並傳遞到bind_result()中的變數
使用store_result()執行語句,將所有結果一次性取出,返回結果集,再用fetch()擷取每一條記錄
result_matedate()返回結果集,用於擷取欄位資訊
使用result_free()釋放結果集
關閉資源
使用close()方法關閉
函數
mysqli和mysqli_result支援函數,mysqli_stmt基本都支援
交易處理
建立表
表類型為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語句
PDOStatement:代表一條預先處理語句,並在該語句被執行後代表一個相關的結果集
作用
準備一條語句
處理結果集
準備並發送語句
語句中的參數值可使用預留位置“?”
預留位置“:預留位置名字”代替
使用PDO::prepare($sql)方法將語句發送到伺服器準備,返回PDOStatement對象,儲存結果集
給預留位置傳值(綁定參數)
使用bind_param($key,$value)綁定參數
“?”預留位置
$key設定為索引號,
$value設定為傳送值
名字預留位置
$key設定為鍵名
$value設定為傳送值
sql語句執行
使用execute()方法執行已綁定參數的語句
使用execute($array),$array數組中添加參數,避免綁定參數
記錄擷取
使用fetch()擷取結果集中的每一條記錄,返回索引和關聯混合數組
參數為PDO::FETCH_ASSOC,返回關聯陣列
參數為PDO::FETCH_NUM,返回索引數組
參數為PDO::FETCH_BOTH,返回索引關聯混合數組
fetchAll()擷取結果集的每一條記錄,返回二維數組
使用setFatchMode()設定擷取模式,就可以避免每次擷取都要設定模式
欄位擷取
columnCount()擷取欄位數
getColumnMeta()返回結果集中一列的中繼資料
PDOException:代表一個由 PDO 產生的錯誤。在自己的代碼不應拋出一個 PDOException 異常
使用try catch捕獲各種異常,包括串連異常、sql語句異常等
mamcache/memcached
一個高效能的分布式的記憶體對象緩衝系統。通過在記憶體中維護一個巨大的hash表,維護記憶體中的資料
工作原理
PHP第一次查詢資料時,會將資料存放區在mamcache中,下次查詢時,先訪問mamcache。
安裝
Linux下安裝
基於libevent事件,所以必須先安裝libevent庫
Windows下安裝
預設連接埠11211
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 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
使用$_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的基礎學習算是完成了,需要多做多學,方能提高!