php连接mysql失败时,应先确认php.ini是否启用pdo_mysql或mysqli扩展、dsn字符串是否完整(含charset=utf8mb4)、mysql服务是否运行;insert/update必须用预处理防止sql注入,update/delete务必带where条件,select需区分fetch()与fetchall()使用场景。

别从“增删改查”四个字开始学,先盯住两个核心动作:连上数据库、安全地把数据塞进去或取出来。其他都是这俩动作的变体。
PHP连接MySQL失败常见报错和检查点
看到 PDOException: could not find driver 或 Connection refused 别急着改代码,先确认三件事:
-
php.ini 里是否启用了
extension=pdo_mysql(PDO)或extension=mysqli(MySQLi),重启 Web 服务后才生效 - DSN 字符串写全没:例如
mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8mb4,漏掉charset=utf8mb4后续中文可能乱码 - MySQL 服务真在跑:命令行执行
mysql -u root -p能登录,说明服务正常;连不上可能是端口被占、防火墙拦截,或用户名密码错
INSERT 和 UPDATE 必须用预处理,不能拼字符串
直接拼接 $sql = "INSERT INTO users VALUES ('$name', '$email')" 是高危操作,用户输个单引号就能让整个 SQL 崩溃甚至删库。
- 用
prepare()+execute()是唯一推荐路径,参数自动转义,类型也受控 - UPDATE/DELETE 没带 WHERE 条件?执行一次就清空整张表——这是线上事故最高发原因,务必在 SQL 里显式写
WHERE id = ?并检查rowCount()返回值 - 插入后想拿自增 ID:
PDO用$pdo->lastInsertId(),MySQLi用$mysqli->insert_id,别混用
SELECT 查询结果为空时别直接 foreach
fetchAll() 返回空数组 [],fetch() 返回 false,但很多人写成 foreach ($stmt->fetchAll() as $row) 看似没问题,一旦表里没数据就会静默跳过,前端显示空白还找不到原因。
- 查单条优先用
fetch(),返回false就说明没匹配到,该提示“用户不存在”就提示 - 查多条用
fetchAll(),但得先判断是否为空:if (empty($users)) { echo '暂无用户'; } - 别用
mysql_fetch_array()—— 这个函数早在 PHP 7.0 就被彻底移除,现在用会直接报致命错误
数组操作和数据库 CRUD 是两套逻辑,别强行类比
有人想“把数据库当数组操作”,比如用 array_push() 往结果集里加数据,或用 unset() 删除查询结果里的某条——这毫无意义。数据库操作本质是发指令给 MySQL 引擎,返回的是结果集快照,不是活引用。
- PHP 数组增删改查(
array_push、unset、键赋值、array_search)只作用于内存中的变量,和数据库无关 - 真正要改数据库里的数据,必须执行
UPDATE或DELETE语句,哪怕只是改一个字段 - 批量操作别循环 N 次
INSERT,改用INSERT ... VALUES (...), (...), (...)单语句多值,或事务包住多次execute()
最常被忽略的其实是字符集和错误模式:不设 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,出错就静默失败;不设 charset=utf8mb4,存 emoji 或某些生僻汉字就变问号。这两项配置不在连接里写清楚,后面所有操作都可能埋雷。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











