
TD类是通达OA提供的核心数据库操作类,封装了MySQL数据库的常用操作,提供了安全、便捷的数据库访问接口。本文将深入解析TD类的设计原理、成员方法和使用技巧,帮助您高效地进行数据库操作。
TD类位于 MYOA\webroot\inc\td.class.php,是OA数据库操作的核心类。

特点 | 说明 |
|---|---|
安全防护 | 自动进行SQL注入防护 |
连接管理 | 自动处理数据库连接和断开 |
简化操作 | 封装常用数据库操作方法 |
事务支持 | 支持事务处理 |
缓存集成 | 与Redis缓存无缝集成 |
// 方式1:直接包含
include_once("inc/td.class.php");
// 方式2:通过auth.inc.php间接包含(推荐)
include_once("inc/auth.inc.php");推荐使用方式2,因为 auth.inc.php 已包含了 td.class.php,且会进行权限验证。
$td = new TD();功能:
3.2.1 query() - 执行SQL语句
$result = $td->query($sql);参数:
$sql:SQL语句字符串返回值:
示例:
// 查询
$result = $td->query("SELECT * FROM user WHERE uid = 1");
// 插入
$td->query("INSERT INTO user (username, password) VALUES ('test', '123456')");
// 更新
$td->query("UPDATE user SET name = '张三' WHERE uid = 1");
// 删除
$td->query("DELETE FROM user WHERE uid = 1");3.2.2 execute() - 执行SQL语句(忽略结果)
$success = $td->execute($sql);参数:
$sql:SQL语句字符串返回值:
适用场景:执行不需要返回结果的SQL语句(如INSERT、UPDATE、DELETE)。
3.3.1 fetch_array() - 获取关联数组
$row = $td->fetch_array($result);参数:
$result:结果集资源返回值:
示例:
$result = $td->query("SELECT * FROM user WHERE uid = 1");
$user = $td->fetch_array($result);
echo $user['username']; // 输出用户名3.3.2 fetch_row() - 获取索引数组
$row = $td->fetch_row($result);参数:
$result:结果集资源返回值:
示例:
$result = $td->query("SELECT username, name FROM user WHERE uid = 1");
$row = $td->fetch_row($result);
echo $row[0]; // 输出用户名
echo $row[1]; // 输出姓名3.3.3 fetch_object() - 获取对象
$obj = $td->fetch_object($result);参数:
$result:结果集资源返回值:
示例:
$result = $td->query("SELECT * FROM user WHERE uid = 1");
$user = $td->fetch_object($result);
echo $user->username; // 输出用户名3.3.4 num_rows() - 获取记录数
$count = $td->num_rows($result);参数:
$result:结果集资源返回值:
示例:
$result = $td->query("SELECT * FROM user");
$count = $td->num_rows($result);
echo "共有 $count 个用户";3.3.5 free_result() - 释放结果集
$td->free_result($result);参数:
$result:结果集资源适用场景:处理大量数据时,及时释放结果集节省内存。
3.4.1 escape() - SQL转义
$safe_str = $td->escape($str);参数:
$str:需要转义的字符串返回值:
示例:
$username = $td->escape($_GET['username']);
$sql = "SELECT * FROM user WHERE username = '$username'";
$result = $td->query($sql);重要性:防止SQL注入攻击。
3.5.1 begin() - 开始事务
$td->begin();3.5.2 commit() - 提交事务
$td->commit();3.5.3 rollback() - 回滚事务
$td->rollback();事务示例:
try {
$td->begin();
// 操作1:扣减库存
$td->query("UPDATE product SET stock = stock - 1 WHERE product_id = 1");
// 操作2:添加订单
$td->query("INSERT INTO order (product_id, quantity) VALUES (1, 1)");
$td->commit();
echo _("操作成功");
} catch (Exception $e) {
$td->rollback();
echo _("操作失败") . $e->getMessage();
}事务流程图:

3.6.1 cache_get() - 获取缓存
$data = $td->cache_get($key);参数:
$key:缓存键名返回值:
3.6.2 cache_set() - 设置缓存
$td->cache_set($key, $value, $expire = 3600);参数:
$key:缓存键名$value:缓存数据$expire:过期时间(秒),默认3600秒3.6.3 cache_delete() - 删除缓存
$td->cache_delete($key);参数:
$key:缓存键名缓存示例:
$cache_key = "user_list";
$user_list = $td->cache_get($cache_key);
if (!$user_list) {
// 从数据库查询
$result = $td->query("SELECT * FROM user");
$user_list = array();
while ($row = $td->fetch_array($result)) {
$user_list[] = $row;
}
// 设置缓存,有效期1小时
$td->cache_set($cache_key, $user_list, 3600);
}
// 使用缓存数据
print_r($user_list);3.7.1 insert_id() - 获取自增ID
$td->query("INSERT INTO user (username) VALUES ('test')");
$uid = $td->insert_id();
echo "新用户ID:$uid";3.7.2 affected_rows() - 获取受影响行数
$td->query("UPDATE user SET status = 1 WHERE dept_id = 1");
$count = $td->affected_rows();
echo "更新了 $count 条记录";3.7.3 getVersion() - 获取MySQL版本
$version = $td->getVersion();
echo "MySQL版本:$version";3.7.4 close() - 关闭连接
$td->close();注意:通常不需要手动调用,PHP脚本结束时会自动关闭。



escape方法处理的字符:
原始字符 | 转义后 |
|---|---|
' | \' |
" | \" |
\ | \\ |
NULL | \0 |
\n | \n |
\r | \r |
<?php
$td = new TD();
// 查询单条记录
$sql = "SELECT * FROM user WHERE uid = 1";
$result = $td->query($sql);
$user = $td->fetch_array($result);
// 查询多条记录
$sql = "SELECT * FROM user WHERE dept_id = 10";
$result = $td->query($sql);
$users = array();
while ($row = $td->fetch_array($result)) {
$users[] = $row;
}
$td->free_result($result); // 释放结果集
?><?php
$td = new TD();
// 安全插入
$username = $td->escape($_POST['username']);
$password = md5($_POST['password']);
$name = $td->escape($_POST['name']);
$sql = "INSERT INTO user (username, password, name)
VALUES ('$username', '$password', '$name')";
if ($td->query($sql)) {
$uid = $td->insert_id();
echo "添加成功,用户ID:$uid";
} else {
echo "添加失败";
}
?><?php
$td = new TD();
$uid = intval($_POST['uid']);
$name = $td->escape($_POST['name']);
$email = $td->escape($_POST['email']);
$sql = "UPDATE user SET name = '$name', email = '$email' WHERE uid = $uid";
if ($td->query($sql)) {
$count = $td->affected_rows();
echo "更新了 $count 条记录";
} else {
echo "更新失败";
}
?><?php
$td = new TD();
$uid = intval($_GET['uid']);
$sql = "DELETE FROM user WHERE uid = $uid";
if ($td->query($sql)) {
echo "删除成功";
} else {
echo "删除失败";
}
?><?php
$td = new TD();
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$page_size = 10;
$offset = ($page - 1) * $page_size;
// 查询数据
$sql = "SELECT * FROM user ORDER BY uid DESC LIMIT $offset, $page_size";
$result = $td->query($sql);
// 查询总数
$count_sql = "SELECT COUNT(*) AS total FROM user";
$count_result = $td->query($count_sql);
$count_row = $td->fetch_array($count_result);
$total = $count_row['total'];
$total_pages = ceil($total / $page_size);
?><?php
$td = new TD();
$keyword = $td->escape($_GET['keyword']);
$dept_id = isset($_GET['dept_id']) ? intval($_GET['dept_id']) : 0;
$sql = "SELECT u.*, d.dept_name
FROM user u
LEFT JOIN dept d ON u.dept_id = d.dept_id
WHERE 1=1";
if ($keyword) {
$sql .= " AND (u.username LIKE '%$keyword%' OR u.name LIKE '%$keyword%')";
}
if ($dept_id > 0) {
$sql .= " AND u.dept_id = $dept_id";
}
$sql .= " ORDER BY u.create_time DESC";
$result = $td->query($sql);
?>现象:无法连接数据库
排查步骤:

解决方案:
db_config.php 配置是否正确现象:可能存在SQL注入漏洞
解决方案:
Mermaid 渲染失败: Parse error on line 6:
...--> C1[使用$td->escape()] C --> C2[使用i
-----------------------^
Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'安全编码规范:
$td->escape()intval() 或 floatval()现象:查询速度慢
优化方案:

优化建议:
SELECT *,只查询需要的字段LIMIT 限制返回数据量原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。