亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Figuren

PDO 是一個數(shù)據(jù)庫連接抽象類庫 — 自 5.1.0 版本起內(nèi)置于 PHP 當(dāng)中 — 它提供了一個通用的接口來與不同的數(shù)據(jù)庫進(jìn)行交互。比如你可以使用相同的簡單代碼來連接 MySQL 或是 SQLite:

<?php 
// PDO + MySQL 
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password'); 
$statement = $pdo->query("SELECT some_field FROM some_table"); 
$row = $statement->fetch(PDO::FETCH_ASSOC); 
echo htmlentities($row['some_field']); 
// PDO + SQLite 
$pdo = new PDO('sqlite:/path/db/foo.sqlite'); 
$statement = $pdo->query("SELECT some_field FROM some_table"); 
$row = $statement->fetch(PDO::FETCH_ASSOC); 
echo htmlentities($row['some_field']);

PDO 并不會對 SQL 請求進(jìn)行轉(zhuǎn)換或者模擬實現(xiàn)并不存在的功能特性;它只是單純地使用相同的 API 連接不同種類的數(shù)據(jù)庫。

更重要的是,PDO 使你能夠安全的插入外部輸入(例如 ID)到你的 SQL 請求中而不必?fù)?dān)心 SQL 注入的問題。這可以通過使用 PDO 語句和限定參數(shù)來實現(xiàn)。

我們來假設(shè)一個 PHP 腳本接收一個數(shù)字 ID 作為一個請求參數(shù)。這個 ID 應(yīng)該被用來從數(shù)據(jù)庫中取出一條用戶記錄。下面是一個錯誤的做法:

<?php 
$pdo = new PDO('sqlite:/path/db/users.db'); 
$pdo->query("SELECT name FROM users WHERE id = " . $_GET['id']); 
// <-- NO!

這是一段糟糕的代碼。你正在插入一個原始的請求參數(shù)到 SQL 請求中。這將讓被黑客輕松地利用[SQL 注入]方式進(jìn)行攻擊。想一下如果黑客將一個構(gòu)造的 id參數(shù)通過像 http://domain.com/?id=1%3BDELETE+FROM+users 這樣的 URL 傳入。這將會使 $_GET['id'] 變量的值被設(shè)為 1;DELETE FROM users 然后被執(zhí)行從而刪除所有的 user 記錄!因此,你應(yīng)該使用 PDO 限制參數(shù)來過濾 ID 輸入。

<?php 
$pdo = new PDO('sqlite:/path/db/users.db'); 
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id'); 
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); 
// <-- filter your data first (see [Data Filtering](#data_filtering)), especially important for INSERT, UPDATE, etc. 
$stmt->bindParam(':id', $id, PDO::PARAM_INT); 
// <-- Automatically sanitized for SQL by PDO $stmt->execute();

這是正確的代碼。它在一條 PDO 語句中使用了一個限制參數(shù)。這將對外部 ID 輸入在發(fā)送給數(shù)據(jù)庫之前進(jìn)行轉(zhuǎn)義來防止?jié)撛诘?SQL 注入攻擊。

對于寫入操作,例如 INSERT 或者 UPDATE,進(jìn)行數(shù)據(jù)過濾并對其他內(nèi)容進(jìn)行清理(去除 HTML 標(biāo)簽,Javascript 等等)是尤其重要的。PDO 只會為 SQL 進(jìn)行清理,并不會為你的應(yīng)用做任何處理。

你也應(yīng)該知道數(shù)據(jù)庫連接有時會耗盡全部資源,如果連接沒有被隱式地關(guān)閉的話,有可能會造成可用資源枯竭的情況。不過這通常在其他語言中更為常見一些。使用 PDO 你可以通過銷毀(destroy)對象,也就是將值設(shè)為 NULL,來隱式地關(guān)閉這些連接,確保所有剩余的引用對象的連接都被刪除。如果你沒有親自做這件事情,PHP 會在你的腳本結(jié)束的時候自動為你完成 —— 除非你使用的是持久鏈接。


Vorheriger Artikel: N?chster Artikel: