PHP 使用 PDO 进行数据库操作

  PHP 7 已经彻底移除了对 MySQL 扩展的支持,推荐使用 PDO 进行数据库操作,PDO(PHP Data Objects)是一种安全且高效的方法,可以连接和操作多种数据库。PDO 提供了一个统一的接口,用于执行 SQL 查询和操作数据库。

  准备一张测试表(以 MySQL 为例)

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `email` varchar(100) NOT NULL,
  `age` int(3) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  PDO 数据库连接

<?php
// 数据库配置
$host = '127.0.0.1';
$dbname = 'test'; // 你的数据库名
$username = 'root'; // 数据库账号
$password = ''; // 数据库密码
$charset = 'utf8';

// PDO 连接字符串
$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";

// PDO 配置选项
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, // 开启异常错误模式
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,       // 默认返回关联数组
    PDO::ATTR_EMULATE_PREPARES   => false,                  // 关闭预处理模拟,防注入
];

try {
    // 创建 PDO 实例
    $pdo = new PDO($dsn, $username, $password, $options);
    echo "数据库连接成功!<br>";
} catch (PDOException $e) {
    // 捕获连接异常
    die("数据库连接失败:" . $e->getMessage());
}
?>

  增删改查完整操作

  1. 新增数据(Create)

// SQL 语句(用 ? 占位符 或 :name 命名占位符)
$sql = "INSERT INTO users (username, email, age) VALUES (?, ?, ?)";

// 1. 预处理 SQL
$stmt = $pdo->prepare($sql);

// 2. 执行(传入参数数组)
$stmt->execute(['张三', 'zhangsan@test.com', 25]);

// 获取自增ID
$insertId = $pdo->lastInsertId();
echo "新增成功,ID:" . $insertId;

  2.查询数据(Read)

  (1)查询单条数据

$id = 1;
$sql = "SELECT * FROM users WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);

// 获取单条结果
$user = $stmt->fetch();

if ($user) {
    print_r($user);
} else {
    echo "未找到数据";
}

  (2)查询多条数据

$sql = "SELECT * FROM users WHERE age > ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([18]);

// 获取所有结果
$userList = $stmt->fetchAll();

foreach ($userList as $user) {
    echo "ID:{$user['id']},用户名:{$user['username']}<br>";
}

  3.更新数据(Update)

$sql = "UPDATE users SET username = ?, age = ? WHERE id = ?";
$stmt = $pdo->prepare($sql);

// 执行更新
$stmt->execute(['李四', 26, 1]);

// 获取受影响行数
$rowCount = $stmt->rowCount();
echo "更新成功,受影响行数:" . $rowCount;

  4.删除数据(Delete)

$id = 1;
$sql = "DELETE FROM users WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);

$rowCount = $stmt->rowCount();
echo "删除成功,受影响行数:" . $rowCount;

  四、PDO事务处理(重要)

  事务用于保证多条SQL要么全部成功,要么全部失败,保证数据一致性。

try {
    // 开启事务
    $pdo->beginTransaction();

    // 执行多条SQL
    $pdo->exec("INSERT INTO users (username, email) VALUES ('王五', 'wangwu@test.com')");
    $pdo->exec("UPDATE users SET age = 30 WHERE username = '王五'");

    // 提交事务
    $pdo->commit();
    echo "事务执行成功!";

} catch (PDOException $e) {
    // 回滚事务
    $pdo->rollBack();
    echo "事务执行失败:" . $e->getMessage();
}

  五、PDO关键知识点

  1.两种占位符写法

  ①问号占位符(简单)

$sql = "INSERT INTO users (username, email) VALUES (?, ?)";
$stmt->execute(['张三', 'a@test.com']);

  ②命名占位符(清晰)

$sql = "INSERT INTO users (username, email) VALUES (:name, :mail)";
$stmt->execute([
    ':name' => '张三',
    ':mail' => 'a@test.com'
]);

  2.防SQL注入

  PDO预处理语句自动过滤危险字符,永远不要直接拼接变量到SQL里:

// 危险写法(SQL注入)
$sql = "SELECT * FROM users WHERE id = $id";

// 安全写法(预处理)
$sql = "SELECT * FROM users WHERE id = ?";

  3.常用获取结果方法

  fetch()→获取单条数据

  fetchAll()→获取所有数据

  rowCount()→获取受影响行数(增删改)

  lastInsertId()→获取自增ID(新增)

本站原创内容,转载请注明来源:https://www.liutonghui.com/140.html

净月静悦
上一篇 2016-06-29
主场败北叙利亚,国足战绩早有预见
下一篇 2016-10-07

评论列表(1条)

  • dongwu 2016-11-16 11:24:46

    新手学习一下

    • 管理员 2016-11-21 20:31:17

      回复 dongwu:这是个简单案例,具体多看看手册的详细用法

发表评论

captcha

相关推荐

  • PHP使用内置函数处理JSON数据

      JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,通常用于在前端和后端之间传递数据。在PHP中,你可以使用内置的函数来处理JSON数据,实现数据的编码和解码。   以下是PHP中JSON的一些常见应用:   1. 编码(PHP对象转为JSON字符串)   使用 json_encode() 函数可以将PHP对象转换为JSON格式的字符串: $data = array( 'name' =......

    2013-10-09
    16780
  • MySQL转SQLite数据库注意事项

      平时开发中会遇到将MySQL转为SQLite数据库的情况,转换后多少都会出现一些报错问题,这是因为SQLite和MySQL的一些函数和语法不兼容,这些不兼容并不是很多,只需要简单修改一下就可以修复报错。   比如按随机数查询数据,在MySQL中可以这样写: $list = User::where('status', 1)-&gt;limit(10)-&gt;orderRaw('rand()')-&gt;select();   但是在......

    2017-04-29
    26510
  • PHP封装数据库操作Model类示例

      数据库操作是产品开发中最常见的需求,封装一个PHP数据库操作Model类可以减少反复的写大量SQL语句,下面就为大家分享一个数据库操作Model类。 &lt;?php //引入配置文件 include "./config.php"; class Model { public $link;//存储连接对象 public $tableName = "";//存储表名 public $field =......

    2019-06-12
    21024
  • ThinkPHP数据库操作(Db)与模型操作(Model)区别

      Db类数据操作:性能略高一些,语法简单直观,但是不支持自动处理数据,自动验证,关联查询等功能,适合简单数据操作。 use think\facade\Db; // 查询 Db::table('user')-&gt;where('id', 1)-&gt;find(); // 新增 Db::table('user')-&gt;insert([ 'name' =&gt; '张三', 'age' =&gt; 20 ]); ......

    2019-12-02
    18300
  • 使用 jQuery 高亮显示当前栏目导航链接

      高亮显示当前栏目导航链接的原理是:先获取当前页面的 URL 或标识当前页面的导航链接,在文档加载时,使用 jQuery 添加一个特定的类或样式来高亮当前栏目导航链接。   以下是一个基本的示例,展示如何使用 jQuery 高亮显示当前栏目导航链接。在这个例子中,假设导航链接的 href 属性与当前页面的 URL 匹配。 &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt;......

    2021-02-03
    17900
  • PHP使用QR Code生成二维码实例

      要在PHP中生成二维码,可以使用第三方库,其中一个流行的是PHP QR Code库。以下是一个简单的示例,演示如何使用PHP QR Code库生成二维码。   使用 Composer 安装 PHP QR Code: composer require chillerlan/php-qrcode   PHP 生成二维码示例 &lt;?php // 引入 Composer 的自动加载文件 require_once 'vendor/aut......

    2021-10-07
    17750
  • ThinkPHP数据软删除及数据恢复功能

      ThinkPHP的软删除不是真正删除数据库数据,而是通过标记字段(如delete_time)记录删除状态,查询时自动过滤delete_time字段已标记删除的数据,支持数据恢复和真实删除,相当于为项目加了一个回收站功能,以避免数据被误删。   软删除依赖模型操作,不支持原生查询,需要数据表有删除标记字段(默认delete_time,类型:datetime/timestamp,允许null),需要引入ThinkPHP内置的SoftDe......

    2022-01-27
    10710
  • ThinkPHP获取数据库类型和版本的方法

      在开发后台功能时,可能会需要自动获取当前使用的数据库类型和版本的情况,下面就举个简单的例子实现自动获取当前项目使用的是MySQL还是SQLite数据库及使用的相应数据库版本的方法: // 数据库类型 $default = config('database.default'); $config = config('database.connections.' . $default); $db_type = strtolower(tri......

    2024-11-02
    8890