摘要:擴(kuò)展原生提供了擴(kuò)展,意思是數(shù)據(jù)對(duì)象。數(shù)據(jù)庫鏈接和是指數(shù)據(jù)源名稱,提供數(shù)據(jù)庫鏈接的詳細(xì)信息。如果數(shù)據(jù)庫需要認(rèn)證,則需要提供這兩個(gè)參數(shù)。讓和返回一個(gè)對(duì)象,對(duì)象的屬性是數(shù)據(jù)庫的列名。事務(wù)的原子性能保證數(shù)據(jù)的一致性安全性和持久性。
PHP原生提供了PDO擴(kuò)展,意思是PHP數(shù)據(jù)對(duì)象。
DSN是指數(shù)據(jù)源名稱,提供數(shù)據(jù)庫鏈接的詳細(xì)信息。一般包含以下信息:
主機(jī)名或者IP地址
端口號(hào)
數(shù)據(jù)庫名
字符集
以上信息構(gòu)成的DSN可以用于PDO類構(gòu)造函數(shù)的第一個(gè)參數(shù),第二個(gè)和第三個(gè)參數(shù)分別是數(shù)據(jù)庫的用戶名和密碼。如果數(shù)據(jù)庫需要認(rèn)證,則需要提供這兩個(gè) 參數(shù)。
保證密碼憑證的安全
把數(shù)據(jù)庫憑證保存在一個(gè)位于文檔根目錄之外的配置文件中,然后在需要的文件中導(dǎo)入這個(gè)文件。
預(yù)處理語句
在SQL中使用用戶的輸入時(shí),一定要過濾。因此需要使用PDO擴(kuò)展的預(yù)處理語句和參數(shù)綁定,這項(xiàng)操作非常簡(jiǎn)單。預(yù)處理語句是PDO對(duì)象的實(shí)例,不過我們很少直接去實(shí)例化這個(gè)類,而是通過PDO實(shí)例的prepare方法獲得預(yù)處理語句的對(duì)象。這個(gè)方法得第一個(gè)參數(shù)是一個(gè)sql語句字符串,返回值是一個(gè)PDOStatement實(shí)例:
prepare($sql);在這個(gè)SQL語句中,email這個(gè)值可以安全的綁定任何值。
prepare($sql); $email = filter_input(INPUT_GET, "email"); $statement->bindValue(":email", $email);預(yù)處理語句會(huì)自動(dòng)過濾$email的值。PDOStatement的第三個(gè)參數(shù)可以制定綁定值的類型,不填的話默認(rèn)就是字符串類型??蛇x的常量類型如下
PDO::PARAM_BOOL
PDO::PARAM_NULL
PDO::PARAM_INT
PDO::PARAM_STR(默認(rèn)值)
查詢結(jié)果
如果執(zhí)行的是select方法,返回的數(shù)據(jù)我們需要使用fetch()、fetchAll()、fetchColumn()和fetchObject()方法獲取查詢結(jié)果。
//把預(yù)處理語句獲得的結(jié)果當(dāng)成關(guān)聯(lián)數(shù)組處理 $sql = "SELECT id, email FROM users WHERE email = :email"; $statement = $pdo->prepare($sql); $email = filter_input(INPUT_GET, "email"); $statement->bindValue(":email", $email); $statement->execute(); //迭代結(jié)果 while(($result = $statement->fetch(PDO::FETCH_ASSOC)) !== false) { echo $result["email"]; }fetch、fetchAll方法的參數(shù)可選
PDO::FETCH_ASSOC:返回一個(gè)關(guān)聯(lián)數(shù)組
PDO::FETCH_NUM:返回一個(gè)鍵為數(shù)字的數(shù)組,數(shù)組的鍵是數(shù)據(jù)庫列在查詢結(jié)果中的索引
PDO::FETCH_BOTH:返回一個(gè)既有鍵為列名又有鍵為數(shù)字的數(shù)組。
PDO::FETCH_OBJ:讓fetch()和fetchAll()返回一個(gè)對(duì)象,對(duì)象的屬性是數(shù)據(jù)庫的列名。
不推薦使用fetchAll(),除非你可以十分確定可用內(nèi)存放得下整個(gè)查詢結(jié)果。如果只關(guān)心查詢結(jié)果中的一列,可以使用fetchColumn()方法,這個(gè)方法的作用和fetch()方法類似,返回查詢結(jié)果中下一行的某一列,該方法只有一個(gè)參數(shù)用于制定所需要的索引。// 構(gòu)建并執(zhí)行SQL查詢 $sql = "SELECT id, name FROM users WHERE email = :email"; $statement = $pdo->prepare($sql); $email = filter_input(INPUT_GET, "email"); $statement->bindValue(":email", $email); $statement->execute(); while(($emal = $statament->fetchCoulmn(1)) !== false) { echo $email; }因?yàn)樵赟QL語句中,email出現(xiàn)在了第二個(gè)字段的位置,所以這里使用索引1取出來。我們還可以使用fetchObj()方法來獲取查詢結(jié)果中的行,這個(gè)方法把行行當(dāng)成對(duì)象,對(duì)象的屬性是查詢結(jié)果中的列。
// 構(gòu)建并執(zhí)行SQL查詢 $sql = "SELECT id, name FROM users WHERE email = :email"; $statement = $pdo->prepare($sql); $email = filter_input(INPUT_GET, "email"); $statement->bindValue(":email", $email); $statement->execute(); while(($result = $statament->fetchObj()) !== false) { echo $result->email; }事務(wù)
事務(wù)是指把一系列數(shù)據(jù)庫語句當(dāng)成單個(gè)的邏輯執(zhí)行單元執(zhí)行,也就是說事務(wù)中的一系列SQL查詢要么都成功,要么不執(zhí)行。事務(wù)的原子性能保證數(shù)據(jù)的一致性、安全性和持久性。事務(wù)還有一個(gè)很好的副作用就是提升性能,因?yàn)槭聞?wù)是把多個(gè)查詢排成隊(duì)列,一次性全部執(zhí)行。
專題系列PHP專題系列目錄地址:https://github.com/xx19941215/webBlog
PHP專題系列預(yù)計(jì)寫二十篇左右,主要總結(jié)我們?nèi)粘HP開發(fā)中容易忽略的基礎(chǔ)知識(shí)和現(xiàn)代PHP開發(fā)中關(guān)于規(guī)范、部署、優(yōu)化的一些實(shí)戰(zhàn)性建議,同時(shí)還有對(duì)Javascript語言特點(diǎn)的深入研究。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/23290.html
摘要:過濾驗(yàn)證和轉(zhuǎn)義不要相信任何來自不受自己直接控制的數(shù)據(jù)源中的數(shù)據(jù)。加密和哈希不是一回事,加密是雙向算法,加密的數(shù)據(jù)可以被解密。使用密碼哈希簡(jiǎn)化計(jì)算密碼哈希和驗(yàn)證密碼的操作。密碼的哈希值存儲(chǔ)在類型的數(shù)據(jù)庫列中。 過濾、驗(yàn)證和轉(zhuǎn)義 1).不要相信任何來自不受自己直接控制的數(shù)據(jù)源中的數(shù)據(jù)。包括但不限于: $_GET $_POST $_REQUEST $_COOKIE $argv php://...
摘要:多字節(jié)字符串假設(shè)字符串中的每一個(gè)字符都是八位字符,占用一個(gè)字節(jié)的內(nèi)存。如果使用原生的字符串函數(shù)處理這些多字節(jié)字符串,會(huì)得到意外的錯(cuò)誤。字符編碼一定要知道數(shù)據(jù)的字符編碼。擴(kuò)展不僅可以處理字符串,還可以在不同的字符編碼之間轉(zhuǎn)換多字節(jié)字符串。 多字節(jié)字符串 1).PHP假設(shè)字符串中的每一個(gè)字符都是八位字符,占用一個(gè)字節(jié)的內(nèi)存。但是,你有可能會(huì)遇到多字節(jié)字符串。2).這里所說的多字節(jié)字符串是指...
摘要:框架之間通過接口自動(dòng)加載和標(biāo)準(zhǔn)的編碼風(fēng)格進(jìn)行合作。該規(guī)范的精髓是把命名空間的前綴和系統(tǒng)中的目錄對(duì)應(yīng)起來。 PHP-FIG 1).即PHP Framework Interop Group。這個(gè)組織發(fā)布推薦的規(guī)范,而不是強(qiáng)制規(guī)范。2).PHP-FIG的使命是實(shí)現(xiàn)框架的互操作性。框架的互操作性指的是通過自動(dòng)加載機(jī)制、接口和標(biāo)準(zhǔn)的風(fēng)格,讓框架互相合作。3).框架之間通過接口、自動(dòng)加載和標(biāo)準(zhǔn)的編...
摘要:預(yù)測(cè)和捕獲并處理異常是我們自己的責(zé)任,因?yàn)槲床东@的異??赡軙?huì)導(dǎo)致應(yīng)用終止運(yùn)行,顯示錯(cuò)誤信息。處理并記錄異常你的代碼還原成之前的異常處理程序錯(cuò)誤我們可以使用函數(shù)或者在文件中使用指令告訴報(bào)告或者忽略那些錯(cuò)誤。 異常 1).異常是Exception類的對(duì)象,在遇到無法修復(fù)的狀況時(shí)拋出,例如遠(yuǎn)程API沒有響應(yīng)或者數(shù)據(jù)庫查詢失敗再或者是無法滿足程序運(yùn)行的前置條件。出現(xiàn)問題的時(shí)候異常用于主動(dòng)出擊,...
摘要:簡(jiǎn)單來說,就是我們創(chuàng)建一對(duì)密鑰,其中一個(gè)是私鑰保存在本地設(shè)備中,另一個(gè)是公鑰,傳到你的中,之所以叫做密鑰對(duì),是因?yàn)槭褂霉€加密的消息只能使用對(duì)應(yīng)的私鑰解密。 配置 1).如果你使用的不是Pass,那么先配置VPS或者專用的服務(wù)器才能運(yùn)行PHP應(yīng)用。本文假設(shè)你會(huì)使用vim或者nano編輯器。2).我們選擇nginx服務(wù)器來作為我們的web服務(wù)器。 首次登錄 ssh [email protected]...
閱讀 4392·2021-11-24 10:24
閱讀 1419·2021-11-22 15:22
閱讀 2048·2021-11-17 09:33
閱讀 2457·2021-09-22 15:29
閱讀 526·2019-08-30 15:55
閱讀 1666·2019-08-29 18:42
閱讀 2743·2019-08-29 12:55
閱讀 1784·2019-08-26 13:55