PHP如何连接MySQL数据库 PHP数据库操作的基础教程

蓮花仙者
发布: 2025-08-02 11:47:01
原创
659人浏览过

php连接mysql数据库应根据项目需求选择mysqli或pdo,1. 若项目仅使用mysql且追求简单直接,可选mysqli,它提供面向对象和过程式接口,对mysql特性支持全面;2. 若项目需跨数据库兼容或注重未来扩展性,推荐使用pdo,因其提供统一api,支持多种数据库,预处理语句更优雅,利于防止sql注入;3. 连接失败时应检查数据库凭证、服务状态、端口、防火墙、用户权限,并结合错误信息、日志和网络连通性排查;4. 数据库操作需遵循crud原则,始终使用预处理语句、输入验证、输出转义、最小权限原则和密码哈希,确保数据安全。

PHP如何连接MySQL数据库 PHP数据库操作的基础教程

PHP连接MySQL数据库主要依赖于PHP内置的

MySQLi
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
PDO
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
(PHP Data Objects)扩展。简单来说,它们是PHP与MySQL服务器“对话”的桥梁。
MySQLi
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
(MySQL Improved Extension)更专注于MySQL数据库,提供了面向对象和过程式的两种接口;而
PDO
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
则是一个更通用的数据库抽象层,可以连接多种数据库,而不仅仅是MySQL。选择哪一个,往往取决于你的项目是否需要跨数据库兼容性,以及你个人对面向对象编程的偏好。但无论如何,它们都能帮助你完成数据库的连接、查询和数据操作。

解决方案

连接MySQL数据库,我通常推荐使用PDO,因为它更现代,也更灵活。不过,

MySQLi
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
在某些场景下,尤其当你确定只使用MySQL时,也非常好用。这里提供两种方式的基础连接和简单查询示例。

使用PDO连接MySQL

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

PDO的优势在于其统一的API,未来如果你需要切换到PostgreSQL或SQL Server,代码改动会小很多。

<?php
$dsn = 'mysql:host=localhost;dbname=your_database;charset=utf8mb4';
$username = 'your_username';
$password = 'your_password';

try {
    $pdo = new PDO($dsn, $username, $password);
    // 设置错误模式为抛出异常,这样可以更好地捕获错误
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); // 默认返回关联数组

    echo "数据库连接成功!<br>";

    // 示例:执行一个简单的查询
    $stmt = $pdo->query("SELECT id, name FROM users LIMIT 5");
    while ($row = $stmt->fetch()) {
        echo "ID: " . htmlspecialchars($row['id']) . ", Name: " . htmlspecialchars($row['name']) . "<br>";
    }

} catch (PDOException $e) {
    // 实际项目中,这里不应该直接输出错误信息,而是记录到日志文件
    echo "数据库连接失败或查询出错: " . $e->getMessage();
    // 生产环境中,只显示一个友好的错误页面
    // error_log("数据库错误: " . $e->getMessage());
}
?>
登录后复制

使用MySQLi连接MySQL (面向对象方式)

MySQLi
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
对于只使用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);
}
echo "数据库连接成功!<br>";

// 设置字符集
$conn->set_charset("utf8mb4");

// 示例:执行一个简单的查询
$sql = "SELECT id, name FROM users LIMIT 5";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // 输出每行数据
    while($row = $result->fetch_assoc()) {
        echo "ID: " . htmlspecialchars($row["id"]) . ", Name: " . htmlspecialchars($row["name"]) . "<br>";
    }
} else {
    echo "0 结果";
}

// 关闭连接
$conn->close();
?>
登录后复制

PHP连接MySQL,我应该选MySQLi还是PDO?它们各自的优势和适用场景是什么?

这真的是一个老生常谈的问题了,但每次讨论都挺有意思的。从我的经验来看,如果你只是在做一个小型项目,或者你确信你的应用永远只会和MySQL打交道,那么

MySQLi
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
其实是个不错的选择。它的API相对直接,特别是过程式写法,对于刚接触PHP和数据库的人来说,上手成本可能更低一点点。它对MySQL的特性支持也比较全面,毕竟是专门为MySQL设计的。

然而,一旦你的项目开始考虑扩展性,或者未来可能需要连接其他类型的数据库,比如PostgreSQL、SQLite,甚至是SQL Server,那么

PDO
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的优势就非常明显了。
PDO
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
提供了一个统一的接口,这意味着你切换数据库时,大部分的数据库操作代码都不需要大改,只需要修改连接字符串和一些特定于数据库的SQL语法。这种抽象能力在大型项目或需要多数据库支持的框架中尤其重要。

再者,

PDO
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
在预处理语句(Prepared Statements)方面,我认为它的接口设计比
MySQLi
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
更优雅,使用起来也更直观。预处理语句是防止SQL注入的关键,无论是
MySQLi
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
还是
PDO
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
都支持,但
PDO
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的参数绑定方式我个人更喜欢。所以,如果让我给个建议,新项目我通常会倾向于
PDO
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,因为它能给我更多的“安全感”和未来的灵活性。但如果你对
MySQLi
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
已经很熟悉,并且项目需求简单,继续用
MySQLi
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
也完全没问题,关键是理解其背后的原理和安全性。

遇到PHP连接MySQL数据库失败怎么办?常见的错误排查思路与解决办法

连接数据库失败,这几乎是每个开发者都会遇到的“家常便饭”。别慌,这通常不是什么大问题,往往是配置或者环境的小细节出了岔子。

首先,最常见的错误就是数据库凭证不对。检查你的

host
登录后复制
username
登录后复制
password
登录后复制
database name
登录后复制
是否都准确无误。很多时候,localhost可能不是真正的数据库服务器地址,或者你用的root用户没有密码,但代码里却写了密码。端口号也是个隐形杀手,MySQL默认是3306,但如果你的服务器改了,那也得在连接字符串里体现出来。

其次,MySQL服务没有运行。这是个很基础但又容易被忽略的问题。你得确保MySQL服务器进程是活着的。在Linux上,你可能需要用

systemctl status mysql
登录后复制
service mysql status
登录后复制
来检查。Windows上就是看服务管理器。如果没运行,启动它。

再来,防火墙问题。如果你的PHP应用和MySQL数据库不在同一台服务器上,或者即使在同一台,服务器的防火墙也可能阻止了PHP进程去连接MySQL的3306端口。你需要检查服务器的防火墙规则,确保3306端口是开放的。云服务器尤其要注意安全组规则。

还有一种情况是MySQL用户权限不足。你用来连接MySQL的用户可能没有从PHP应用所在的IP地址连接的权限,或者没有访问特定数据库的权限。你需要登录MySQL,检查

mysql.user
登录后复制
表,或者使用
GRANT
登录后复制
语句给用户赋权,例如
GRANT ALL PRIVILEGES ON your_database.* TO 'your_username'@'localhost' IDENTIFIED BY 'your_password';
登录后复制

排查思路:

  1. 看错误信息: PHP连接失败通常会抛出异常或返回错误信息。
    PDOException
    登录后复制
    mysqli_connect_error()
    登录后复制
    会告诉你具体是连接不上还是认证失败。仔细阅读这些信息,它们通常是最好的线索。
  2. 检查配置文件: 确保你的数据库连接参数不是硬编码在代码里,而是从配置文件(如
    .env
    登录后复制
    config.php
    登录后复制
    )中读取。这样方便管理和修改。
  3. 网络连通性: 在服务器上尝试
    ping
    登录后复制
    数据库服务器的IP地址,或者使用
    telnet your_db_host 3306
    登录后复制
    来测试端口是否开放。
  4. MySQL日志: MySQL服务器本身也会有错误日志,通常在
    /var/log/mysql/error.log
    登录后复制
    (Linux)或数据目录下的
    .err
    登录后复制
    文件(Windows)。检查这些日志,可能会发现连接尝试被拒绝的原因。
  5. PHP错误日志: 确保PHP的错误报告是开启的,并且错误日志有记录,这样你才能看到PHP层面抛出的异常。

通过这些步骤,大多数连接问题都能迎刃而解。

除了连接,PHP数据库操作还有哪些基础要点?如何确保数据安全?

连接数据库只是第一步,真正有价值的是连接之后的数据操作。PHP数据库操作的核心围绕着CRUD(Create, Read, Update, Delete)展开。

1. 数据插入 (Create): 将数据写入数据库。使用

INSERT INTO
登录后复制
语句。 关键点: 永远使用预处理语句(Prepared Statements)和参数绑定来插入数据。这能有效防止SQL注入。不要直接拼接用户输入到SQL查询中。

// PDO 插入示例
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':email', $email);
$name = '张三';
$email = 'zhangsan@example.com';
$stmt->execute();
echo "新记录插入成功!";

// MySQLi 插入示例 (面向对象)
$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email); // "ss" 表示两个字符串参数
$name = '李四';
$email = 'lisi@example.com';
$stmt->execute();
echo "新记录插入成功!";
$stmt->close();
登录后复制

2. 数据查询 (Read): 从数据库中检索数据。使用

SELECT
登录后复制
语句。 关键点: 同理,对于带条件的查询,也要使用预处理语句。处理查询结果时,需要遍历结果集。

// PDO 查询示例
$stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE id > :min_id");
$minId = 10;
$stmt->bindParam(':min_id', $minId, PDO::PARAM_INT);
$stmt->execute();
$users = $stmt->fetchAll(); // 获取所有结果
foreach ($users as $user) {
    echo "ID: " . htmlspecialchars($user['id']) . ", Name: " . htmlspecialchars($user['name']) . "<br>";
}

// MySQLi 查询示例 (面向对象)
$stmt = $conn->prepare("SELECT id, name, email FROM users WHERE id > ?");
$stmt->bind_param("i", $minId); // "i" 表示整数参数
$minId = 10;
$stmt->execute();
$result = $stmt->get_result(); // 获取结果集
while ($row = $result->fetch_assoc()) {
    echo "ID: " . htmlspecialchars($row['id']) . ", Name: " . htmlspecialchars($row['name']) . "<br>";
}
$stmt->close();
登录后复制

3. 数据更新 (Update): 修改数据库中的现有数据。使用

UPDATE
登录后复制
语句。 关键点: 务必带上
WHERE
登录后复制
登录后复制
子句,否则会更新所有记录。同样,参数绑定是必须的。

// PDO 更新示例
$stmt = $pdo->prepare("UPDATE users SET email = :new_email WHERE id = :user_id");
$newEmail = 'new_email@example.com';
$userId = 1;
$stmt->bindParam(':new_email', $newEmail);
$stmt->bindParam(':user_id', $userId, PDO::PARAM_INT);
$stmt->execute();
echo "记录更新成功!";
登录后复制

4. 数据删除 (Delete): 从数据库中移除数据。使用

DELETE FROM
登录后复制
语句。 关键点: 删除操作尤其危险,必须确保
WHERE
登录后复制
登录后复制
子句的准确性,避免误删。

// PDO 删除示例
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :user_id");
$userIdToDelete = 2;
$stmt->bindParam(':user_id', $userIdToDelete, PDO::PARAM_INT);
$stmt->execute();
echo "记录删除成功!";
登录后复制

确保数据安全:

  • 预处理语句是基石: 它是防止SQL注入最有效的方式。它将SQL逻辑和数据分离,数据库在执行前会先编译SQL模板,然后将参数安全地填充进去。
  • 输入验证与过滤: 即使使用了预处理语句,对用户输入进行验证和过滤仍然是必要的。例如,检查邮箱格式是否正确,数字是否真的是数字。
    filter_var()
    登录后复制
    函数在PHP中非常有用。
  • 输出转义: 当你从数据库中取出数据显示在网页上时,务必使用
    htmlspecialchars()
    登录后复制
    htmlentities()
    登录后复制
    对数据进行转义,防止XSS(跨站脚本攻击)。
  • 最小权限原则: 数据库用户只授予其完成任务所需的最小权限。例如,一个只读的应用,其数据库用户就不应该有写入或删除的权限。
  • 错误处理与日志: 不要直接向用户显示详细的数据库错误信息,这可能会泄露敏感信息。应该将错误记录到服务器日志中,并向用户显示一个友好的错误提示。
  • 密码哈希: 如果你的数据库存储用户密码,绝对不能明文存储。使用
    password_hash()
    登录后复制
    password_verify()
    登录后复制
    函数来安全地存储和验证密码。

这些基础操作和安全实践是构建任何健壮PHP应用不可或缺的部分。理解并正确运用它们,能大大提升你的应用质量和安全性。

以上就是PHP如何连接MySQL数据库 PHP数据库操作的基础教程的详细内容,更多请关注php中文网其它相关文章!

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

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

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

Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号