PDO连接MySQL需启用pdo_mysql扩展,连接字符串格式为mysql:host=host;dbname=name;charset=utf8mb4;预处理防注入须用bindValue()绑定外部输入;查询用fetch(PDO::FETCH_ASSOC)或fetchAll(PDO::FETCH_ASSOC);事务需InnoDB引擎且全由PDO操作;必须设置PDO::ATTR_ERRMODE为PDO::ERRMODE_EXCEPTION。

PHP PDO 怎么连接 MySQL 数据库
PDO 本身不提供数据库服务,它只是 PHP 内置的一套数据库访问抽象层。真正干活的是底层驱动(比如 pdo_mysql),必须确保它已启用且配置正确。
常见错误是直接 new PDO() 报错:PDOException: could not find driver——这说明 pdo_mysql 扩展没开,不是代码写错了。
- Linux 下检查:
php -m | grep pdo,确认输出含pdo_mysql - Windows 下检查
php.ini是否启用了extension=php_pdo_mysql.dll - 连接字符串格式必须严格:
mysql:host=localhost;dbname=test;charset=utf8mb4,charset推荐显式指定,避免乱码
用 PDO::prepare() 防 SQL 注入时要注意什么
预处理不是加个 prepare() 就自动安全了。核心在于:**所有外部输入必须走 bindValue() 或 bindParam(),不能拼进 SQL 字符串里**。
错误示范:"SELECT * FROM user WHERE id = " . $_GET['id'] —— 即使后面调了 prepare() 也晚了。
立即学习“PHP免费学习笔记(深入)”;
- 表名、字段名、ORDER BY 子句等不能参数化,需白名单校验后拼接
-
bindValue()和bindParam()区别:后者绑定变量引用,适合循环执行;前者绑定值快照,更常用 - 类型指定别偷懒:
$stmt->bindValue(':id', $_GET['id'], PDO::PARAM_INT)比默认PARAM_STR更严谨
PDO 查询结果怎么取才不丢数据
很多人用 fetch() 取一行就停了,或者用 fetchAll() 不设 PDO::FETCH_ASSOC 导致拿到数字键+字符串键两套重复字段。
1、演示:以截图为准 程序试用后台:http://你的域名/admin/login.asp 后台登陆帐号:admin 密码:admin 说明: 这个是基于asp+access的企业网站源码,数据库已设有有防下载,网站更安全 要修改网站,自定义你自己要的页面,和美化页面都是你自己完成,网站源码程序完整,后台功能强大。 调试运行环境:要安装IIS服务器(IIS的安装和配置,安装好后,在地址栏输入:h
默认 fetch() 返回的是 PDO::FETCH_BOTH,既浪费内存又容易误读。
- 查单行优先用:
$row = $stmt->fetch(PDO::FETCH_ASSOC) - 查多行统一用:
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC) - 要对象化可用
PDO::FETCH_OBJ,但注意属性名是原始字段名(大小写敏感) - 游标默认是一次性向前的,调
fetch()多次会走到末尾,别指望反复调用拿同一行
事务失败时为什么 rollback() 像没发生一样
典型现象:beginTransaction() 后执行出错,手动 rollback(),但数据库里该改的还是改了——大概率是用了 MyISAM 引擎,它根本不支持事务。
另一个常见原因是:在事务中混用了非 PDO 操作(比如原生 mysql_query() 或其他扩展),PDO 的事务控制对其无效。
- 先确认表引擎:
SHOW CREATE TABLE user;,必须是 InnoDB - 整个事务块必须全由 PDO 执行,包括 INSERT/UPDATE/DELETE/SELECT FOR UPDATE
- 记得捕获异常并主动
rollback(),PDO 默认不是自动回滚的:catch (Exception $e) { $pdo->rollback(); throw $e; }
最常被忽略的其实是错误模式设置。不设 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,很多错误就静默失败了,连异常都抛不出来,调试时一头雾水。










