Login
主页 > 教程文章 > 后端开发

php增删改查怎么学_零基础入门php数据库操作必知基础【教程】

星夢妙者 2025-12-31 00:00:00 人看过
零基础应选 PDO。它支持多数据库、预处理统一、防注入直观;需手动开启异常模式和设置 UTF8;INSERT 报错多因绑定参数不匹配;SELECT 需调用 fetch();DELETE/UPDATE 用 rowCount() 获取影响行数。

PHP 连接 MySQL 用 mysqli 还是 PDO

零基础直接选 PDO。它支持多种数据库(MySQL、PostgreSQL、SQLite),预处理语句写法统一,防 SQL 注入更直观;mysqli 虽然轻量,但面向对象和过程式混用容易混乱,且只适配 MySQL。
注意:PDO 默认不开启异常模式,出错时静默失败——必须手动设置:

$pdo = new PDO($dsn, $user, $pass, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);

INSERT 时为什么总报 “SQLSTATE[HY000]: General error”?

这通常是预处理语句绑定参数出错导致的,比如:

  • 占位符数量和 execute() 传入数组元素个数不一致
  • 用了命名参数(如 :name)却传了索引数组(['张三']
  • 字段名拼错或表不存在,但没开异常模式,错误被吞掉
正确写法示例:
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute(['name' => '李四', 'email' => 'lisi@example.com']);

SELECT 返回空数组,但数据明明存在

常见原因不是 SQL 写错,而是:

  • 没调用 fetch()fetchAll() —— prepare()execute() 不返回结果,只是执行
  • 用了 PDO::FETCH_NUM 却按键名取值(如 $row['name']
  • 查询条件含中文或特殊字符,但连接未设 UTF8:PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"
安全读取一行的写法:
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([123]);
$user = $stmt->fetch(); // 注意这里!

DELETE 和 UPDATE 怎么确认影响了几行?

execute() 返回布尔值,不代表影响行数。必须调用 rowCount()

$stmt = $pdo->prepare("UPDATE users SET status = ? WHERE id = ?");
$stmt->execute(['active', 456]);
echo $stmt->rowCount(); // 输出实际更新的行数,可能为 0
如果返回 0,说明没匹配到记录——这不是错误,而是业务常态,别当成异常抛出。另外,WHERE 条件漏写会导致全表误更新,上线前务必检查。

PDO 的事务、错误上下文、字符集初始化这些点,初学时容易跳过,但一旦出问题,排查成本远高于提前加两行配置。

本站文章内容,部分来源于网络搜集发布,如有侵权,请联系我们修改或者删除处理。

课程推荐

热门文章

Copyright © 2016-2024 杭州鸣程科技有限公司 版权所有
浙ICP备2024057137号-1 浙公网安备33018502002374号 
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话:400-117-8398,QQ:
800881121,邮箱:mc93go@foxmail.com