登入
首頁 所有文章 PHP PHP - PDO資料庫存取
長也   2018-06-22 23:17:44(1年前)    2232點閱   0喜歡  0收藏
PHP - PDO資料庫存取  

PDO

PDO擴充(PHP data objects)是一PHP類別,可以使用單一介面與不同的SQL系統溝通,抽象化資料庫實作。無論使用哪一種資料庫系統,都只要使用單一的類別即可。

但是資料庫查詢語句仍須根據資料庫系統而有所更改。

建立PDO連線

PDO的建構式有三個參數,包含:DSN資訊、資料庫使用者、資料庫密碼

DSN資訊

DSN資訊包含了主機名稱或IP、連接埠、資料庫名稱、字元編碼

下列範例建立了一個連接mysql,名稱為DB的資料庫,mysql預設的埠為3306,連線的字元編碼為utf8。

try{
    $pdo=new PDO(
      'mysql:host=localhost;dbname=DB;port=3306;charset=utf8',
      'Username',
      'Password'
    );
}catch (PDOException $e){
    exit("DB CAN'T CONNECT!");
}

DSN參數以mysql開頭,告訴PDO連線的資料庫系統;":"之後以分號區隔內容,分別指定host、dbname、port和charset設定。

資料庫的使用者驗證資訊

一般不會將資料庫的使用者資訊直接寫在index之類的PHP文件當中,而是篩寫在一個獨立的PHP檔案,並在需要的時候include或require進來,這樣可以確保程式發生錯誤而導致源碼洩漏時,資料庫使用者資訊不會被洩漏。

使用預備陳述式

PHP—消毒與驗證使用者輸入一文中我們提及驗證與消毒使用者資料的重要性與實作方法,在PDO中提供prepare()方法來自動消毒。

$sql='SELECT name FROM user WHERE id=:id';
$statement = $pdo->prepare($sql);

$userId=filter_input(INPUT_POST,'id');
$statement->bindValue(':id',$userId,PDO::PARAM_INT);
$statement->execute();

":id"是佔位符號,可以安全的綁定要使用的值;SQL陳述式可以使用多個佔位符號,並以bindValue()方法帶入。

上面的範例使用了bindValue的第三個參數,告訴PDO傳入的資料型別為整數,可以使用的資料型別常數如下:

PDO::PARAM_BOOL、PDO::PARAM_NULL、PDO::PARAM_INT、PDO::PARAM_STR

取得回傳結果的資料

如果只是使用INSERT、UPDATE、DELETE等只要使用到execute()就可以了,如果SELECT查詢結果則需要取得回傳的資料。

fetch()

fetch()可以回傳下一列的資料,當記憶體不夠的時候可以使用迴圈來個別取得每一列的資料

while(($result=$statement->fetch(PDO::FETCH_ASSOC))!=false){
    echo $result["name"];
}

fetch和fetchAll中的參數告訴PDO回傳陣列的方法;PDO::FETCH_ASSOC:回傳關聯式陣列、PDO::FETCH_NUM:回傳數值陣列、PDO::FETCH_BOTH:回傳關連與數值KEY、PDO::FETCH_OBJ:回傳物件,屬性為欄位名稱。

fetchAll()

fetchAll可以擷取回傳的所有資料,但是必須確認記憶體足夠所有的資料存入。

$results=$statement->fetchAll(PDO::FETCH_ASSOC);

foreach($results as $result){
    echo $result["name"];
}

fetchColumn()

fetchCouumn可以回傳單一欄的單一列。

while(($result=$statement->fetchColumn(1))!=false){
    echo $result;
}

其中引數是欄位,1代表取得第二個欄位的結果(由0開始)。

fetchObject()

以物件方式取得回傳資料,其屬性是資料庫的欄位名稱。

while(($result=$statement->fetchObject())!=false){
    echo $result->name;
}

本文作者:長也

糾結與想不開的資管系學生,之前常碰PHP,現在常碰到的是Python,閒暇之餘就記錄一些筆記。

             

如要發表回覆,請先 登入

  0則回覆