如何在PHP中使用PDO、mysqli擴展?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
創(chuàng)新互聯(lián)公司主營巴林左旗網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,重慶App定制開發(fā),巴林左旗h5成都小程序開發(fā)搭建,巴林左旗網(wǎng)站營銷推廣歡迎巴林左旗等地區(qū)企業(yè)咨詢PDO
基本操作如下:
getMessge(); } $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=null;
PDO 并不會對 SQL 請求進行轉(zhuǎn)換或者模擬實現(xiàn)并不存在的功能特性;它只是單純地使用相同的 API 連接不同種類的數(shù)據(jù)庫。
更重要的是,PDO 使你能夠安全的插入外部輸入(例如 ID)到你的 SQL 請求中而不必擔心 SQL 注入的問題。這可以通過使用 PDO 語句和限定參數(shù)來實現(xiàn)。
我們來假設一個 PHP 腳本接收一個數(shù)字 ID 作為一個請求參數(shù)。這個 ID 應該被用來從數(shù)據(jù)庫中取出一條用戶記錄。下面是一個錯誤的做法:
query("SELECT name FROM users WHERE id = " . $_GET['id']); // <-- NO!
這是一段糟糕的代碼。你正在插入一個原始的請求參數(shù)到 SQL 請求中。這將讓被黑客輕松地利用[SQL 注入]方式進行攻擊。想一下如果黑客將一個構造的 id 參數(shù)通過像 /tupian/20230522/id=1%3BDELETE+FROM+users 這樣的 URL 傳入。這將會使 $_GET[‘id'] 變量的值被設為 1;DELETE FROM users 然后被執(zhí)行從而刪除所有的 user 記錄!因此,你應該使用 PDO 限制參數(shù)來過濾 ID 輸入。
prepare('SELECT name FROM users WHERE id = :id'); $id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); // <-- 首先過濾您的數(shù)據(jù) ,對于INSERT,UPDATE等特別重要 $stmt->bindParam(':id', $id, PDO::PARAM_INT); // <-- 通過PDO自動對SQL進行清理 $stmt->execute();
這是正確的代碼。它在一條 PDO 語句中使用了一個限制參數(shù)。這將對外部 ID 輸入在發(fā)送給數(shù)據(jù)庫之前進行轉(zhuǎn)義來防止?jié)撛诘?SQL 注入攻擊。
對于寫入操作,例如 INSERT 或者 UPDATE,進行數(shù)據(jù)過濾并對其他內(nèi)容進行清理(去除 HTML 標簽,Javascript 等等)是尤其重要的。PDO 只會為 SQL 進行清理,并不會為你的應用做任何處理。
mysqli擴展
mysqli基本操作如下:
connect_error) { die("連接失敗: " . $conn->connect_error); } echo "連接成功"; ?>
注意在以上面向?qū)ο蟮膶嵗?$connect_error 是在 PHP 5.2.9 和 5.3.0 中添加的。如果你需要兼容更早版本 請使用以下代碼替換:
// 檢測連接 if (mysqli_connect_error()) { die("數(shù)據(jù)庫連接失敗: " . mysqli_connect_error()); }
數(shù)據(jù)庫交互
這從很多方面來看都是錯誤的做法,主要是由于它不易閱讀又難以測試和調(diào)試。而且如果你不加以限制的話,它會輸出非常多的字段。
其實還有許多不同的解決方案來完成這項工作 — 取決于你傾向于 面向?qū)ο缶幊蹋∣OP)還是函數(shù)式編程 — 但必須有一些分離的元素。
來看一下最基本的做法:
query('SELECT * FROM table'); } foreach (getAllFoos($db) as $row) { echo "
這是一個不錯的開頭。將這兩個元素放入了兩個不同的文件于是你得到了一些干凈的分離。
創(chuàng)建一個類來放置上面的函數(shù),你就得到了一個「Model」。創(chuàng)建一個簡單的.php文件來存放表示邏輯,你就得到了一個「View」。這已經(jīng)很接近 MVC — 一個大多數(shù)框架常用的面向?qū)ο蟮募軜嫛?/p>
//foo.php
getAllFoos(); // 顯示視圖 include 'views/foo-list.php';
//models/FooModel.php
db = $db; } public function getAllFoos() { return $this->db->query('SELECT * FROM table'); } }
//views/foo-list.php
= $row['field1'] ?> - = $row['field1'] ?>
許多框架都提供了自己的數(shù)據(jù)庫抽象層,其中一些是設計在 PDO 的上層的。這些抽象層通常將你的請求在 PHP 方法中包裝起來,通過模擬的方式來使你的數(shù)據(jù)庫擁有一些之前不支持的功能。這種抽象是真正的數(shù)據(jù)庫抽象,而不單單只是 PDO 提供的數(shù)據(jù)庫連接抽象。這類抽象的確會增加一定程度的性能開銷,但如果你正在設計的應用程序需要同時使用 MySQL,PostgreSQL 和 SQLite 時,一點點的額外性能開銷對于代碼整潔度的提高來說還是很值得的。
看完上述內(nèi)容,你們掌握如何在PHP中使用PDO、mysqli擴展的方法了嗎?如果還想學到更多技能或想了解更多相關內(nèi)容,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!