# PHP數據庫怎么使用PDO獲取查詢結果
## 一、PDO簡介與優勢
### 1.1 什么是PDO
PDO(PHP Data Objects)是PHP中一個輕量級的、兼容性強的數據庫訪問抽象層,它提供了統一的接口來訪問不同類型的數據庫系統。自PHP 5.1版本起成為PHP核心組件。
### 1.2 PDO的核心優勢
- **數據庫無關性**:支持12+種數據庫驅動(MySQL、PostgreSQL、SQLite等)
- **預處理語句**:內置SQL注入防護機制
- **錯誤處理**:多種錯誤模式選擇
- **事務支持**:完善的ACID事務控制
- **性能優化**:持久連接支持
## 二、建立PDO數據庫連接
### 2.1 基本連接方法
```php
<?php
$host = 'localhost';
$dbname = 'test_db';
$user = 'root';
$pass = 'password';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
// 設置錯誤模式為異常模式
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "連接成功";
} catch(PDOException $e) {
die("連接失敗: " . $e->getMessage());
}
?>
$options = [
PDO::ATTR_PERSISTENT => true, // 持久連接
PDO::ATTR_EMULATE_PREPARES => false, // 禁用預處理模擬
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC // 默認獲取關聯數組
];
$pdo = new PDO($dsn, $user, $pass, $options);
$stmt = $pdo->query('SELECT * FROM users');
while ($row = $stmt->fetch()) {
print_r($row);
}
$stmt = $pdo->query('SELECT name, email FROM users');
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['name'] . ' - ' . $row['email'] . "\n";
}
$users = $pdo->query('SELECT * FROM users')->fetchAll(PDO::FETCH_OBJ);
foreach ($users as $user) {
echo $user->name . '<br>';
}
$count = $pdo->query('SELECT COUNT(*) FROM users')->fetchColumn();
echo "總用戶數: $count";
$stmt = $pdo->query('SELECT * FROM users LIMIT 1');
$user = $stmt->fetchObject('User'); // 可映射到自定義類
| 方法 | 內存消耗 | 適用場景 |
|---|---|---|
| fetch() | 低 | 大數據集逐行處理 |
| fetchAll() | 高 | 小數據集或需要全部數據 |
| fetchColumn() | 最低 | 只需要單個字段值 |
| fetchObject() | 中 | 需要對象形式的數據 |
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ? AND status = ?');
$stmt->execute([$id, $status]);
$user = $stmt->fetch();
$stmt = $pdo->prepare('INSERT INTO products (name, price) VALUES (:name, :price)');
$stmt->bindValue(':name', $productName);
$stmt->bindParam(':price', $price, PDO::PARAM_INT);
$stmt->execute();
$data = [
['iPhone', 6999],
['iPad', 3299],
['MacBook', 9999]
];
$stmt = $pdo->prepare('INSERT INTO products (name, price) VALUES (?, ?)');
foreach ($data as $row) {
$stmt->execute($row);
}
class User {
public $id;
public $name;
// 其他屬性...
}
$stmt = $pdo->query('SELECT * FROM users');
$users = $stmt->fetchAll(PDO::FETCH_CLASS, 'User');
// 按部門ID分組
$stmt = $pdo->query('SELECT * FROM employees');
$employees = $stmt->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);
// 用ID作為數組鍵名
$stmt = $pdo->query('SELECT id, name FROM users');
$users = $stmt->fetchAll(PDO::FETCH_UNIQUE | PDO::FETCH_ASSOC);
$stmt = $pdo->prepare('SELECT * FROM large_table');
$stmt->execute();
while ($chunk = $stmt->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT, 1000)) {
processChunk($chunk); // 處理每1000行數據
}
try {
$pdo->beginTransaction();
// 轉賬操作
$stmt1 = $pdo->prepare('UPDATE accounts SET balance = balance - ? WHERE id = ?');
$stmt2 = $pdo->prepare('UPDATE accounts SET balance = balance + ? WHERE id = ?');
$stmt1->execute([100, 1]);
$stmt2->execute([100, 2]);
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
echo "事務失敗: " . $e->getMessage();
}
$stmt = $pdo->prepare('INSERT INTO log (message) VALUES (?)');
for ($i = 0; $i < 1000; $i++) {
$stmt->execute(["Log entry $i"]);
}
$page = 2;
$perPage = 10;
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare('SELECT * FROM articles ORDER BY id DESC LIMIT :limit OFFSET :offset');
$stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
; php.ini 配置
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock
pdo_mysql.cache_size=2000
try {
$stmt = $pdo->prepare('SELECT * FROM non_existent_table');
$stmt->execute();
} catch (PDOException $e) {
error_log("數據庫錯誤: " . $e->getMessage());
// 開發環境顯示詳細信息
if (ENV === 'development') {
echo "SQL錯誤: ", $e->getMessage(), "\n";
echo "錯誤代碼: ", $e->getCode(), "\n";
echo "錯誤SQL: ", $stmt->queryString, "\n";
}
}
$stmt = $pdo->prepare('SELECT * FROM users WHERE created_at > ?');
$stmt->execute([$date]);
$debug = $stmt->debugDumpParams();
file_put_contents('sql_debug.log', $debug);
class UserRepository {
private $pdo;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
public function getPaginatedUsers(int $page = 1, int $perPage = 10): array {
$offset = ($page - 1) * $perPage;
$stmt = $this->pdo->prepare(
'SELECT * FROM users ORDER BY id DESC LIMIT :limit OFFSET :offset'
);
$stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
return [
'data' => $stmt->fetchAll(PDO::FETCH_ASSOC),
'total' => $this->getTotalUsers()
];
}
private function getTotalUsers(): int {
return $this->pdo->query('SELECT COUNT(*) FROM users')->fetchColumn();
}
}
通過PDO提供的豐富功能,開發者可以構建安全、高效且易于維護的數據庫交互層。隨著PHP版本的更新,PDO也在持續改進,建議始終使用最新穩定版的PHP以獲得最佳性能和安全性。 “`
這篇文章涵蓋了從基礎連接到高級用法的完整PDO查詢結果獲取知識,包含: - 約4000字詳細講解 - 10個核心章節 - 20+個實用代碼示例 - 多種數據獲取方式對比 - 性能優化和錯誤處理建議 - 完整項目示例
可根據需要調整代碼示例或補充特定數據庫的專有語法說明。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。