推荐使用 PDO 或 mysqli 扩展连接 MySQL,mysql_connect() 在 PHP 7.0+ 已移除;PDO 需开启异常模式、密码特殊字符需 rawurlencode;mysqli 要显式设 utf8mb4 字符集;连接失败优先排查服务状态、用户权限、端口及扩展启用。

PHP 连接 MySQL 数据库,推荐直接使用 PDO 或 mysqli 扩展,mysql_connect() 等旧函数在 PHP 7.0+ 已被彻底移除,强行用会报 Fatal error: Uncaught Error: Call to undefined function mysql_connect()。
用 PDO 连接 MySQL(推荐)
PDO 是 PHP 官方推荐的数据库访问抽象层,支持预处理、多数据库切换、异常捕获,代码更健壮。
- 连接失败时默认静默,需手动开启
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION -
localhost和127.0.0.1在某些配置下行为不同(如 Unix socket vs TCP),建议明确写127.0.0.1避免权限或连接超时问题 - 密码为空或含特殊字符(如
@、/)时,必须对$password做rawurlencode()处理,否则 DSN 解析失败
$host = '127.0.0.1';
$port = 3306;
$dbname = 'testdb';
$username = 'root';
$password = 'p@ss/w0rd';
// 注意:密码含特殊字符时要 urlencode
$encoded_password = rawurlencode($password);
$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=utf8mb4";
try {
$pdo = new PDO($dsn, $username, $encoded_password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
} catch (PDOException $e) {
die('连接失败:' . $e->getMessage());
}
用 mysqli 连接 MySQL(面向对象方式)
如果项目已大量使用 mysqli,优先选面向对象写法,避免过程式函数(如 mysqli_connect())带来的作用域和错误处理混乱。
- 连接后务必检查
$mysqli->connect_error,不能只靠返回值判断 - 字符集必须显式设置为
utf8mb4(不是utf8),否则 emoji 和部分生僻字会乱码或截断 - 长连接(
MYSQLI_CLIENT_FOUND_ROWS等标志)一般不需要,除非有明确性能压测需求
$host = '127.0.0.1';
$port = 3306;
$dbname = 'testdb';
$username = 'root';
$password = 'p@ss/w0rd';
$mysqli = new mysqli($host, $username, $password, $dbname, $port);
if ($mysqli->connect_error) {
die('连接失败:' . $mysqli->connect_error);
}
// 必须设置,且是 utf8mb4,不是 utf8
$mysqli->set_charset('utf8mb4');
常见连接失败原因与排查点
连不上不是代码写错,往往是环境或权限配置没到位。以下几项比改代码更关键:
立即学习“PHP免费学习笔记(深入)”;
- MySQL 服务是否真在运行?用
systemctl status mysql(Linux)或brew services list | grep mysql(macOS)确认 - 用户权限是否包含从当前 host(如
'root'@'127.0.0.1')登录?执行SELECT User, Host FROM mysql.user;查看 -
防火墙或云服务器安全组是否放行了
3306端口?本地测试建议先关防火墙验证 - PHP 是否启用了
pdo_mysql或mysqli扩展?运行php -m | grep -i mysql检查 - 错误日志里出现
Connection refused→ MySQL 没启动或端口不对;出现Access denied→ 用户名/密码/Host 不匹配
真正卡住的地方,往往不在 new PDO() 那一行,而在 MySQL 的 user 表里少了一条 'appuser'@'127.0.0.1' 记录,或者 php.ini 里忘了开扩展。写完连接代码后,先盯住错误信息里的关键词,再查对应环节。











