PHP MySQL 简介
PHP 与 MySQL 是 Web 开发中常用的组合,用于构建动态网站和应用程序。PHP 作为一种服务器端脚本语言,擅长处理逻辑和动态内容生成,而 MySQL 是一种开源的关系型数据库管理系统,用于存储和检索数据。以下是对 PHP 和 MySQL 交互的中文简介,涵盖基本概念、连接方式、常见操作和注意事项。
1. 什么是 PHP 和 MySQL?
- PHP:一种广泛使用的服务器端脚本语言,适合处理表单、生成动态页面和与数据库交互。
- MySQL:一个高效、开源的关系型数据库,存储数据以表的形式,支持 SQL 查询。
- PHP + MySQL:PHP 通过内置扩展(如
mysqli
或PDO
)与 MySQL 数据库交互,实现数据的增删改查(CRUD)。
2. 连接 MySQL 的方式
PHP 提供了三种主要方式与 MySQL 交互:
mysqli
扩展(MySQL Improved):支持面向过程和面向对象编程,提供更高的安全性和性能。PDO
扩展(PHP Data Objects):一个数据库抽象层,支持多种数据库(如 MySQL、PostgreSQL),适合跨数据库项目。- 已废弃的
mysql_
函数:PHP 7 完全移除mysql_
函数,因其不安全,切勿使用。
2.1 使用 mysqli
连接 MySQL
<?php
$host = 'localhost';
$user = 'root';
$password = 'password';
$database = 'mydb';
// 创建连接
$mysqli = new mysqli($host, $user, $password, $database);
// 检查连接
if ($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
}
echo "连接成功";
?>
2.2 使用 PDO
连接 MySQL
<?php
$host = 'localhost';
$dbname = 'mydb';
$user = 'root';
$password = 'password';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "连接成功";
} catch (PDOException $e) {
die("连接失败: " . $e->getMessage());
}
?>
3. 常见数据库操作
以下是使用 mysqli
和 PDO
实现的基本 CRUD 操作示例。
3.1 查询数据(SELECT)
- mysqli:
<?php
$result = $mysqli->query("SELECT id, name FROM users");
while ($row = $result->fetch_assoc()) {
echo "ID: {$row['id']}, Name: {$row['name']}<br>";
}
$result->free();
?>
- PDO:
<?php
$stmt = $pdo->query("SELECT id, name FROM users");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "ID: {$row['id']}, Name: {$row['name']}<br>";
}
?>
3.2 插入数据(INSERT)
- mysqli(预处理语句):
<?php
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
$name = "张三";
$email = "zhangsan@example.com";
$stmt->execute();
$stmt->close();
?>
- PDO(预处理语句):
<?php
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute(['name' => '张三', 'email' => 'zhangsan@example.com']);
?>
3.3 更新数据(UPDATE)
- mysqli:
<?php
$stmt = $mysqli->prepare("UPDATE users SET name = ? WHERE id = ?");
$stmt->bind_param("si", $name, $id);
$name = "李四";
$id = 1;
$stmt->execute();
$stmt->close();
?>
- PDO:
<?php
$stmt = $pdo->prepare("UPDATE users SET name = :name WHERE id = :id");
$stmt->execute(['name' => '李四', 'id' => 1]);
?>
3.4 删除数据(DELETE)
- mysqli:
<?php
$stmt = $mysqli->prepare("DELETE FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$id = 1;
$stmt->execute();
$stmt->close();
?>
- PDO:
<?php
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->execute(['id' => 1]);
?>
4. 安全性和最佳实践
- 使用预处理语句:
- 防止 SQL 注入攻击,避免直接拼接用户输入到 SQL 查询中。
- 预处理语句(如
mysqli::prepare
或PDO::prepare
)会自动转义输入。
- 错误处理:
- 使用
try-catch
(PDO)或检查$mysqli->error
来捕获和处理数据库错误。
try {
$pdo->query("INVALID SQL");
} catch (PDOException $e) {
echo "错误: " . $e->getMessage();
}
- 连接管理:
- 在操作完成后关闭连接(
mysqli::close()
或设置$pdo = null
)。 - 使用持久连接(
mysqli::persistent
或 PDO 的ATTR_PERSISTENT
)时需谨慎,避免连接泄漏。
- 字符编码:
- 确保 PHP 和 MySQL 使用相同的字符集(如 UTF-8),避免中文乱码。
$mysqli->set_charset("utf8mb4");
// 或 PDO
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $password);
5. 实际应用场景
- 动态网站:
- 构建用户注册、登录系统,存储用户信息到 MySQL。
- 显示动态内容,如文章列表或产品目录。
- API 开发:
- 从 MySQL 获取数据,编码为 JSON 响应给前端。
header('Content-Type: application/json');
$stmt = $pdo->query("SELECT * FROM users");
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($data, JSON_UNESCAPED_UNICODE);
- 数据管理:
- 实现后台管理界面,支持数据的增删改查。
- 性能优化:
- 使用索引和优化 SQL 查询,提升大型数据集的查询效率。
6. 注意事项
- 避免使用
mysql_
函数:
- PHP 7 已移除
mysql_
函数,必须使用mysqli
或PDO
。
- 选择
mysqli
或PDO
:
mysqli
:适合专注于 MySQL 的项目,简单直接。PDO
:适合需要跨数据库支持或更现代化开发的场景。
- 安全性:
- 始终使用预处理语句处理用户输入。
- 限制数据库用户的权限,仅授予必要操作(如
SELECT
、INSERT
)。
- 性能:
- 对大数据量操作,使用批量插入或事务(
BEGIN
、COMMIT
)提高效率。
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO users (name) VALUES (:name)");
foreach (['张三', '李四'] as $name) {
$stmt->execute(['name' => $name]);
}
$pdo->commit();
7. 总结
PHP 与 MySQL 的结合为 Web 开发提供了强大的数据处理能力。通过 mysqli
或 PDO
,开发者可以安全、高效地执行数据库操作。使用预处理语句、错误处理和字符集配置等最佳实践,能显著提升应用的安全性和可靠性。PHP 和 MySQL 适用于从简单博客到复杂电商系统的各种场景,是 Web 开发的经典组合。
如果需要更具体的代码示例、某操作的详细讲解,或有其他问题,请告诉我!