PHP筆記(PHP高級篇)

高級篇中將涉及數據庫的使用以及Cookie和Session會話,提升PHP的開發效率和運行效率php

 

PHP程序員須要掌握的MySQL操做html

  • 爲項目設計表
  • 使用SQL語句
  • MySQL的目錄結構
    • data目錄中存放的是庫文件
    • bin目錄中存放的是MySQL管理命令
    • *.ini文件記錄的是MySQL的配置

鏈接MySQL DB:mysql

  • mysql -h sql地址 -u 用戶名 -p密碼,如mysql -h localhost -u root -p123456
  • 安全的方法:先輸入「mysql -h sql地址 -u 用戶名 -p」,回車,再輸入密碼

 數據定義語言(DDL)linux

  • 定義:用來建立數據庫中的各類對象-----表、視圖、索引、同義詞、聚簇等
  • 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時間戳,方便運算web

數據字段屬性算法

  • unsigned:設置該字段爲無符號數值,只能是數值型
  • zerofill:設置該字段的記錄的值未達到指定位數時,用「0」填充,只能是數值型
  • auto_increment:設置該字段的值自動增加,也可設定自定義值,須要同時設定索引或主鍵,只能是數值型
  • null和not null:設置該字段是否容許爲空,建議設定爲非空,配合default使用
  • default:設置該字段的默認值,若不輸入,使用默認值

索引sql

  • 優勢:
    • 提升查詢速度
  • 缺點:
    • 建立和維護成本比較高
    • 佔用資源
  • 主鍵索引(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。
  • 安裝  
  • 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
      • 使用$_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的基礎學習算是完成了,須要多作多學,方能提升!

相關文章
相關標籤/搜索