PDO PDO的使用 原創

2022-04-29 10:48:07 字數 3861 閱讀 2641

具體參考《php核心技術與最佳實踐》的5.1章 什麼是pdo

php針對每種資料庫都有乙個獨立的模組、一組獨立的函式。這樣的結構和設計讓php相容多種資料庫變得困難。一旦要將乙個應用移到另外一種資料庫環境中,或者是需要新增新的資料庫支援,就不得不重新編寫和資料庫相關的操作。通常編寫多個類,用介面卡模式來實現。在這個歷史背景下pdo出現了。pdo(php data objects)提供了乙個通用介面訪問多種資料庫,即抽象的資料模型支援連線多種資料庫。有了pdo使**變得更簡潔、更安全。

在php中,連線mysql資料庫的通常有3種方式:

具體的可以參考:【連線資料庫】php7的連線資料庫的三種方法【原創】

相比mysqli,pdo的優勢在於支援多種資料庫,而mysqli只能支援mysql,所以一般更推薦使用pdo來對資料庫進行操作。

pdo提供了乙個資料訪問抽象層,這就意味著不管使用哪種資料庫,都可以用同樣一組api對資料進行操作,保證了可抽象性和訪問介面的一致性。

開啟pdo很容易,一般來說安裝好php預設都會開啟pdo,如果沒有則去php.ini中找到以下語句,把前面的分號去掉即可

;extension=php_pdo.dll
使用pdo的第一步是配置資料來源,之後的用法和mysql擴充套件運算元據庫的方法沒有什麼區別了,

pdo的操作主要有pdo::query()、pdo::exec()、pdo::prepare()

以下是pdo的示例:

<?php

/** * pdo 的使用例項

*/try catch (pdoexception $e)

注意:使用pdo從mysql資料庫查詢出來的資料都是string型別的,在某些特殊應用下,可能需要轉換格式

pdo最大的特點就是引入引數繫結和預編譯。

下面是從資料庫中查詢某條記錄:

<?php

$pdo = new pdo('mysql: host=localhost; dbname=php_book');

$pdo->query("select name from users where id = " . $_get['id']);

這是一段糟糕的**。插入乙個原始的請求引數到 sql 請求中。這將讓被黑客輕鬆地利用[sql 注入]方式進行攻擊。想一下如果黑客將乙個構造的 id 引數通過像 這樣的 url 傳入。這將會使 $_get[『id』] 變數的值被設為 1;delete from users 然後被執行從而刪除所有的 user 記錄!因此,你應該使用 pdo 限制引數來過濾 id 輸入。

上面的**可優化為:

<?php

$pdo

=new pdo('mysql: host=localhost;dbname=php_book');

$stmt

=$pdo

->prepare('select name from users where id = :id');

$id= filter_input(input_get, 'id', filter_sanitize_number_int);

$stmt

->bindparam(':id', $id, pdo::param_int);

$stmt

->execute();

在mysql應用中,為了防止注入攻擊,通常在php中使用intval、addslashes等函式對傳入的引數進行轉義,轉變為sql中合法的引數型別,這種方法較複雜,而使用pdo的bindparam方法會變得很快捷,只需要在函式中指定第三個引數,即可對傳入的引數進行轉換,轉換為需要的型別拼接到原生的sql語句中

比如:

<?php

/** * pdo 的最大特點是引入引數繫結和預編譯

* 引數繫結:通過繫結變數來執行準備好的語句

* 兩種繫結引數的方式

*/$calories

=150;

$colour

='red';

// 配置pdo的資料來源

$dsn

='mysql: host=localhost; dbname=php_book';

// 構造方法

$db=

new pdo($dsn, 'root', '123456');

// 執行預處理語句(第一種繫結變數的方式)

$sth

=$db

->prepare('select name, colour, calories from fruit where calories > :calories and colour = :colour');

// 繫結變數,將變數轉化為int型別

$sth

->bindparam(':calories', $calories, pdo::param_int);

// 繫結變數,將變數轉化為string型別

$sth

->bindparam(':colour', $colour, pdo::param_str, 12);

// 執行

$sth

->execute();

var_dump($sth

->fetchall(pdo::fetch_assoc));

// 執行預處理語句(第二種繫結變數的方式)

$sth

=$db

->prepare('select name, colour, calories from fruit where calories > ? and colour = ?');

// 繫結變數,將變數轉化為int型別

$sth

->bindparam(1, $calories, pdo::param_int);

// 繫結變數,將變數轉化為string型別

$sth

->bindparam(2, $colour, pdo::param_str, 12);

// 執行

$sth

->execute();

var_dump($sth

->fetchall(pdo::fetch_assoc));

預編譯負責兩件事,轉義和軟解析提速。程式要支援預編譯,除了要資料庫支援外,還需要驅動支援(pdo和mysqli均支援)

乙個事務中所有的工作在提交時,即使是分階段執行,也要保證安全的應用於資料庫,不被其他的連線干擾,事務工作可以在請求發生錯誤時自動取消。

事務的主要特性:原子性、一致性、獨立性、永續性(atomicity,consistency,isolation,durability,acid)。典型運用就是通過把批量的改變儲存,然後立即執行,這樣就能提高效率,一旦事務不成功,將會回滾到初始狀態,保證資料的一致性。

pdo中使用begintransaction()方法來建立事務。在乙個事務中,使用commit()或者是rollback()方法來結束事務,具體應用哪種方法這取決於事務中**執行是否成功。指令碼結束或者乙個連線要關閉時,如果還有乙個未處理完的事務,pdo自動將其回滾。這對於指令碼意外終止情況來說是乙個安全方案,如果沒有明確提交事務,它將假設發生一些錯誤,為資料的安全執行回滾。

自動回滾僅發生於通過begintransaction()建立的事務。如果用手動方式執行乙個開始事務的查詢,pdo無法知道他的情況故無法回滾。

**如下:

<?php

try

// 提交事務

$conn->commit();

} catch(pdoexception $ex)

注意:因為使用了事務,要麼成功要麼失敗,如果發現第一條執行了,但是第二條沒有執行或者是失敗了,則應該檢查一下表型別是否為myisam,myisam引擎是不支援事務的,需要改用innodb或者其他的支援事務的引擎。

原創 類的交叉使用。

交叉引用物件 a.h a.cpp b.hb.cpp a中有b的指標,b中有a的指標 a.h中有b的指標,在a.h中加入b.h a中即以在任意地方使用a或a中的函式 b.h若在加入a.h編譯器將會報錯。辦法。在b.h中使用a的前置定義如 class a 在b中將可以使用a的指標,但是不能使用a的函式,...

csvread函式的使用(原創)

csvread函式與stringfromfile函式類似,都是從外部讀取引數,不同的是csv可以從乙個檔案中讀取多個引數。下面具體講一下如何使用csvread函式 1.首先是外部檔案的格式,要求是csv格式,每個引數間用逗號相隔。每行表示每一組引數,每列表示每種引數 2.csvread與string...

Xmanager使用總結 原創

xmanager連線aix伺服器 xmanager連線aix伺服器可以分為兩種情況 1 連線ibm伺服器,使用遠端桌面功能進行系統維護。要求這台伺服器已經安裝了圖形桌面,如cde等,並啟動到圖形介面。在xmanager中的xbrowser中,輸入相應伺服器的位址,即可。這種情況能夠成功的前提是,伺服...