如何在PHP中使用PDO、mysqli擴(kuò)展?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

PDO
基本操作如下:
<?php
// PDO + MySQL
$servername = "localhost";
$username = "username";
$password = "password";
try{
$pdo = new PDO('mysql:host=$servername;dbname=myDB', '$username',
'$password');
echo '連接成功';
}
catch(PDOExcepton $e){
echo $e->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']);
//關(guān)閉連接
$pdo=null;PDO 并不會(huì)對(duì) SQL 請(qǐng)求進(jìn)行轉(zhuǎn)換或者模擬實(shí)現(xiàn)并不存在的功能特性;它只是單純地使用相同的 API 連接不同種類的數(shù)據(jù)庫(kù)。
更重要的是,PDO 使你能夠安全的插入外部輸入(例如 ID)到你的 SQL 請(qǐng)求中而不必?fù)?dān)心 SQL 注入的問題。這可以通過使用 PDO 語句和限定參數(shù)來實(shí)現(xiàn)。
我們來假設(shè)一個(gè) PHP 腳本接收一個(gè)數(shù)字 ID 作為一個(gè)請(qǐng)求參數(shù)。這個(gè) ID 應(yīng)該被用來從數(shù)據(jù)庫(kù)中取出一條用戶記錄。下面是一個(gè)錯(cuò)誤的做法:
<?php
$pdo = new PDO('sqlite:/path/db/users.db');
$pdo->query("SELECT name FROM users WHERE id = " . $_GET['id']); // <-- NO!這是一段糟糕的代碼。你正在插入一個(gè)原始的請(qǐng)求參數(shù)到 SQL 請(qǐng)求中。這將讓被黑客輕松地利用[SQL 注入]方式進(jìn)行攻擊。想一下如果黑客將一個(gè)構(gòu)造的 id 參數(shù)通過像 /tupian/20230522/id=1%3BDELETE+FROM+users 這樣的 URL 傳入。這將會(huì)使 $_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); // <-- 首先過濾您的數(shù)據(jù) ,對(duì)于INSERT,UPDATE等特別重要
$stmt->bindParam(':id', $id, PDO::PARAM_INT); // <-- 通過PDO自動(dòng)對(duì)SQL進(jìn)行清理
$stmt->execute();這是正確的代碼。它在一條 PDO 語句中使用了一個(gè)限制參數(shù)。這將對(duì)外部 ID 輸入在發(fā)送給數(shù)據(jù)庫(kù)之前進(jìn)行轉(zhuǎn)義來防止?jié)撛诘?SQL 注入攻擊。
對(duì)于寫入操作,例如 INSERT 或者 UPDATE,進(jìn)行數(shù)據(jù)過濾并對(duì)其他內(nèi)容進(jìn)行清理(去除 HTML 標(biāo)簽,Javascript 等等)是尤其重要的。PDO 只會(huì)為 SQL 進(jìn)行清理,并不會(huì)為你的應(yīng)用做任何處理。
mysqli擴(kuò)展
mysqli基本操作如下:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 創(chuàng)建連接
$conn = new mysqli($servername, $username, $password);
// 檢測(cè)連接
if ($conn->connect_error) {
die("連接失敗: " . $conn->connect_error);
}
echo "連接成功";
?>注意在以上面向?qū)ο蟮膶?shí)例中 $connect_error 是在 PHP 5.2.9 和 5.3.0 中添加的。如果你需要兼容更早版本 請(qǐng)使用以下代碼替換:
// 檢測(cè)連接
if (mysqli_connect_error()) {
die("數(shù)據(jù)庫(kù)連接失敗: " . mysqli_connect_error());
}數(shù)據(jù)庫(kù)交互
<ul>
<?php
foreach ($db->query('SELECT * FROM table') as $row) {
echo "<li>".$row['field1']." - ".$row['field1']."</li>";
}
?>
</ul>這從很多方面來看都是錯(cuò)誤的做法,主要是由于它不易閱讀又難以測(cè)試和調(diào)試。而且如果你不加以限制的話,它會(huì)輸出非常多的字段。
其實(shí)還有許多不同的解決方案來完成這項(xiàng)工作 — 取決于你傾向于 面向?qū)ο缶幊蹋∣OP)還是函數(shù)式編程 — 但必須有一些分離的元素。
來看一下最基本的做法:
<?php
function getAllFoos($db) {
return $db->query('SELECT * FROM table');
}
foreach (getAllFoos($db) as $row) {
echo "<li>".$row['field1']." - ".$row['field1']."</li>";
}這是一個(gè)不錯(cuò)的開頭。將這兩個(gè)元素放入了兩個(gè)不同的文件于是你得到了一些干凈的分離。
創(chuàng)建一個(gè)類來放置上面的函數(shù),你就得到了一個(gè)「Model」。創(chuàng)建一個(gè)簡(jiǎn)單的.php文件來存放表示邏輯,你就得到了一個(gè)「View」。這已經(jīng)很接近 MVC — 一個(gè)大多數(shù)框架常用的面向?qū)ο蟮募軜?gòu)。
//foo.php
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
// 使模板可見
include 'models/FooModel.php';
// 實(shí)例化類
$fooModel = new FooModel($db);
// Get the list of Foos
$fooList = $fooModel->getAllFoos();
// 顯示視圖
include 'views/foo-list.php';//models/FooModel.php
<?php
class FooModel
{
protected $db;
public function __construct(PDO $db)
{
$this->db = $db;
}
public function getAllFoos() {
return $this->db->query('SELECT * FROM table');
}
}//views/foo-list.php
<?php foreach ($fooList as $row): ?> <?= $row['field1'] ?> - <?= $row['field1'] ?> <?php endforeach ?>
許多框架都提供了自己的數(shù)據(jù)庫(kù)抽象層,其中一些是設(shè)計(jì)在 PDO 的上層的。這些抽象層通常將你的請(qǐng)求在 PHP 方法中包裝起來,通過模擬的方式來使你的數(shù)據(jù)庫(kù)擁有一些之前不支持的功能。這種抽象是真正的數(shù)據(jù)庫(kù)抽象,而不單單只是 PDO 提供的數(shù)據(jù)庫(kù)連接抽象。這類抽象的確會(huì)增加一定程度的性能開銷,但如果你正在設(shè)計(jì)的應(yīng)用程序需要同時(shí)使用 MySQL,PostgreSQL 和 SQLite 時(shí),一點(diǎn)點(diǎn)的額外性能開銷對(duì)于代碼整潔度的提高來說還是很值得的。
看完上述內(nèi)容,你們掌握如何在PHP中使用PDO、mysqli擴(kuò)展的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
標(biāo)題名稱:如何在PHP中使用PDO、mysqli擴(kuò)展-創(chuàng)新互聯(lián)
標(biāo)題來源:http://chinadenli.net/article24/hohce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、軟件開發(fā)、全網(wǎng)營(yíng)銷推廣、微信小程序、做網(wǎng)站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容