PHP筆記(PHP進階篇)

來源:互聯網
上載者:User
進階篇中將涉及資料庫的使用以及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的基礎學習算是完成了,需要多做多學,方能提高!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.