PHP与MySQL交互最佳实践
PHP和MySQL是经典搭配。PDO是现代PHP操作数据库的标准方式。今天说说PHP与MySQL交互的各种实践。
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,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci",
];
try {
$pdo = new PDO($dsn, $username, $password, $options);
echo "连接成功\n";
} catch (PDOException $e) {
die("连接失败: " . $e->getMessage());
}
?>
CRUD操作。
```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]);
?>
事务处理。
```php
function transferMoney(PDO $pdo, int $fromId, int $toId, float $amount): void
{
try {
$pdo->beginTransaction();
$pdo->prepare("UPDATE accounts SET balance = balance - ? WHERE id = ?")->execute([$amount, $fromId]);
$stmt = $pdo->prepare("SELECT balance FROM accounts WHERE id = ?");
$stmt->execute([$fromId]);
if ($stmt->fetchColumn() < 0) throw new Exception("余额不足");
$pdo->prepare("UPDATE accounts SET balance = balance + ? WHERE id = ?")->execute([$amount, $toId]);
$pdo->prepare("INSERT INTO transfer_log (from_id, to_id, amount) VALUES (?, ?, ?)")->execute([$fromId, $toId, $amount]);
$pdo->commit();
echo "转账成功\n";
} catch (Exception $e) {
$pdo->rollBack();
echo "转账失败: {$e->getMessage()}\n";
}
}
?>
游标分页。
```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];
}
?>
连接管理在生产环境要注意。每次请求都创建新连接开销大。PHP-FPM模式下用持久连接要小心,连接状态可能被上一个请求污染。一般来说用PDO默认配置就行,不需要额外优化。
PHP操作MySQL用PDO就对了。预处理防止注入,事务保证一致性,索引提升性能。这些做好了,数据库层面基本没啥大问题。
PHP与MySQL交互最佳实践
张小明
前端开发工程师
Android电视盒子技术演进与选购实战指南
1. 从移动端到客厅:Android机顶盒的野望与困境十多年前,当Android手机以摧枯拉朽之势席卷全球,从高端旗舰到千元入门机无处不在时,一个同样基于Android,但场景截然不同的产品——Android机顶盒,也开始在产业…
工业机器人模拟焊接工作站的构建
1 绪论1.1 研究背景与意义机器人焊接广泛应用于汽车、工程机械行业,离线仿真可在无实体设备条件下完成程序调试、轨迹优化,降低现场调试成本。结合课程项目化教学任务,采用 RobotStudio 搭建虚拟焊接工作站,掌握工作站搭建、离线轨…
从固话到5G承载网:PCM30/32(E1)这条‘老路’今天还在哪里跑?
从固话到5G承载网:PCM30/32(E1)这条‘老路’今天还在哪里跑?走进任何一座运营商的传统传输机房,你依然能看到一排排标着"E1"字样的接口板卡安静地闪烁着指示灯。这种诞生于上世纪60年代的数字传输标准&#…
高效智能CSDN博客下载器:三步打造你的专属离线知识库
高效智能CSDN博客下载器:三步打造你的专属离线知识库 【免费下载链接】CSDNBlogDownloader 项目地址: https://gitcode.com/gh_mirrors/cs/CSDNBlogDownloader 在信息爆炸的时代,CSDN博客下载器为你提供一站式解决方案,让你轻松将CSD…
GLM、Kimi、Gemini、Claude 训练新模型新版本 是重新训练 还是说在原来的模型权重基础上,再训练
行业前沿报告:GLM、Kimi、Gemini、Claude 模型迭代训练策略深度解析 ——重新训练 vs. 增量训练的路线博弈与工程实践 一、 核心概念界定与底层逻辑 在大型语言模型(LLM)的演进中,版本迭代不仅是算法能力的体现,更是算…
告别迷茫!ISE 14.7 完整设计流程保姆级指南:从VHDL代码到FPGA烧录
ISE 14.7实战:从零构建FPGA数码管计数器全流程解析第一次打开ISE 14.7时,那个布满未知图标的界面确实让人望而生畏。作为Xilinx经典的FPGA开发环境,它承载了无数工程师的"第一次烧录"记忆。本文将用最接地气的方式,带你…