PHP 8 连接 MySQL 推荐使用 PDO 或 MySQLi 面向对象方式,禁用已移除的 mysql_* 函数;需确保服务运行、扩展启用(pdo_mysql 或 mysqli)、数据库权限正确;PDO 更安全,支持预处理防注入,须显式指定 charset=utf8mb4;MySQLi 需调用 set_charset("utf8mb4") 避免乱码;凭证应外置配置,用户输入必须预处理,生产环境关闭错误显示。

PHP 8 连接 MySQL 并查询数据,推荐使用 PDO 或 MySQLi 面向对象方式,两者均完全支持 PHP 8,且安全、稳定、可维护性强。mysql_* 函数早已被移除,不可用。
确认环境与扩展已启用
连接前需确保:
- MySQL 服务正在运行(可通过命令
mysql -u root -p测试) - PHP 8 已启用
pdo_mysql(PDO 方式)或mysqli(MySQLi 方式)扩展 - 在
phpinfo()页面中能查到pdo_mysql或mysqli模块信息 - 数据库已创建,用户有对应权限(如
GRANT SELECT ON mydb.* TO 'user'@'localhost')
用 PDO 连接并执行查询(推荐)
PDO 更安全,支持预处理防注入,自动处理异常,编码统一性好:
<?php $host = 'localhost';
$dbname = 'mydb';
$user = 'user';
$pass = 'password';
<p>try {
$dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);<pre class="brush:php;toolbar:false;">// 查询示例
$stmt = $pdo->query("SELECT id, name, email FROM users LIMIT 5");
$users = $stmt->fetchAll();
foreach ($users as $row) {
echo "ID: {$row['id']}, 名称: {$row['name']}, 邮箱: {$row['email']}<br>";
}} catch (PDOException $e) { die("数据库错误: " . $e->getMessage()); } ?>
注意:charset=utf8mb4 必须显式指定,避免中文乱码;PDO::ATTR_DEFAULT_FETCH_MODE 可省去每次调用 fetch(PDO::FETCH_ASSOC)。
用 MySQLi 面向对象方式连接并查询
若项目已大量使用 MySQLi,或追求更贴近 MySQL 原生行为,可用此方式:
<?php $host = 'localhost';
$username = 'user';
$password = 'password';
$database = 'mydb';
<p>$conn = new mysqli($host, $username, $password, $database);<p>if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}</p><p>// 设置字符集(关键!否则中文可能乱码)
$conn->set_charset("utf8mb4");</p><p>$result = $conn->query("SELECT id, name, email FROM users WHERE status = 1");
if ($result && $result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "ID: {$row['id']}, 名称: {$row['name']}, 邮箱: {$row['email']}<br>";
}
}</p><p>$conn->close(); // 显式关闭连接
?></p>
务必调用 $conn->set_charset("utf8mb4"),否则即使数据库是 utf8mb4,PHP 默认仍按 latin1 解析。
安全与最佳实践要点
实际开发中要注意:
- 数据库凭证不要硬编码,应放在独立配置文件(如
config.php),并禁止 Web 直接访问 - 涉及用户输入的查询,必须使用预处理语句(
$pdo->prepare()或$mysqli->prepare())防止 SQL 注入 - 生产环境禁用
display_errors = On,避免泄露数据库结构或路径 - 连接成功后立即设置字符集,不依赖 MySQL 服务端默认值
- 短生命周期脚本无需手动 close,但长任务或循环中建议及时释放资源
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











