在PHP开发中,与数据库交互是核心环节之一,而 mysqli 扩展是官方推荐的用于连接和操作 MySQL 数据库的方式,它相较于老旧的 mysql 扩展,提供了更强大的功能、更好的安全性和对面向对象编程的支持,掌握如何使用 mysqli 连接数据库,是每个PHP开发者的基本功。

mysqli 提供了两种主要的编程风格:面向对象和面向过程,面向对象风格是现代PHP开发的主流,代码更清晰、更易于维护和扩展,下面我们将重点介绍面向对象的连接方式,并同时提供面向过程的写法以供参考。
面向对象风格连接数据库
这是最推荐的方式,它将数据库连接视为一个对象,我们可以通过调用该对象的方法来执行各种操作。
<?php
// 1. 定义数据库连接参数
$host = 'localhost'; // 数据库服务器地址,通常是localhost
$username = 'your_username'; // 数据库用户名
$password = 'your_password'; // 数据库密码
$dbname = 'your_database'; // 要连接的数据库名称
// 2. 创建mysqli对象并尝试连接
$mysqli = new mysqli($host, $username, $password, $dbname);
// 3. 检测连接是否成功
// connect_error 属性包含了连接失败的错误信息
if ($mysqli->connect_error) {
    // 在生产环境中,应避免直接输出错误信息,可以记录到日志
    die('连接失败: ' . $mysqli->connect_error);
} 
// 连接成功,设置默认字符集(推荐)
$mysqli->set_charset("utf8mb4");
echo "数据库连接成功!";
// 4. 在此处执行数据库查询操作...
// 5. 关闭连接(脚本执行完毕后会自动关闭,但显式关闭是良好习惯)
$mysqli->close();
?>
代码解析:

- 参数定义:将连接信息存储在变量中,便于管理和修改,在实际项目中,这些信息通常存储在配置文件中。
 - 实例化对象:使用 
new mysqli()构造函数尝试建立连接,如果成功,返回一个代表连接的对象;如果失败,则返回false并设置connect_error属性。 - 错误处理:
if ($mysqli->connect_error)是至关重要的错误检查步骤,它确保了在连接失败时,脚本能够停止执行并给出提示,防止后续代码在无效连接上运行。 - 设置字符集:调用 
set_charset("utf8mb4")可以确保数据在传输过程中不会出现乱码,utf8mb4是utf8的超集,支持更广泛的字符(如emoji)。 - 关闭连接:使用 
$mysqli->close()方法显式地关闭数据库连接,释放服务器资源。 
面向过程风格连接数据库
这种风格与旧的 mysql 扩展类似,通过调用独立的函数来操作。
<?php
// 1. 定义数据库连接参数
$host = 'localhost';
$username = 'your_username';
$password = 'your_password';
$dbname = 'your_database';
// 2. 建立连接
$link = mysqli_connect($host, $username, $password, $dbname);
// 3. 检测连接
if (!$link) {
    die('连接失败: ' . mysqli_connect_error());
}
// 设置字符集
mysqli_set_charset($link, "utf8mb4");
echo "数据库连接成功!";
// 4. 执行操作...
// 5. 关闭连接
mysqli_close($link);
?>
连接参数详解
为了更清晰地理解连接所需的参数,下表进行了详细说明:
| 参数名 | 描述 | 常见示例值 | 
|---|---|---|
$host | 
数据库服务器的主机名或IP地址。 | localhost, 0.0.1, db.example.com | 
$username | 
登录数据库的用户名。 | root, my_user | 
$passwd | 
对应用户的密码。 | my_secure_password | 
$dbname | 
默认要切换到的数据库名称。 | my_app_db | 
$port | 
MySQL服务端口号,可选,默认为3306。 | 3306 | 
$socket | 
Unix域套接字或命名管道,可选。 | /tmp/mysql.sock | 
最佳实践与注意事项
- 错误处理:始终检查连接是否成功,在生产环境中,应将错误信息记录到日志文件,而不是直接显示给用户。
 - 安全性:切勿将数据库密码等敏感信息硬编码在代码中并提交到版本控制系统(如Git),应使用环境变量或独立的配置文件来管理这些凭据。
 - 字符集:始终在建立连接后显式设置字符集为 
utf8mb4,以避免数据编码问题。 - 持久连接:
mysqli支持持久连接(在主机名前加p:),可以减少建立连接的开销,但在高并发或共享主机环境下需谨慎使用。 
相关问答FAQs
问1: mysqli连接数据库时提示“Access denied for user”,这通常是什么原因造成的? 答: 这个错误信息意味着认证失败,即MySQL拒绝了你的连接请求,最常见的原因有以下几点:

- 用户名或密码错误:请仔细检查代码中填写的用户名和密码是否与数据库中设置的一致。
 - 用户没有权限:你使用的用户可能没有被授予从当前主机(
$host)登录或访问指定数据库($dbname)的权限,你需要登录MySQL的root账户,使用GRANT语句为该用户授权。 - 用户不存在:你试图使用的用户名在MySQL中根本不存在。
 - 密码为空:如果密码为空, 
$password变量应留空或设为空字符串 ,而不是'null'或其他值。 
问2: mysqli和PDO有什么区别?在开发中应该如何选择?
答: mysqli 和 PDO 都是PHP中操作数据库的优秀扩展,主要区别在于:
- 数据库支持:
PDO(PHP Data Objects)是一个数据访问抽象层,支持多种数据库(MySQL, PostgreSQL, SQLite等),通过更换驱动程序即可切换数据库。mysqli是专门为 MySQL 设计的,只支持 MySQL 和 MariaDB。 - API:两者都提供面向对象和面向过程的API。
 - 预处理语句:两者都支持预处理语句,有效防止SQL注入,但 
PDO在绑定参数时支持命名占位符(如name),代码可读性更好;mysqli只支持问号占位符()。 - 性能:在纯MySQL环境下,
mysqli的性能通常略优于PDO,但差距在多数应用中可以忽略不计。 
选择建议:
- 如果你的项目未来可能需要切换到其他数据库系统,或者你希望代码具有更好的可移植性,强烈推荐使用 
PDO。 - 如果你的项目确定只使用MySQL/MariaDB,并且需要利用一些MySQL特有的高级功能,或者追求极致的性能,那么选择 
mysqli是一个很好的选择。