mysqli_connect()第5–7个参数依次为port、socket、client_flags:port显式指定端口号(如3306);socket填unix socket路径(如/var/run/mysqld/mysqld.sock)用于本地快速连接;client_flags为位标志组合(如mysqli_client_ssl),启用ssl等高级特性。

mysqli_connect() 的第5–7个参数怎么填
PHP 7.1 中 mysqli_connect() 最多支持7个参数,但文档常只提前4个(host/user/pass/db),后3个容易被忽略却直接影响连接行为:
-
port:显式指定端口(如3306),避免依赖默认值;若 MySQL 启动时用了非标端口(比如3307),不填就会连不上 -
socket:仅限本地连接,填 Unix socket 路径(如/var/run/mysqld/mysqld.sock),比localhost更快且绕过 TCP 栈;但填错路径会直接报Connection refused -
client_flags:位运算组合,常用MYSQLI_CLIENT_FOUND_ROWS或MYSQLI_CLIENT_SSL;若需启用 SSL 连接远程库,必须设此参数,否则mysqli_real_connect()内部会跳过握手
示例:$conn = mysqli_connect('127.0.0.1', 'user', 'pass', 'db', 3306, null, MYSQLI_CLIENT_SSL);
PDO 构造函数的 options 数组关键项
PHP 7.1 的 PDO 不自动启用异常模式,PDO::ATTR_ERRMODE 必须显式设置,否则错误静默失败——这是最常踩的坑。
-
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION:让所有数据库错误抛出PDOException,便于try/catch捕获 -
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4":比 DSN 中的charset=utf8mb4更可靠,尤其在连接复用或字符集协商失败时生效 -
PDO::ATTR_PERSISTENT => true:启用持久连接,但注意——事务未提交、临时表未清理会导致后续请求状态污染 -
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC:省去每次fetch()传参数,避免返回数字索引数组引发字段顺序依赖
错误写法:new PDO($dsn, $user, $pass)(没 options);正确写法:new PDO($dsn, $user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
MySQLi 对象方式里 connect_error 和 errno 的区别
用 new mysqli() 实例化后,不能只靠 $mysqli->connect_error 判断成败——它只反映构造时的连接错误,而 $mysqli->errno 是运行时错误码,二者作用域不同。
-
$mysqli->connect_error:仅在 new mysqli() 执行后立即有效;一旦执行过 query(),这个属性就不再更新 -
$mysqli->errno:每次操作(query/prepare/close)后都会刷新,适合检查单条语句失败原因,比如1045(Access denied)、1049(Unknown database) - 常见误判:连接成功后执行
$mysqli->query("SELECT * FROM nonexist"),此时$mysqli->connect_error仍是空字符串,但$mysqli->errno === 1146
ThinkPHP 5.x 的 database.php 怎么配 SSL 和超时
ThinkPHP 5.x 默认不暴露 SSL 和超时参数,需手动加到 config/database.php 数组里,否则即使数据库开了 SSL,框架仍走明文连接。
-
'sslca'、'sslcert'、'sslkey':填绝对路径(如/etc/mysql/ssl/ca.pem),缺一不可;路径错则报SSL connection error -
'timeout':控制连接建立最大等待秒数(不是查询超时),设为5可防 DNS 解析卡死;TP5 默认是 0(无限等待) -
'params':PDO 原生选项入口,例如'params' => [PDO::ATTR_TIMEOUT => 3]控制查询级超时,但 PHP 7.1 的 mysqlnd 驱动对此支持有限,实际生效要看 MySQL server 端的wait_timeout
复杂点在于:SSL 参数只对 PDO 生效,MySQLi 方式需改用 mysqli_ssl_set() 单独调用,TP5 不封装这层——这意味着切换驱动时配置要重写。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











