0

0

PHP如何连接到MySQL数据库_PHP连接MySQL数据库的步骤与代码示例

穿越時空

穿越時空

发布时间:2025-09-13 13:24:01

|

763人浏览过

|

来源于php中文网

原创

答案:PHP连接MySQL推荐使用mysqli或PDO扩展,需经建立连接、设置字符集、执行SQL、关闭连接等步骤,并优先采用预处理语句防止SQL注入。

php如何连接到mysql数据库_php连接mysql数据库的步骤与代码示例

PHP连接MySQL数据库的核心在于利用PHP内置的数据库扩展,最常用且推荐的是

mysqli
PDO
(PHP Data Objects)。这两种方式都提供了建立数据库连接、执行SQL查询、处理结果集以及安全关闭连接的完整功能。理解它们的运作机制,对于任何需要与MySQL交互的PHP应用来说,都是基石。

解决方案

PHP连接MySQL数据库通常涉及以下几个关键步骤,这里我们以

mysqli
扩展为例,因为它在很多场景下更直接、性能也相当不错,而且是面向过程和面向对象两种风格都支持的。

  1. 建立数据库连接: 这是第一步,你需要提供MySQL服务器的地址(通常是

    localhost
    或IP地址)、用户名、密码以及可选的数据库名称。

    <?php
    $servername = "localhost"; // MySQL服务器地址
    $username = "your_username"; // 数据库用户名
    $password = "your_password"; // 数据库密码
    $dbname = "your_database"; // 要连接的数据库名称
    
    // 创建连接
    $conn = new mysqli($servername, $username, $password, $dbname);
    
    // 检查连接是否成功
    if ($conn->connect_error) {
        die("连接失败: " . $conn->connect_error);
    }
    echo "数据库连接成功!";
    ?>
  2. 设置字符集(非常重要): 为了避免中文乱码等问题,在建立连接后立即设置字符集是一个好习惯。

    <?php
    // ... 前面的连接代码 ...
    
    if (!$conn->set_charset("utf8mb4")) { // 推荐使用utf8mb4支持更广泛的字符,包括Emoji
        printf("加载字符集 utf8mb4 失败: %s\n", $conn->error);
        exit();
    }
    echo "字符集设置成功!";
    ?>
  3. 执行SQL查询: 连接建立并字符集设置好后,你就可以执行各种SQL语句了,比如

    SELECT
    INSERT
    UPDATE
    DELETE
    等。

    • 查询数据 (SELECT):

      <?php
      // ... 前面的连接代码 ...
      
      $sql = "SELECT id, firstname, lastname FROM MyGuests";
      $result = $conn->query($sql);
      
      if ($result->num_rows > 0) {
          // 输出每行数据
          while($row = $result->fetch_assoc()) {
              echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
          }
      } else {
          echo "0 结果";
      }
      ?>
    • 插入数据 (INSERT):

      立即学习PHP免费学习笔记(深入)”;

      <?php
      // ... 前面的连接代码 ...
      
      $sql = "INSERT INTO MyGuests (firstname, lastname, email)
      VALUES ('John', 'Doe', 'john@example.com')";
      
      if ($conn->query($sql) === TRUE) {
          echo "新记录插入成功";
      } else {
          echo "Error: " . $sql . "<br>" . $conn->error;
      }
      ?>
  4. 关闭数据库连接: 当你完成所有数据库操作后,务必关闭连接以释放资源。

    <?php
    // ... 前面的连接代码和查询代码 ...
    
    $conn->close();
    echo "数据库连接已关闭。";
    ?>

以上就是使用

mysqli
扩展连接MySQL数据库的基本流程。我个人在开发中,对于简单快速的原型或者对性能有极致要求的场景,会倾向于
mysqli
的面向对象风格。

PHP连接MySQL时,我们应该选择mysqli还是PDO?

这个问题,坦白说,是很多PHP开发者初入数据库操作时都会纠结的。我的建议是,如果项目规模较大、需要支持多种数据库(不只是MySQL),或者对代码的抽象性和灵活性有较高要求,那么

PDO
无疑是更好的选择。它提供了一个统一的接口来访问不同类型的数据库,这意味着如果你未来需要从MySQL切换到PostgreSQL或SQLite,代码改动会相对较小。
PDO
在处理预处理语句(Prepared Statements)方面也表现得更为优雅和一致,这对于防止SQL注入至关重要。

然而,如果你只是专注于MySQL,并且偏好更直接、更“贴近金属”的API,那么

mysqli
是一个非常强大的选择。它提供了MySQL特有的高级功能,并且在性能上与
PDO
不相上下,甚至在某些特定场景下可能略有优势。
mysqli
既支持面向过程的风格(
mysqli_connect()
),也支持面向对象的风格(
new mysqli()
),这给了开发者更多的选择。我个人更倾向于
mysqli
的面向对象风格,因为它让代码看起来更整洁,更符合现代PHP的编程范式。

总的来说,没有绝对的“最好”,只有最适合你项目需求的。但无论如何,请务必远离那些已经废弃的

mysql_
函数,它们不仅不安全,而且早已从PHP的新版本中移除。

处理PHP连接MySQL时常见的错误与调试技巧

在PHP连接MySQL的过程中,遇到错误几乎是家常便饭,尤其是在开发初期。最常见的错误无外乎以下几种:

  1. 连接凭据错误: 用户名、密码、主机名或端口号不正确。
    • 调试技巧: 仔细检查你的
      $servername
      ,
      $username
      ,
      $password
      ,
      $dbname
      变量。确保它们与MySQL服务器的配置完全一致。如果你使用的是
      localhost
      ,有时尝试
      127.0.0.1
      会有奇效,反之亦然。检查MySQL用户是否允许从你的PHP应用所在的IP地址连接。
  2. 数据库不存在: 你尝试连接的数据库名称拼写错误或根本不存在。
    • 调试技巧: 登录到MySQL客户端(如phpMyAdmin、MySQL Workbench或命令行),确认数据库名称是否正确。
  3. MySQL服务未运行: MySQL服务器本身可能没有启动。
    • 调试技巧: 检查服务器状态。如果你在本地开发,确保你的WAMP/MAMP/XAMPP环境中的MySQL服务已启动。在Linux服务器上,可以使用
      systemctl status mysql
      service mysql status
      来查看。
  4. 权限问题: 你的PHP进程可能没有足够的权限访问MySQL套接字文件或网络端口。
    • 调试技巧: 检查文件权限,尤其是
      mysql.sock
      文件的权限。防火墙也可能阻挡了连接。

在PHP代码中,我们应该始终包含错误检查机制。对于

mysqli
$conn->connect_error
会捕获连接错误,而
$conn->error
则会捕获查询错误。

吐槽大师
吐槽大师

吐槽大师(Roast Master) - 终极 AI 吐槽生成器,适用于 Instagram,Facebook,Twitter,Threads 和 Linkedin

下载
<?php
$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    // 这里的die()会终止脚本执行,并在页面上显示错误信息
    die("数据库连接失败: " . $conn->connect_error);
}

// 假设这里有一个查询
$sql = "SELECT * FROM non_existent_table"; // 故意制造一个错误
$result = $conn->query($sql);

if (!$result) {
    // 这里的错误信息会告诉你查询出了什么问题
    echo "查询错误: " . $conn->error;
}
?>

对于

PDO
,错误处理通常通过设置错误模式和使用
try-catch
块来完成,这使得错误处理更加结构化和健壮。

<?php
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 设置PDO错误模式为异常,这样在出现错误时会抛出PDOException
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "数据库连接成功!";

    // 假设这里有一个查询
    $sql = "SELECT * FROM another_non_existent_table";
    $stmt = $conn->prepare($sql);
    $stmt->execute();

} catch(PDOException $e) {
    // 捕获并显示错误信息
    echo "数据库操作失败: " . $e->getMessage();
}
?>

我的经验是,在开发阶段,不要害怕让错误信息直接显示出来(当然,在生产环境中要避免)。详细的错误信息是解决问题的关键线索。

如何防止SQL注入攻击:PHP数据库操作的安全实践

SQL注入无疑是数据库安全领域最臭名昭著的漏洞之一,它能让恶意用户通过输入数据来篡改你的SQL查询,从而窃取、修改甚至删除你的数据。防止SQL注入,在我看来,是任何与数据库交互的应用程序开发者必须掌握的核心技能。

最有效且推荐的防御机制是使用预处理语句(Prepared Statements)参数绑定(Parameter Binding)。无论是

mysqli
还是
PDO
,都提供了对这一机制的良好支持。

它的基本原理是:你先向数据库发送一个带有占位符的SQL模板,数据库会预编译这个模板。然后,你再将实际的数据作为参数发送给数据库。数据库会严格区分SQL代码和数据,确保任何用户输入都被视为数据,而不是可执行的SQL代码。

  • 使用mysqli的预处理语句:

    <?php
    // ... 假设 $conn 已经建立并连接成功 ...
    
    $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
    
    // 检查预处理是否成功
    if (!$stmt) {
        die("预处理失败: " . $conn->error);
    }
    
    // 绑定参数
    // 'sss' 表示三个参数都是字符串类型 (s=string, i=integer, d=double, b=blob)
    $stmt->bind_param("sss", $firstname, $lastname, $email);
    
    // 设置参数值
    $firstname = "Alice";
    $lastname = "Smith";
    $email = "alice@example.com";
    $stmt->execute(); // 执行第一个插入
    
    $firstname = "Bob";
    $lastname = "Johnson";
    $email = "bob@example.com";
    $stmt->execute(); // 执行第二个插入
    
    echo "新记录插入成功";
    
    $stmt->close(); // 关闭预处理语句
    ?>
  • 使用PDO的预处理语句:

    <?php
    // ... 假设 $conn 已经建立并连接成功 (PDO 对象) ...
    
    $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (:firstname, :lastname, :email)");
    
    // 绑定命名参数或问号占位符
    $stmt->bindParam(':firstname', $firstname);
    $stmt->bindParam(':lastname', $lastname);
    $stmt->bindParam(':email', $email);
    
    // 设置参数值并执行
    $firstname = "Charlie";
    $lastname = "Brown";
    $email = "charlie@example.com";
    $stmt->execute();
    
    // 也可以直接在execute中传递数组
    $stmt->execute([
        ':firstname' => 'David',
        ':lastname' => 'Lee',
        ':email' => 'david@example.com'
    ]);
    
    echo "新记录插入成功";
    ?>

除了预处理语句,还有一些辅助性的安全措施:

  • 最小权限原则: 数据库用户只授予其完成任务所需的最小权限。例如,一个Web应用用户通常不需要
    DROP TABLE
    GRANT
    权限。
  • 输入验证: 在将用户输入用于任何操作之前,对其进行严格的验证。这包括数据类型、长度、格式等。虽然这不能完全替代预处理语句,但能过滤掉很多无效或恶意输入。
  • 错误信息隐藏: 在生产环境中,不要向用户显示详细的数据库错误信息。这些信息可能包含敏感数据或为攻击者提供攻击线索。记录错误到日志文件,而不是直接输出到页面。

在我看来,预处理语句是防止SQL注入的黄金标准,它的重要性再怎么强调都不为过。当你开始写任何涉及用户输入的数据库操作时,第一反应就应该是“我该如何用预处理语句来做这个?”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1134

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2194

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1703

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

586

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

440

2024.04.29

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号