您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。