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注入,事务保证数据一致性,合适的获取模式提高效率。这些做到了,数据库操作这块基本不会出问题。
PHP数据库核心技术PDO详解
张小明
前端开发工程师
Windows平台MQTT消息调试工具:C#开发,支持订阅/发布、QoS设置与历史消息查看
本文还有配套的精品资源,点击获取 简介:一款开箱即用的Windows桌面MQTT调试工具,用C#编写,无需安装运行环境即可直接编译运行。支持自定义Broker地址、端口、客户端ID、用户名密码等连接参数,可灵活配置QoS 0/1/2等…
手算PCA:从协方差矩阵到主成分的几何本质
1. 为什么我坚持手推一遍PCA,而不是直接调sklearn?你有没有过这种体验:在Jupyter里敲下from sklearn.decomposition import PCA,跑通了,结果可视化一看——主成分散点图像一锅乱炖的芝麻糊,完全看不出分离趋…
CANoe自动化配置避坑指南:用Python脚本搞定CommunicationSetup接口(附完整代码)
CANoe自动化配置避坑指南:用Python脚本搞定CommunicationSetup接口(附完整代码)在汽车电子测试领域,CANoe作为主流的测试工具,其手动配置过程往往耗时且容易出错。特别是当项目规模扩大,需要频繁修改通信设…
Senior数据科学家能力校准:业务穿透力、交付闭环与组织协同四维模型
1. 这不是简历投递指南,而是一份 Senior Data Scientist 的能力校准清单“如何拿下高级数据科学家职位”——这个标题背后藏着太多被过度简化的认知陷阱。我带过17个从初级到高级的数据科学团队,也亲手筛过近3000份申请高级岗的简历,最常看到…
Pandas数据思维重建:从Excel直觉到向量化工程实践
1. 为什么从零开始学 Pandas,不是“学个语法”而是重建数据思维我带过不下二十期数据分析实操训练营,每次开班第一课,总有人举手问:“老师,Pandas是不是就学几个.read_csv()、.groupby()和.plot()就能干活了࿱…
MATLAB一键运行的FDTD仿真PML边界吸收效果对比演示
本文还有配套的精品资源,点击获取 简介:直接运行main.m就能看到PML边界在FDTD电磁仿真中如何压制边界反射——两组并排图像(1.png和2.png)清晰呈现开启PML前后的场分布差异,直观验证吸收性能。核心逻辑封装在pml.m里…