PHP操作数据库应从首行INSERT即绑定MySQL,必须用PDO预处理防注入,DSN需含charset=utf8mb4,设ERRMODE_EXCEPTION捕获错误,以register.php为起点构建最小闭环,结合phpMyAdmin调试$_POST、表结构与错误信息。

PHP操作数据库不是“学完语法再连库”,而是从第一行可运行的 INSERT 就该和数据库绑定。不连上 MySQL,$_POST 就只是字符串,form 提交就等于白交。
用 PDO 而不是 MySQLi 面向过程写法
PDO 是当前 PHP 官方推荐的数据库访问层,统一接口、支持预处理、能防 SQL 注入,且切换数据库(比如从 MySQL 换到 SQLite)只需改 DSN,代码主体几乎不用动。MySQLi 面向过程写法(如 mysqli_connect() + mysqli_query())容易写出拼接 SQL 的危险代码,新手极易踩坑。
- 必须用
PDO::prepare()+PDOStatement::execute(),而不是直接拼"INSERT INTO users VALUES ('" . $_POST['name'] . "') - DNS 字符串格式是
mysql:host=localhost;dbname=demo;charset=utf8mb4,漏掉charset=utf8mb4会导致中文乱码或插入失败 - 连接后立刻设属性:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION),否则错误静默失败,查半天不知道哪断了
从 register.php 开始练,别先写 select
初学最容易卡在“查不到数据”——其实是没插进去,或者表结构/字段名/大小写对不上。先确保能稳定写入,再谈读取。一个最小闭环:HTML 表单 → register.php 接收 → PDO 插入 → 刷新 phpMyAdmin 看见新记录。
- 表必须有
id INT AUTO_INCREMENT PRIMARY KEY,否则INSERT可能报错但不提示 -
$_POST字段名要和 HTMLinput name="email"完全一致,区分大小写 - 插入后加
header('Location: success.php');防重复提交,别用echo "ok"后继续执行 - 测试时用
var_dump($_POST)确认数据真的到了 PHP,再查数据库连接是否成功
错误信息要直接看,别靠猜
PHP 数据库错误最常出现在三处:连接失败、SQL 语法错、字段约束冲突。每种对应不同错误信息,直接复制粘贴去 php.net 或 Stack Overflow 搜,比问人快十倍。
立即学习“PHP免费学习笔记(深入)”;
-
PDOException: SQLSTATE[HY000] [1045] Access denied for user→ 用户名密码错,或 MySQL 没开远程权限(本地开发一般用 root@localhost) -
PDOException: SQLSTATE[42S02] Base table or view not found→ 表名写错,或没选中数据库(DSN 里漏了dbname=xxx) -
PDOException: SQLSTATE[23000] Integrity constraint violation→ 比如email设了 UNIQUE 但重复插入,或NOT NULL字段传了空值
phpMyAdmin 不是玩具,是调试必需品
别把 phpMyAdmin 当成“可视化导入工具”。它本质是实时数据库终端:你能在里面直接执行 SELECT * FROM users 看刚插的数据,也能手动 DELETE 测试数据,还能点开表结构确认字段类型和默认值。很多“查不到”问题,其实是因为字段类型是 VARCHAR(20) 却塞了 30 个字符,被截断后查不出来。
- 每次改表结构后,清空浏览器缓存再进 phpMyAdmin,旧结构可能被缓存
- 执行 SQL 时注意右上角当前数据库是否是你 DSN 里写的那个,别在
information_schema里瞎试 - 导出 SQL 时勾选
IF NOT EXISTS,方便重装环境时一键重建表
真正卡住人的从来不是“怎么写 INSERT”,而是“为什么这行没进库”。盯住 $_POST、DSN、表结构、错误信息这四样东西,一个一个排除,比重写逻辑快得多。



















