PHP原生提供了PDO擴展,意思是PHP數據對象。php
DSN是指數據源名稱,提供數據庫連接的詳細信息。通常包含如下信息:mysql
主機名或者IP地址git
端口號github
數據庫名web
字符集sql
以上信息構成的DSN能夠用於PDO類構造函數的第一個參數,第二個和第三個參數分別是數據庫的用戶名和密碼。若是數據庫須要認證,則須要提供這兩個 參數。數據庫
<?php try { $pdo = new PDO( 'mysql:host = 127.0.0.1;dbname=books;port=3306;charset=utf8', 'USERNAME', 'PASSWORD' ); } catch(PDOException $e) { echo "Database connection failed"; exit; }
把數據庫憑證保存在一個位於文檔根目錄以外的配置文件中,而後在須要的文件中導入這個文件。數組
在SQL中使用用戶的輸入時,必定要過濾。所以須要使用PDO擴展的預處理語句和參數綁定,這項操做很是簡單。預處理語句是PDO對象的實例,不過咱們不多直接去實例化這個類,而是經過PDO實例的prepare方法得到預處理語句的對象。這個方法得第一個參數是一個sql語句字符串,返回值是一個PDOStatement實例:安全
<?php $sql = 'SELECT id FROM users WHERE email = :email'; $statement = $pdo->prepare($sql);
在這個SQL語句中,email這個值能夠安全的綁定任何值。函數
<?php $sql = 'SELECT id FROM users WHERE email = :email'; $statement = $pdo->prepare($sql); $email = filter_input(INPUT_GET, 'email'); $statement->bindValue(':email', $email);
預處理語句會自動過濾$email的值。PDOStatement的第三個參數能夠制定綁定值的類型,不填的話默認就是字符串類型。可選的常量類型以下
PDO::PARAM_BOOL
PDO::PARAM_NULL
PDO::PARAM_INT
PDO::PARAM_STR(默認值)
若是執行的是select方法,返回的數據咱們須要使用fetch()、fetchAll()、fetchColumn()和fetchObject()方法獲取查詢結果。
//把預處理語句得到的結果當成關聯數組處理 $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(); //迭代結果 while(($result = $statement->fetch(PDO::FETCH_ASSOC)) !== false) { echo $result['email']; }
fetch、fetchAll方法的參數可選
PDO::FETCH_ASSOC:返回一個關聯數組
PDO::FETCH_NUM:返回一個鍵爲數字的數組,數組的鍵是數據庫列在查詢結果中的索引
PDO::FETCH_BOTH:返回一個既有鍵爲列名又有鍵爲數字的數組。
PDO::FETCH_OBJ:讓fetch()和fetchAll()返回一個對象,對象的屬性是數據庫的列名。
不推薦使用fetchAll(),除非你能夠十分肯定可用內存放得下整個查詢結果。若是隻關心查詢結果中的一列,可使用fetchColumn()方法,這個方法的做用和fetch()方法相似,返回查詢結果中下一行的某一列,該方法只有一個參數用於制定所須要的索引。
// 構建並執行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; }
由於在SQL語句中,email出如今了第二個字段的位置,因此這裏使用索引1取出來。咱們還可使用fetchObj()方法來獲取查詢結果中的行,這個方法把行行當成對象,對象的屬性是查詢結果中的列。
// 構建並執行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; }
事務是指把一系列數據庫語句當成單個的邏輯執行單元執行,也就是說事務中的一系列SQL查詢要麼都成功,要麼不執行。事務的原子性能保證數據的一致性、安全性和持久性。事務還有一個很好的反作用就是提高性能,由於事務是把多個查詢排成隊列,一次性所有執行。
PHP專題系列目錄地址:https://github.com/xx19941215/webBlogPHP專題系列預計寫二十篇左右,主要總結咱們平常PHP開發中容易忽略的基礎知識和現代PHP開發中關於規範、部署、優化的一些實戰性建議,同時還有對Javascript語言特色的深刻研究。