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

星夢妙者
发布: 2025-09-16 23:55:01
原创
763人浏览过
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
登录后复制

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

阿里云-虚拟数字人
阿里云-虚拟数字人

阿里云-虚拟数字人是什么? ...

阿里云-虚拟数字人 2
查看详情 阿里云-虚拟数字人

连接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服务器直接访问),或者通过环境变量加载。

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

以上就是PHP怎么连接MySQL_PHP与MySQL数据库连接方法的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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