news 2026/6/7 6:18:00

PHP数据库核心技术PDO详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP数据库核心技术PDO详解

PHP数据库核心技术PDO详解

PDO是PHP数据库操作的标准方式。它提供了一个统一的接口来操作不同类型的数据库,预处理语句天然防止SQL注入。今天说说PDO的各种用法和技巧。

连接数据库是第一步。推荐设置错误模式为异常,获取模式为关联数组。

```php
$host = 'localhost';
$dbname = 'test';
$username = 'root';
$password = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";

$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];

try {
$pdo = new PDO($dsn, $username, $password, $options);
echo "连接成功\n";
} catch (PDOException $e) {
die("连接失败: " . $e->getMessage());
}
?>
```

增删改查是数据库基本操作。预处理语句用参数绑定,不能拼接SQL。

```php
$stmt = $pdo->prepare("INSERT INTO users (name, email, age) VALUES (?, ?, ?)");
$stmt->execute(['张三', 'zhangsan@test.com', 28]);
$userId = $pdo->lastInsertId();

$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([1]);
$user = $stmt->fetch();

$stmt = $pdo->prepare("SELECT * FROM users WHERE status = ?");
$stmt->execute(['active']);
$users = $stmt->fetchAll();

$stmt = $pdo->prepare("UPDATE users SET name = ? WHERE id = ?");
$stmt->execute(['李四', 1]);

$stmt = $pdo->prepare("DELETE FROM users WHERE id = ?");
$stmt->execute([1]);

echo "用户数: " . count($users) . "\n";
?>
```

事务处理确保多个操作要么全部成功,要么全部失败。

```php
function transfer(PDO $pdo, int $fromId, int $toId, float $amount): void
{
try {
$pdo->beginTransaction();

$stmt = $pdo->prepare("UPDATE accounts SET balance = balance - ? WHERE id = ?");
$stmt->execute([$amount, $fromId]);

$stmt = $pdo->prepare("SELECT balance FROM accounts WHERE id = ?");
$stmt->execute([$fromId]);
$balance = $stmt->fetchColumn();
if ($balance < 0) {
throw new Exception("余额不足");
}

$stmt = $pdo->prepare("UPDATE accounts SET balance = balance + ? WHERE id = ?");
$stmt->execute([$amount, $toId]);

$pdo->commit();
echo "转账成功\n";
} catch (Exception $e) {
$pdo->rollBack();
echo "转账失败: " . $e->getMessage() . "\n";
}
}
?>
```

游标分页比OFFSET分页性能好,数据量大时效果明显。

```php
function paginate(PDO $pdo, ?int $cursor, int $perPage = 20): array
{
if ($cursor === null) {
$stmt = $pdo->prepare("SELECT * FROM articles ORDER BY id DESC LIMIT ?");
$stmt->execute([$perPage]);
} else {
$stmt = $pdo->prepare("SELECT * FROM articles WHERE id < ? ORDER BY id DESC LIMIT ?");
$stmt->execute([$cursor, $perPage]);
}

$items = $stmt->fetchAll();
$nextCursor = !empty($items) ? end($items)['id'] : null;

return ['items' => $items, 'next_cursor' => $nextCursor];
}
?>
```

PDO还有一些容易被忽略的功能。rowCount获取影响行数,quote做安全转义,errorInfo获取错误详情。PDO::lastInsertId获取自增ID。这些功能在实际项目中很常用。

使用PDO的基本规则:预处理加参数绑定防止SQL注入,事务保证数据一致性,合适的获取模式提高效率。这些做到了,数据库操作这块基本不会出问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 6:10:05

手算PCA:从协方差矩阵到主成分的几何本质

1. 为什么我坚持手推一遍PCA&#xff0c;而不是直接调sklearn&#xff1f;你有没有过这种体验&#xff1a;在Jupyter里敲下from sklearn.decomposition import PCA&#xff0c;跑通了&#xff0c;结果可视化一看——主成分散点图像一锅乱炖的芝麻糊&#xff0c;完全看不出分离趋…

作者头像 李华
网站建设 2026/6/7 6:00:11

Senior数据科学家能力校准:业务穿透力、交付闭环与组织协同四维模型

1. 这不是简历投递指南&#xff0c;而是一份 Senior Data Scientist 的能力校准清单“如何拿下高级数据科学家职位”——这个标题背后藏着太多被过度简化的认知陷阱。我带过17个从初级到高级的数据科学团队&#xff0c;也亲手筛过近3000份申请高级岗的简历&#xff0c;最常看到…

作者头像 李华
网站建设 2026/6/7 5:57:44

Pandas数据思维重建:从Excel直觉到向量化工程实践

1. 为什么从零开始学 Pandas&#xff0c;不是“学个语法”而是重建数据思维我带过不下二十期数据分析实操训练营&#xff0c;每次开班第一课&#xff0c;总有人举手问&#xff1a;“老师&#xff0c;Pandas是不是就学几个.read_csv()、.groupby()和.plot()就能干活了&#xff1…

作者头像 李华
网站建设 2026/6/7 5:57:42

MATLAB一键运行的FDTD仿真PML边界吸收效果对比演示

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;直接运行main.m就能看到PML边界在FDTD电磁仿真中如何压制边界反射——两组并排图像&#xff08;1.png和2.png&#xff09;清晰呈现开启PML前后的场分布差异&#xff0c;直观验证吸收性能。核心逻辑封装在pml.m里…

作者头像 李华