推荐使用mysqli或PDO连接MySQL;mysqli可在连接时第4参数指定库名,或用mysqli_select_db()切换;PDO通过DSN一步指定dbname更安全,且需加charset=utf8mb4防乱码。

mysqli_connect() 连接后必须用 mysqli_select_db() 或在连接时指定数据库名
PHP 7.0+ 已废弃 mysql_* 系列函数(如 mysql_connect、mysql_select_db),直接调用会报 Fatal error: Uncaught Error: Call to undefined function mysql_connect()。现在唯一推荐的方式是使用 mysqli 或 PDO。
最简选库路径有两种:
- 连接时直接在第 4 个参数传入数据库名:
mysqli_connect($host, $user, $pass, $dbname) - 先连服务器(不指定库),再用
mysqli_select_db($connection, $dbname)切换
注意:第 4 个参数是可选的,不填就只连 MySQL 服务,没默认库;此时若执行 SELECT * FROM user 会报错 No database selected。
mysqli_select_db() 必须传 resource 或 mysqli 对象,不能只传数据库名
常见错误写法:mysqli_select_db("myapp_db") —— 缺少连接句柄,会警告 mysqli_select_db() expects exactly 2 parameters。
立即学习“PHP免费学习笔记(深入)”;
正确做法:
- 用面向对象风格:
$mysqli = new mysqli($host, $user, $pass); $mysqli->select_db("myapp_db"); - 用过程式风格:
$conn = mysqli_connect($host, $user, $pass); mysqli_select_db($conn, "myapp_db");
如果连接失败,$conn 是 false,后续调用 mysqli_select_db(false, "xxx") 会触发警告。务必先检查连接是否成功。
PDO 方式更安全,推荐用 PDO::__construct() 一步指定数据库
比起 mysqli 分两步(连 + 选),PDO 在构造时就把数据库名嵌进 DSN 里,天然避免漏选库问题:
$dsn = "mysql:host=localhost;dbname=myapp_db;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);关键点:
-
dbname=xxx是 DSN 的一部分,不是额外参数 -
charset=utf8mb4建议加上,避免中文乱码和 emoji 存储异常 - 不加
dbname也能连上 MySQL 服务,但后续所有查询都得带database.table全限定名,比如SELECT * FROM myapp_db.users
连接失败或选库失败时,mysqli_connect_error() 和 mysqli_error() 返回不同信息
调试时容易混淆这两个函数:
-
mysqli_connect_error()只在mysqli_connect()失败后有效,例如账号密码错、端口不通 -
mysqli_error($conn)是针对已建立连接后的操作失败,比如mysqli_select_db($conn, "nonexistent")报错时才用它
典型调试片段:
$conn = mysqli_connect($host, $user, $pass);
if (!$conn) {
die("连接失败:" . mysqli_connect_error()); // ← 这里用 mysqli_connect_error()
}
if (!mysqli_select_db($conn, "myapp_db")) {
die("选库失败:" . mysqli_error($conn)); // ← 这里用 mysqli_error($conn)
}漏掉这个区分,可能拿到空字符串或上一次错误残留,导致定位困难。











