通达OA核心类库TD类深度解析
一、引言TD类是通达OA提供的核心数据库操作类封装了MySQL数据库的常用操作提供了安全、便捷的数据库访问接口。本文将深入解析TD类的设计原理、成员方法和使用技巧帮助您高效地进行数据库操作。二、TD类概述2.1 TD类定位TD类位于MYOA\webroot\inc\td.class.php是OA数据库操作的核心类。2.2 TD类特点特点说明安全防护自动进行SQL注入防护连接管理自动处理数据库连接和断开简化操作封装常用数据库操作方法事务支持支持事务处理缓存集成与Redis缓存无缝集成2.3 TD类加载方式// 方式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类成员方法详解3.1 构造方法$td new TD();功能读取数据库配置db_config.php建立数据库连接选择默认数据库TD_OA3.2 SQL执行方法3.2.1 query() - 执行SQL语句$result $td-query($sql);参数$sqlSQL语句字符串返回值成功返回结果集资源失败返回false示例// 查询 $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);参数$sqlSQL语句字符串返回值成功返回true失败返回false适用场景执行不需要返回结果的SQL语句如INSERT、UPDATE、DELETE。3.3 结果集处理方法3.3.1 fetch_array() - 获取关联数组$row $td-fetch_array($result);参数$result结果集资源返回值成功返回关联数组失败返回false示例$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结果集资源返回值成功返回索引数组失败返回false示例$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结果集资源返回值成功返回对象失败返回false示例$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 安全方法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 事务处理方法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 缓存方法3.6.1 cache_get() - 获取缓存$data $td-cache_get($key);参数$key缓存键名返回值缓存数据或false3.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 其他方法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脚本结束时会自动关闭。四、TD类设计原理4.1 类结构4.2 连接管理机制4.3 SQL注入防护机制escape方法处理的字符原始字符转义后\\\\\NULL\0\n\n\r\r五、TD类使用最佳实践5.1 查询数据?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); // 释放结果集 ?5.2 插入数据?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 添加失败; } ?5.3 更新数据?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 更新失败; } ?5.4 删除数据?php $td new TD(); $uid intval($_GET[uid]); $sql DELETE FROM user WHERE uid $uid; if ($td-query($sql)) { echo 删除成功; } else { echo 删除失败; } ?5.5 分页查询?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); ?5.6 复杂查询?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 11; 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); ?六、常见问题与解决方案6.1 连接失败现象无法连接数据库排查步骤解决方案检查db_config.php配置是否正确确认MySQL服务已启动验证端口号默认3336检查防火墙设置6.2 SQL注入风险现象可能存在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()不要直接拼接用户输入到SQL语句6.3 性能问题现象查询速度慢优化方案优化建议为经常查询的字段添加索引避免使用SELECT *只查询需要的字段使用LIMIT限制返回数据量使用缓存减少数据库查询