php怎么连接数据库_MySQL数据库连接的基础代码编写【说明】
技术百科
看不見的法師
发布时间:2026-01-01
浏览: 次 推荐使用 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');
常见连接失败原因与排查点
连不上不是代码写错,往往是环境或权限配置没到位。以下几项比改代码更关键:
- 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 里忘了开扩展。写完连接代码后,先盯住错误信息里的关键词,再查对应环节。
# app
# mac
# word
# linux
# 防火墙
# 端口
# Error
# 对象
# macos
# 数据库
# access
# function
# 作用域
# select
# php
# mysql
# undefined
# pdo
# unix
# mysqli
# 面向对象
# 云服务
# 云服务器
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php串口通信波特率怎么选_根据硬件手册设置正确波
- php8.4如何调用com组件_php8.4win
- 如何在 Go 中判断变量是否为函数类型
- php转mp4怎么设置帧率_调整php生成mp4视
- 如何在Golang中配置代码格式化工具_使用gof
- Win11 C盘满了怎么清理 Win11磁盘清理和
- Windows 10怎么录屏_Windows 10
- Windows怎样关闭桌面弹窗广告_Windows
- php订单日志权限怎么设_php订单日志文件权限设
- Mac怎么进行语音输入_Mac听写功能设置与使用【
- 如何用正则表达式精确匹配最多含一个换行符的起止片段
- 如何使用Golang匿名函数_快速定义临时函数逻辑
- Linux如何使用grep搜索文件内容_Linux
- Python与OpenAI接口集成实战_生成式AI
- PHP 中如何在函数内持久修改引用变量所指向的目标
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- php中作用域操作符能访问私有静态属性吗_访问权限
- 如何处理“XML格式不正确”错误 常见XML we
- Windows服务持续崩溃怎样修复_系统服务保护机
- 如何在 Go 中正确测试带 Cookie 的 HT
- 如何在Golang中实现文件下载_Golang文件
- 如何减少Golang内存碎片化_Golang内存分
- c++中如何求一个数的平方根_c++ sqrt函数
- php485函数执行慢怎么优化_php485性能提
- Win10怎么限制单程序CPU占用上限_Win10
- Windows10如何更改系统字体大小_Win10
- Dapper的Execute方法的返回值是什么意思
- 如何使用Golang处理静态文件缓存_提高页面加载
- 跨文件调用类方法怎么用_php作用域操作符与自动加
- 如何使用Golang优化模块引入路径_Golang
- Win11输入法切换快捷键怎么改_Windows
- 如何使用Golang encoding/json解
- Win11怎么设置多显示器任务栏 Win11扩展任
- Python性能剖析高级教程_cProfileLi
- Win10系统怎么查看网络连接状态_Windows
- Win11怎么忘记WiFi网络_Win11删除已保
- Win10如何备份驱动程序_Win10驱动备份步骤
- Go 语言标准库为何不提供泛型 Contains
- LINUX如何查看文件类型_Linux中file命
- c# F# 的 MailboxProcessor
- 如何在Windows上设置闹钟和计时器_系统自带的
- Windows10电脑怎么查看硬盘通电时间_Win
- C#如何使用Channel C#通道实现异步通信
- 如何在网页无标准表格标签时高效提取结构化数据
- 如何使用Golang实现容器自动化运维_Golan
- windows如何修改文件默认打开方式_windo
- 如何在 IIS 上为 ASP.NET 6 应用排除
- php485返回数据不完整怎么办_php485数据
- 如何在Golang中实现自定义Benchmark_
- php中::能用于接口静态方法吗_接口静态方法调用

某些配置下行为不同(如 Unix socket vs TCP),建议明确写
QQ客服