PHP最佳實踐之數據庫

PDO擴展

PHP原生提供了PDO擴展,意思是PHP數據對象。php

數據庫連接和DSN

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語言特色的深刻研究。

相關文章
相關標籤/搜索