0

0

PHP怎么连接MySQL_PHP与MySQL数据库连接方法

星夢妙者

星夢妙者

发布时间:2025-09-16 23:55:01

|

782人浏览过

|

来源于php中文网

原创

PHP连接MySQL主要使用mysqli或PDO扩展;推荐PDO因其支持多种数据库、预处理语句防SQL注入且错误处理更优雅,适合现代开发。

点击☞☞☞python速学教程(入门到精通)☜☜☜直接学习

点击☞☞☞PHP速学教程(入门到精通)☜☜☜直接学习

PHP怎么连接MySQL_PHP与MySQL数据库连接方法 - php中文网

PHP连接MySQL数据库的核心方法主要有两种:一是使用

mysqli

扩展,它专为MySQL数据库设计,提供了面向对象和面向过程两种API;二是使用

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

PDO

(PHP Data Objects)扩展,这是一个数据库抽象层,支持多种数据库,包括MySQL,并且在安全性方面(尤其是预处理语句)表现出色。在我看来,虽然

mysqli

功能强大,但现代开发中,

PDO

因其通用性和更优雅的错误处理机制,往往是更推荐的选择。

解决方案

要让PHP与MySQL数据库“牵手”,我们通常会通过以下两种方式:

1. 使用

mysqli

扩展 (MySQL Improved Extension)

mysqli

是PHP官方推荐的MySQL数据库连接方式,因为它支持MySQL的最新特性。你可以选择面向对象或面向过程的风格。

面向对象风格 (推荐)

<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接
if ($conn->connect_error) {
    // 生产环境不应直接暴露错误信息,应记录日志
    die("连接失败: " . $conn->connect_error);
}

// 设置字符集,非常重要,避免乱码
$conn->set_charset("utf8mb4");

// 执行查询示例
$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 结果";
}

// 关闭连接
$conn->close();
?>

面向过程风格

<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 检查连接
if (!$conn) {
    die("连接失败: " . mysqli_connect_error());
}

// 设置字符集
mysqli_set_charset($conn, "utf8mb4");

// 执行查询示例
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
    // 输出数据
    while($row = mysqli_fetch_assoc($result)) {
        echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
    }
} else {
    echo "0 结果";
}

// 关闭连接
mysqli_close($conn);
?>

2. 使用

PDO

扩展 (PHP Data Objects)

PDO

提供了一个轻量级、一致性的接口来访问数据库。它最大的优势是,只要更换驱动,你的代码几乎不需要改动就能连接到不同类型的数据库。

<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

try {
    // 创建PDO连接
    $conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8mb4", $username, $password);
    // 设置PDO错误模式为异常,这样可以更好地捕获和处理错误
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo "连接成功<br>";

    // 执行查询示例 (使用预处理语句,更安全)
    $stmt = $conn->prepare("SELECT id, firstname, lastname FROM MyGuests WHERE lastname = :lastname");
    $stmt->bindParam(':lastname', $lastname);

    $lastname = "Doe"; // 假设我们要查询姓Doe的用户
    $stmt->execute();

    // 设置结果集为关联数组
    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
    foreach($stmt->fetchAll() as $row) {
        echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
    }

} catch(PDOException $e) {
    // 生产环境不应直接暴露错误信息
    die("连接失败: " . $e->getMessage());
}

// 关闭连接(PDO在脚本结束时会自动关闭,或将$conn设为null)
$conn = null;
?>

PHP连接MySQL时,我应该选择mysqli还是PDO?它们有什么区别?

这个问题,嗯,是每个PHP开发者在刚接触数据库连接时都会纠结的。简单来说,

mysqli

是“MySQL专属”的,而

PDO

则是一个“多面手”。

mysqli

,顾名思义,就是“MySQL Improved”,它专门为MySQL数据库设计,提供了更全面的MySQL特性支持,比如存储过程、多语句查询等。它的性能在纯MySQL环境下可能略有优势,而且提供了面向对象和面向过程两种API,让不同习惯的开发者都能找到舒适区。我个人觉得,如果你确定你的项目只会使用MySQL,并且你习惯了面向过程的函数调用(比如从老旧的

mysql_*

函数迁移过来),那么

mysqli

的面向过程API可能会让你感觉更熟悉。

PDO

,全称PHP Data Objects,它是一个数据库抽象层。这意味着它不只支持MySQL,通过更换不同的驱动(如

pgsql

sqlite

等),你可以用一套统一的API去操作多种数据库。这对于那些未来可能需要更换数据库类型,或者需要同时连接多种数据库的项目来说,简直是福音。更重要的是,

PDO

在处理预处理语句(Prepared Statements)方面做得非常出色,这对于防止SQL注入攻击至关重要。它的错误处理机制也更现代化,通常通过抛出异常来处理,配合

try...catch

块,代码会显得更整洁、健壮。

在我看来,如果你正在开发一个全新的项目,或者希望代码更具未来可扩展性、安全性更高,那么

PDO

无疑是更优的选择。它的学习曲线可能比

mysqli

的面向过程API稍陡峭一点,但从长远来看,投入是值得的。我个人在过去的项目中,也逐渐从

mysqli

转向了

PDO

,主要是看中了它的通用性和安全性。

吐槽大师
吐槽大师

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

下载

连接MySQL数据库时,PHP如何处理常见的连接错误和异常?

数据库连接是应用与数据交互的第一步,也是最容易出问题的一步。网络波动、数据库服务器宕机、凭据错误等等都可能导致连接失败。有效地处理这些错误,是保证应用健壮性的关键。

对于

mysqli

扩展,连接错误通常通过检查

mysqli_connect_error()

mysqli_connect_errno()

来获取。比如,在

new mysqli()

mysqli_connect()

之后,紧接着判断连接对象是否为

false

或者错误号是否存在。如果连接失败,

mysqli_connect_error()

会返回一个描述性的错误字符串。我们通常会用

die()

语句直接终止脚本并显示错误,但在生产环境中,这绝对不是一个好做法。直接把数据库错误信息暴露给用户,不仅不友好,还可能泄露敏感信息,给攻击者提供线索。正确的姿势应该是将错误信息记录到日志文件,然后向用户显示一个友好的错误页面或提示。

// mysqli 错误处理示例
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    error_log("MySQL连接失败: " . $conn->connect_error, 0); // 记录到PHP错误日志
    die("抱歉,服务暂时不可用,请稍后再试。"); // 用户友好的提示
}

PDO

的错误处理机制则更加优雅和现代化,它主要依赖于PHP的异常处理机制。通过设置

PDO::ATTR_ERRMODE

PDO::ERRMODE_EXCEPTION

PDO

会在遇到错误时抛出

PDOException

异常。这样,你就可以使用

try...catch

块来捕获并处理这些异常。这种方式使得错误处理代码与业务逻辑分离,代码可读性更高,也更易于维护。

// PDO 错误处理示例
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8mb4", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // ... 后续操作
} catch(PDOException $e) {
    error_log("PDO连接或查询失败: " . $e->getMessage(), 0); // 记录日志
    die("抱歉,系统忙碌,请稍后再试。"); // 用户友好的提示
}

在我实际开发中,我总是倾向于使用

try...catch

来处理数据库操作,这让整个应用的错误处理逻辑变得非常清晰。当出现问题时,我可以快速定位到具体的代码块,而不是在冗长的函数调用中大海捞针。

在PHP连接MySQL时,如何防止SQL注入攻击,提升数据库安全性?

SQL注入,这个词听起来就让人头皮发麻。它是一种常见的网络安全漏洞,攻击者通过在输入框中注入恶意的SQL代码,从而绕过认证、窃取数据,甚至完全控制数据库。说实话,即使是经验丰富的开发者,也可能在不经意间留下这样的漏洞。

防止SQL注入的核心武器,就是预处理语句(Prepared Statements)。无论是

mysqli

还是

PDO

,都提供了对预处理语句的支持。它的工作原理是,你先定义好一个SQL查询的模板,其中用占位符(如

?

或命名参数

:param

)代替实际的数据。然后,你再把实际的数据“绑定”到这些占位符上,最后执行查询。数据库会先解析SQL模板,然后再处理绑定进来的数据,这样就避免了恶意数据被当作SQL指令执行的风险。

使用

mysqli

的预处理语句:

<?php
// ... 连接代码 ...

$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
// 'sss' 表示参数类型,s代表string,i代表integer,d代表double
$stmt->bind_param("sss", $firstname, $lastname, $email);

// 设置参数并执行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();

$stmt->close();
// ... 关闭连接 ...
?>

使用

PDO

的预处理语句:

<?php
// ... 连接代码 ...

$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 = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();

// ... 关闭连接 ...
?>

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

  • 输入验证和过滤: 永远不要相信用户的输入。在数据进入数据库之前,对其进行严格的验证和过滤,确保数据类型、格式和内容符合预期。例如,邮箱地址必须是有效的邮箱格式,数字必须是纯数字。
  • 最小权限原则: 数据库用户应该只拥有完成其任务所需的最小权限。比如,一个Web应用的用户可能只需要对某些表有
    SELECT
    ,
    INSERT
    ,
    UPDATE
    ,
    DELETE
    权限,而不需要
    DROP TABLE
    GRANT
    等管理权限。
  • 不要在代码中硬编码敏感信息: 数据库连接凭据、API密钥等敏感信息,不应该直接写在代码里。最佳实践是放在配置文件中(且配置文件不应被Web服务器直接访问),或者通过环境变量加载。

在我做项目的时候,我会把预处理语句视为数据库交互的“基本礼仪”。任何涉及用户输入的查询,都必须走预处理的流程。虽然这会增加一点点代码量,但换来的是实实在在的安全保障,这笔账怎么算都划算。

热门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

热门下载

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

精品课程

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

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 850人学习

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

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