rds连接失败主因是地址、端口、白名单未对齐:需用控制台显示的域名而非ip,确认端口(默认3306,自定义范围1000–5999),内网地址仅限同地域/vpc/ecs使用,外网需开通并添加本地出口ip至白名单;密码含特殊字符须单引号包裹或rawurlencode();mysqli_connect()与new mysqli()参数顺序不同,pdo dsn格式须严格为mysql:host=xxx;port=3306;dbname=xxx;charset=utf8mb4,并启用异常模式。

直接用 mysqli 或 PDO 连 RDS 是可行的,但绝大多数连不上问题,根本不在 PHP 代码里,而在地址、端口、白名单这三处没对齐。
确认 RDS 实例的连接地址和端口是否正确
很多人卡在第一步:用错了地址。RDS 控制台里「数据库连接」页显示的地址是域名(如 rm-xxx.mysql.rds.aliyuncs.com),不是 IP;端口默认是 3306,但可自定义(仅限 1000–5999),改完后旧连接字符串必须同步更新。
- 内网连接地址只能在同地域 + 同 VPC + 同账号的 ECS 上用;外网地址需手动开通,且本地公网 IP 必须加进 RDS 白名单
- 执行
curl ifconfig.me或curl ipinfo.io/ip查当前出口 IP,别凭记忆填 - 控制台看到的“内网地址”和“外网地址”是两个独立字段,别把内网地址复制到本地环境去试
PHP 中密码含特殊字符时必须做 URL 编码或单引号包裹
RDS 账号密码若含 $、@、/、: 等字符,直接拼进连接字符串会导致解析失败——mysqli 会把 @ 当作分隔符,把后面部分误认为 host。
- 推荐做法:用单引号包裹整个密码,例如
'my$ecur3@pass'(单引号不解析变量和转义) - 更稳妥方式:对密码做
rawurlencode(),再拼入 DSN(尤其用PDO时) - CI4 的配置数组里,
password字段也建议用单引号,避免被 PHP 解析器提前截断
mysqli_connect() 和 new mysqli() 的参数顺序容易写反
这两个函数看着像,但参数顺序不同,写错就直接报 Connection refused 或空连接对象。
-
mysqli_connect($host, $username, $password, $database, $port)——$port是第五个参数,不能省略时得传null占位 -
new mysqli($host, $username, $password, $database, $port)—— 顺序一致,但构造失败返回mysqli对象而非false,需用$conn->connect_error判断 - 如果只传前四个参数,默认端口是
3306;显式传3306更安全,避免本地 MySQL 配置干扰
用 PDO 连接时 DSN 格式必须严格匹配
PDO 的 MySQL DSN 是最易出错的一环,少一个冒号、多一个空格、端口没写对,都会静默失败或抛出模糊异常。
- 标准格式:
mysql:host=<code>rm-xxx.mysql.rds.aliyuncs.com;port=3306;dbname=your_db;charset=utf8mb4 - 注意:
host=后面不能有空格,port=必须显式写出(哪怕就是 3306),charset推荐设为utf8mb4避免 emoji 存储异常 - 连接后务必执行
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION),否则错误不会抛出,调试时像在黑盒里摸鱼
真正卡住人的,往往不是“怎么写代码”,而是“连哪个地址、用哪个端口、IP 加没加白名单、密码有没有被解析错”。这些外部依赖项一旦没对齐,再规范的 PHP 连接代码也起不来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











