PHP连接MySQL数据库方法与完整操作教程
在现代Web开发中,PHP与MySQL的组合依然是构建动态网站的最流行方案之一。无论是用户注册登录、内容发布还是数据统计分析,都离不开PHP与数据库的交互。本文将详细介绍PHP连接MySQL数据库的方法,并提供一套完整的MySQL数据库操作教程,帮助开发者掌握安全高效的数据库编程技巧。
一、为什么选择PHP与MySQL
PHP作为一种服务端脚本语言,天生就对数据库操作提供了良好的支持。MySQL则是最流行的开源关系型数据库管理系统。两者结合,不仅成本低廉,而且性能卓越、社区活跃。通过PHP执行SQL语句,我们可以轻松实现数据的增删改查(CRUD)操作。
二、PHP连接MySQL的两种主流方式
在PHP中,连接MySQL数据库主要有两种推荐的扩展方式:MySQLi和PDO。早期的mysql_*函数由于存在安全隐患和性能问题,已在PHP 7.0中被彻底移除,因此不再建议使用。
MySQLi:仅支持MySQL数据库,提供了面向对象和面向过程两种API,性能略优,支持预处理语句。
PDO:支持多种数据库(如MySQL、PostgreSQL、SQLite等),使用统一的API操作不同的数据库,移植性强,强烈推荐在多数据库项目中使用。
三、使用MySQLi连接MySQL数据库
MySQLi提供了两种编程风格:面向对象和面向过程。推荐使用面向对象的方式,因为其结构更清晰,更符合现代编程思想。
1. 面向对象方式
下面是使用MySQLi面向对象方式连接数据库的代码示例:
<?php
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "test_db";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
?>2. 面向过程方式
如果你习惯于传统的函数调用,可以使用面向过程的方式:
<?php
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "test_db";
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检测连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
echo "连接成功";
?>四、使用PDO连接MySQL数据库
PDO(PHP Data Objects)提供了一个数据访问抽象层,这意味着无论使用哪种数据库,都可以用相同的函数来执行查询和获取数据。使用PDO连接MySQL需要构造一个DSN(数据源名称)字符串。
<?php
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "test_db";
try {
$dsn = "mysql:host=$servername;dbname=$dbname;charset=utf8mb4";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $username, $password, $options);
echo "连接成功";
} catch (PDOException $e) {
die("连接失败: " . $e->getMessage());
}
?>五、MySQL数据库基本操作(CRUD)
连接数据库后,最核心的工作就是执行SQL语句进行增删改查。下面以PDO为例,演示完整的CRUD操作。首先,我们需要一个数据表,假设我们要操作一个用户表。
1. 创建数据表
使用PHP执行CREATE TABLE语句来创建数据表:
CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, profile_url VARCHAR(255), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
2. 插入数据(Create)
向数据表中插入新记录,推荐使用预处理语句以防SQL注入。在此示例中,我们将用户的个人主页设置为一个外部链接地址:
<?php $sql = "INSERT INTO users (username, email, profile_url) VALUES (:username, :email, :profile_url)"; $stmt = $pdo->prepare($sql); $stmt->execute([ ':username' => 'zhangsan', ':email' => 'zhangsan@example.com', ':profile_url' => 'https://www.ipipp.com' ]); echo "新记录插入成功,ID: " . $pdo->lastInsertId(); ?>
3. 查询数据(Read)
从数据库中获取数据并遍历输出:
<?php
$sql = "SELECT id, username, email, profile_url FROM users";
$stmt = $pdo->query($sql);
while ($row = $stmt->fetch()) {
echo "ID: " . $row['id'] . " - 用户名: " . $row['username'] . " - 邮箱: " . $row['email'] . "<br>";
}
?>4. 更新数据(Update)
修改数据库中已有的记录:
<?php $sql = "UPDATE users SET email = :email WHERE username = :username"; $stmt = $pdo->prepare($sql); $stmt->execute([ ':email' => 'new_email@example.com', ':username' => 'zhangsan' ]); echo "更新了 " . $stmt->rowCount() . " 条记录"; ?>
5. 删除数据(Delete)
删除指定的数据记录:
<?php $sql = "DELETE FROM users WHERE id = :id"; $stmt = $pdo->prepare($sql); $stmt->execute([':id' => 1]); echo "删除了 " . $stmt->rowCount() . " 条记录"; ?>
六、预防SQL注入与XSS攻击
SQL注入是Web应用中最常见的安全漏洞之一。当用户输入被直接拼接到SQL语句中时,攻击者可以通过构造恶意的输入来执行非法的SQL命令。使用预处理语句是防止SQL注入的最有效方法。在前面的CRUD示例中,我们已经全面使用了PDO的预处理语句。
此外,当从数据库中取出数据并输出到网页时,如果数据中包含HTML标签,例如<script>,必须使用htmlspecialchars()函数进行转义,以防止跨站脚本攻击(XSS)。
七、关闭数据库连接
在完成数据库操作后,显式关闭连接是一个良好的编程习惯,这可以及时释放服务器资源。
对于MySQLi面向对象方式,可以调用$conn->close();。对于PDO,只需将连接对象赋值为null即可。
<?php // MySQLi关闭连接 // $conn->close(); // PDO关闭连接 $pdo = null; ?>
八、总结与最佳实践
掌握PHP连接与操作MySQL数据库是后端开发的基础技能。在实际开发中,请务必遵循以下最佳实践:
首选PDO:除非项目确定只使用MySQL且需要极致性能,否则推荐使用PDO,以便于未来可能的数据库迁移。
始终使用预处理语句:绝不将用户输入直接拼接进SQL语句,始终使用参数绑定来防止SQL注入。
设置正确的字符集:连接数据库时指定
charset=utf8mb4,以支持完整的Unicode字符,包括Emoji表情。异常处理:开启PDO的异常模式(
PDO::ERRMODE_EXCEPTION),这有助于在开发阶段快速定位问题,而在生产环境应妥善记录错误日志而非直接输出给用户。