推荐使用 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 是 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,优先选面向对象写法,避免过程式函数(如 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');
连不上不是代码写错,往往是环境或权限配置没到位。以下几项比改代码更关键:
systemctl status mysql(Linux)或 brew services list | grep mysql(macOS)确认'root'@'127.0.0.1')登录?执行 SELECT User, Host FROM mysql.user; 查看3306 端口?本地测试建议先关防火墙验证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 里忘了开扩展。写完连接代码后,先盯住错误信息里的关键词,再查对应环节。