在PHP开发中,连接MySQL数据库是非常基础且重要的操作,PDO(PHP Data Objects)是目前官方推荐的数据库连接方式,它提供了一致的数据库访问接口,支持预处理语句,能有效防范SQL注入,同时还可以兼容多种数据库类型,后续如果需要切换数据库类型也无需大幅修改代码。

PDO连接MySQL的核心准备
使用PDO连接MySQL之前,需要确保PHP环境已经开启了PDO扩展和PDO MySQL驱动,可以通过以下代码检查当前环境是否支持:
<?php
// 检查PDO扩展是否加载
if (extension_loaded('pdo')) {
echo 'PDO扩展已加载';
} else {
echo 'PDO扩展未加载,请开启php.ini中的pdo扩展';
}
// 检查PDO MySQL驱动是否可用
$drivers = PDO::getAvailableDrivers();
if (in_array('mysql', $drivers)) {
echo 'PDO MySQL驱动已支持';
} else {
echo 'PDO MySQL驱动未支持,请开启php.ini中的pdo_mysql扩展';
}
?>PDO连接MySQL的标准步骤
第一步:配置数据库连接参数
首先需要定义数据库的主机地址、端口、数据库名、用户名、密码以及字符集等基础参数,建议将这些参数单独定义,方便后续维护:
<?php // 数据库连接参数配置 $db_host = '127.0.0.1'; // 数据库主机地址,本地可以用127.0.0.1或者localhost $db_port = '3306'; // MySQL默认端口是3306,根据实际配置修改 $db_name = 'test_db'; // 要连接的数据库名称,需要提前创建好 $db_user = 'root'; // 数据库用户名 $db_pass = '123456'; // 数据库密码,实际生产环境不要明文写在代码里 $db_charset = 'utf8mb4'; // 字符集,推荐使用utf8mb4支持更多字符 ?>
第二步:拼接DSN数据源名称
DSN是PDO用来描述数据库连接信息的字符串,MySQL的DSN格式为mysql:host=主机地址;port=端口;dbname=数据库名;charset=字符集,需要将上一步的参数拼接进去:
<?php
// 拼接DSN字符串
$dsn = "mysql:host={$db_host};port={$db_port};dbname={$db_name};charset={$db_charset}";
?>第三步:创建PDO实例建立连接
通过new PDO()构造函数创建PDO对象,传入DSN、用户名、密码三个必填参数,还可以传入可选的驱动选项参数,用来设置连接后的默认行为:
<?php
try {
// 创建PDO实例,建立数据库连接
$pdo = new PDO($dsn, $db_user, $db_pass);
// 设置PDO错误模式为异常模式,方便捕获连接过程中的错误
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 设置默认获取结果集的模式为关联数组,方便后续读取数据
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
echo '数据库连接成功';
} catch (PDOException $e) {
// 捕获连接异常,输出错误信息,生产环境不要直接暴露详细错误
die('数据库连接失败:' . $e->getMessage());
}
?>第四步:验证连接可用性
连接成功后,可以执行简单的查询语句验证连接是否正常,比如查询MySQL的版本信息:
<?php
try {
// 执行简单查询验证连接
$stmt = $pdo->query('SELECT VERSION() as mysql_version');
$result = $stmt->fetch();
echo '当前MySQL版本:' . $result['mysql_version'];
} catch (PDOException $e) {
echo '查询验证失败:' . $e->getMessage();
}
?>PDO连接MySQL的注意事项
- 数据库连接参数不要硬编码在代码中,生产环境建议放在配置文件里,做好权限控制,避免密码泄露
- 字符集一定要设置为utf8mb4,否则可能无法存储emoji或者部分特殊字符
- 错误模式建议设置为
PDO::ERRMODE_EXCEPTION,方便通过try-catch捕获错误,不要使用默认的静默模式,否则连接失败也不会有提示 - 连接使用完成后可以手动销毁PDO对象释放资源,不过PHP脚本执行结束后会自动释放,手动销毁可以写
$pdo = null; - 如果数据库不在本地,需要确保数据库服务器允许远程连接,并且防火墙开放了对应的端口
完整的连接示例代码
以下是整合了所有步骤的完整可用示例:
<?php
// 数据库连接参数
$db_host = '127.0.0.1';
$db_port = '3306';
$db_name = 'test_db';
$db_user = 'root';
$db_pass = '123456';
$db_charset = 'utf8mb4';
// 拼接DSN
$dsn = "mysql:host={$db_host};port={$db_port};dbname={$db_name};charset={$db_charset}";
try {
// 创建PDO连接
$pdo = new PDO($dsn, $db_user, $db_pass);
// 设置错误模式
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 设置默认结果集模式
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
// 验证连接
$stmt = $pdo->query('SELECT VERSION() as mysql_version');
$version = $stmt->fetch();
echo 'PDO连接MySQL成功,MySQL版本:' . $version['mysql_version'];
} catch (PDOException $e) {
die('连接失败:' . $e->getMessage());
}
?>