PHP连接MySQL教程

PHP连接MySQL教程
PHP连接MySQL从基础到实践的完整指南在Web开发领域PHP和MySQL的组合堪称经典搭档。无论是构建简单的博客系统还是复杂的企业级应用掌握PHP连接MySQL的技术都是每位PHP开发者的必备技能。本文将详细介绍PHP连接MySQL的多种方法、最佳实践以及常见问题的解决方案。一、PHP连接MySQL的基础知识1.1 环境准备在开始之前确保你已经具备以下环境- PHP 5.6或更高版本建议使用PHP 7- MySQL数据库服务器- Web服务器如Apache或Nginx1.2 PHP连接MySQL的三种主要方式PHP提供了多种连接MySQL数据库的方法每种方法都有其特点和适用场景1. MySQL扩展已弃用PHP早期版本使用的扩展PHP 5.5.0起已废弃2. MySQLi扩展推荐改进的MySQL扩展支持面向对象和面向过程两种编程风格3. PDO扩展推荐PHP数据对象支持多种数据库的统一接口二、使用MySQLi扩展连接MySQL2.1 面向对象方式php$servername localhost;$username root;$password your_password;$dbname my_database;// 创建连接$conn new mysqli($servername, $username, $password, $dbname);// 检查连接if ($conn-connect_error) {die(连接失败: . $conn-connect_error);}echo 连接成功;// 执行查询$sql SELECT id, name, email FROM users;$result $conn-query($sql);if ($result-num_rows 0) {// 输出数据while($row $result-fetch_assoc()) {echo id: . $row[id]. - 姓名: . $row[name]. - 邮箱: . $row[email]. ;}} else {echo 0 结果;}// 关闭连接$conn-close();?2.2 面向过程方式php$servername localhost;$username root;$password your_password;$dbname my_database;// 创建连接$conn mysqli_connect($servername, $username, $password, $dbname);// 检查连接if (!$conn) {die(连接失败: . mysqli_connect_error());}echo 连接成功;// 执行查询$sql SELECT id, name, email FROM users;$result mysqli_query($conn, $sql);if (mysqli_num_rows($result) 0) {while($row mysqli_fetch_assoc($result)) {echo id: . $row[id]. - 姓名: . $row[name]. - 邮箱: . $row[email]. ;}} else {echo 0 结果;}// 关闭连接mysqli_close($conn);?三、使用PDO连接MySQLPDOPHP Data Objects提供了一个数据访问抽象层可以统一访问多种数据库php$servername localhost;$username root;$password your_password;$dbname my_database;try {// 创建PDO连接$conn new PDO(mysql:host$servername;dbname$dbname;charsetutf8, $username, $password);// 设置PDO错误模式为异常$conn-setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);echo 连接成功;// 准备SQL语句$stmt $conn-prepare(SELECT id, name, email FROM users WHERE id :id);$stmt-bindParam(:id, $id, PDO::PARAM_INT);// 执行查询$id 1;$stmt-execute();// 设置结果集为关联数组$result $stmt-setFetchMode(PDO::FETCH_ASSOC);// 获取结果foreach($stmt-fetchAll() as $row) {echo id: . $row[id]. - 姓名: . $row[name]. - 邮箱: . $row[email]. ;}} catch(PDOException $e) {echo 连接失败: . $e-getMessage();}// 关闭连接PDO会自动关闭$conn null;?四、安全最佳实践4.1 使用预处理语句防止SQL注入SQL注入是最常见的Web安全漏洞之一使用预处理语句可以有效防止php// MySQLi预处理示例$stmt $conn-prepare(INSERT INTO users (name, email, password) VALUES (?, ?, ?));$stmt-bind_param(sss, $name, $email, $hashed_password);$name 张三;$email zhangsanexample.com;$hashed_password password_hash(mypassword, PASSWORD_DEFAULT);$stmt-execute();// PDO预处理示例$stmt $conn-prepare(INSERT INTO users (name, email, password) VALUES (:name, :email, :password));$stmt-bindParam(:name, $name);$stmt-bindParam(:email, $email);$stmt-bindParam(:password, $hashed_password);$name 李四;$email lisiexample.com;$hashed_password password_hash(anotherpassword, PASSWORD_DEFAULT);$stmt-execute();4.2 密码安全存储永远不要将密码明文存储在数据库中php// 创建密码哈希$hashed_password password_hash($password, PASSWORD_DEFAULT);// 验证密码if (password_verify($input_password, $hashed_password_from_db)) {// 密码正确}4.3 错误处理在生产环境中不要直接向用户显示数据库错误信息php// 开发环境显示详细错误ini_set(display_errors, 1);error_reporting(E_ALL);// 生产环境记录错误但不显示ini_set(display_errors, -1);error_reporting(E_ALL);ini_set(log_errors, 1);ini_set(error_log, /path/to/php-error.log);// 自定义错误处理try {// 数据库操作} catch(Exception $e) {// 记录错误日志error_log(数据库错误: . $e-getMessage());// 向用户显示友好信息echo 系统暂时不可用请稍后再试;}五、性能优化技巧5.1 使用持久连接对于高流量网站持久连接可以减少连接开销php// MySQLi持久连接$conn new mysqli(p: . $servername, $username, $password, $dbname);// PDO持久连接$options [PDO::ATTR_PERSISTENT true];$conn new PDO(mysql:host$servername;dbname$dbname, $username, $password, $options);5.2 连接池管理对于大型应用考虑使用连接池管理数据库连接phpclass DatabaseConnectionPool {private static $connections [];private static $maxConnections 10;public static function getConnection() {// 实现连接池逻辑}public static function releaseConnection($conn) {// 释放连接回池}}5.3 查询优化php// 只选择需要的列$sql SELECT id, name FROM users; // 好$sql SELECT FROM users; // 不好// 使用LIMIT限制结果集$sql SELECT FROM users LIMIT 10;// 添加合适的索引// 在MySQL中为常用查询字段添加索引六、常见问题与解决方案6.1 连接超时问题php// 设置连接超时$conn new mysqli($servername, $username, $password, $dbname, 3306, null, MYSQLI_CLIENT_COMPRESS);// 或使用ini设置ini_set(mysql.connect_timeout, 300);ini_set(default_socket_timeout, 300);6.2 字符集问题确保数据库连接使用正确的字符集php// MySQLi设置字符集$conn-set_charset(utf8mb4);// PDO设置字符集$conn new PDO(mysql:host$servername;dbname$dbname;charsetutf8mb4, $username, $password);6.3 连接失败排查步骤1. 检查数据库服务器是否运行2. 验证用户名和密码是否正确3. 确认数据库名称是否存在4. 检查防火墙设置是否阻止连接5. 验证PHP是否安装了正确的MySQL扩展七、现代化实践使用框架的数据库组件在现代PHP开发中使用框架可以大大简化数据库操作php// Laravel示例$users DB::table(users)-where(active, 1)-get();// Symfony示例$users $entityManager-getRepository(User::class)-findAll();// 原生PHP中使用查询构建器class QueryBuilder {// 实现简单的查询构建逻辑}结语PHP连接MySQL是Web开发的基础技能但随着PHP和MySQL的发展最佳实践也在不断演进。从早期的mysql_函数到现在的MySQLi和PDO安全性、性能和可维护性都得到了显著提升。无论你是初学者还是有经验的开发者掌握这些连接技术并遵循安全最佳实践都将为你构建稳健的Web应用奠定坚实基础。记住良好的数据库连接管理不仅仅是技术实现更包括错误处理、安全防护和性能优化。在实际项目中建议根据具体需求选择合适的连接方式并始终保持代码的可读性和可维护性。