sqlite-web 0.7.2
gitea.db
issue
Create
Query
access
access_token
action
action_artifact
action_run
action_run_index
action_run_job
action_runner
action_runner_token
action_schedule
action_schedule_spec
action_task
action_task_output
action_task_step
action_tasks_version
action_variable
app_state
attachment
auth_token
badge
branch
collaboration
comment
commit_status
commit_status_index
commit_status_summary
commit_sync_log
commit_sync_status
dbfs_data
dbfs_meta
deploy_key
email_address
email_hash
external_login_user
follow
gpg_key
gpg_key_import
hook_task
issue
issue_assignees
issue_content_history
issue_dependency
issue_index
issue_label
issue_pin
issue_user
issue_watch
label
language_stat
lfs_lock
lfs_meta_object
login_source
milestone
mirror
notice
notification
oauth2_application
oauth2_authorization_code
oauth2_grant
org_user
package
package_blob
package_blob_upload
package_cleanup_rule
package_file
package_property
package_version
project
project_board
project_issue
protected_branch
protected_tag
public_key
pull_auto_merge
pull_request
push_mirror
reaction
release
renamed_branch
repo_archiver
repo_hidden_file
repo_indexer_status
repo_license
repo_redirect
repo_topic
repo_transfer
repo_unit
repository
review
review_state
secret
session
sqlite_sequence
star
stopwatch
system_setting
task
team
team_invite
team_repo
team_unit
team_user
topic
tracked_time
two_factor
upload
user
user_badge
user_blocking
user_open_id
user_redirect
user_setting
version
watch
webauthn_credential
webhook
Toggle helper tables
Structure
Content
Query
Insert
Drop
Import
Export
Update row 395 in issue
id
Primary key.
INTEGER NOT NULL
repo_id
INTEGER
index
INTEGER
poster_id
INTEGER
original_author
TEXT
original_author_id
INTEGER
name
🔍 代码审查报告:pc-260616 - 需求 停用报表 16438
TEXT
content
## 自动代码审查报告 **分支**: pc-260616 **提交**: `8e0c2bd311af349b3bb4ddb6b91fd542e33d5981` **提交人**: chenjunfeng (developer.jeff.c@gmail.com) **时间**: 2026-05-28 13:18:27 --- ## 1. 审查摘要 - **代码质量评分**:5.5 / 10 分 - **总体评价**:代码实现了丰富的报表查询与导出功能,业务逻辑基本完整。但整体呈现“脚本化”开发特征,大量重复代码、直接操作超全局变量、粗放式内存管理及事务控制缺陷较为突出。未充分利用现代 PHP 特性与框架生命周期,可维护性与扩展性较弱。 - **风险等级**:🔴 高(存在事务中断隐患、内存溢出风险及输入过滤绕过问题) > 📌 **框架说明**:代码结构、加载方式(`$this->load->model()`、`BASEPATH`、`$this->db`)高度符合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,请结合其官方文档对路由、输入过滤及响应机制进行适配调整。以下建议基于 CI3 及 PHP 最佳实践。 ## 2. 问题详情 | 严重程度 | 文件/位置 | 问题描述 | 建议修改方案 | 代码示例 (可选) | | :--- | :--- | :--- | :--- | :--- | | 🔴 严重 | `TimedTask.php`<br>`mUpStockByOrder()` / `mUpStockByOrderTest()` | **事务控制断裂**:在 `try` 块中使用 `break` 跳出循环时,未执行 `$this->db->trans_rollback()` 或 `trans_complete()`,导致数据库事务长期挂起或数据不一致。 | 在 `break` 前显式回滚事务,或重构循环逻辑,将事务提交/回滚移至循环外统一处理。 | ```php<br>if (!$success) {<br> $this->db->trans_rollback();<br> $redis->rPush($redis_key["re_goods_order_list"], $ba_order_id);<br> break;<br>}<br>``` | | 🔴 严重 | `FinanceReport2.php`<br>所有 `*Export()` 方法 | **内存溢出 (OOM) 风险**:使用 `ini_set("memory_limit", "500M")` 并全量加载 `$result['data']` 到内存。当数据量超 10 万行时,极易触发 PHP Fatal Error 或拖垮服务器。 | 1. 移除 `ini_set`,改用**游标查询/分批拉取**(如 `LIMIT/OFFSET` 或生成器)。<br>2. 导出逻辑应交由异步队列(如 Redis Queue + Worker)处理。 | ```php<br>// 推荐:分批处理<br>$offset = 0; $limit = 2000;<br>do {<br> $batch = $model->get_data($merchant_id, $param, $offset, $limit);<br> $this->Export_model->appendRows($batch);<br> $offset += $limit;<br>} while (count($batch) === $limit);<br>``` | | 🟠 警告 | `FinanceReport2.php` & `TimedTask.php`<br>全局 | **绕过框架输入过滤 & 破坏生命周期**:直接使用 `$_GET` 而非框架输入类;频繁使用 `exit()` 中断响应,导致 CI 的 Hook、Profiler、输出缓冲失效。 | 1. 统一使用 `$this->input->get(null, true)` 获取并过滤输入。<br>2. 使用框架响应方法或 `return` 替代 `exit()`。 | ```php<br>// 替换 $_GET<br>$params = $this->input->get(null, true);<br><br>// 替换 exit()<br>$this->output->set_content_type('application/json')<br> ->set_output(json_encode(['code' => 0, 'msg' => 'OK']));<br>return;<br>``` | | 🟠 警告 | `FinanceReport2.php`<br>顶部 `include` 语句 | **控制器继承方式不规范**:使用 `include FCPATH...` 引入父控制器,在自动加载环境下易引发 `Cannot redeclare class` 致命错误。 | 使用 `require_once APPPATH.'controllers/FinanceReport.php';` 或依赖 Composer/CI 自动加载机制。 | ```php<br>require_once APPPATH . 'controllers/FinanceReport.php';<br>``` | | 🟠 警告 | `TimedTask.php`<br>`sendVipBirthdayMsg()` | **数组函数误用导致数据结构异常**:`array_merge_recursive` 合并用户 ID 数组会产生嵌套数组,后续 `array_unique` 无法正确去重,导致重复查询或推送。 | 使用 `array_merge` 配合 `array_unique`,或直接维护一个关联数组键值去重。 | ```php<br>$u_data = array_unique(array_merge($u_data, $user_data));<br>``` | | 🟠 警告 | `TimedTask.php`<br>`platformMatchReu()` / `awardKtvContest()` | **原始 SQL 拼接隐患**:`WHERE _match_id=" . $v['_id'] . "` 直接拼接变量。虽 `$v['_id']` 来自数据库,但缺乏类型强转,违反安全编码规范。 | 使用查询构造器或参数绑定,并强制类型转换。 | ```php<br>$match_id = (int)$v['_id'];<br>$sql = "UPDATE ... WHERE _match_id = ?";<br>$this->db->query($sql, [$match_id]);<br>``` | | 🟡 建议 | `FinanceReport2.php`<br>所有导出方法 | **严重违反 DRY 原则**:10+ 个导出方法结构高度一致(字段映射、表头组装、Excel/PDF 分支、设置保存)。 | 抽取**模板方法模式**:在父类或 Helper 中封装 `BaseExportController::handleExport()`,子类仅需传入 `$columnArr` 和 `$dataFetcher`。 | *(架构级重构,见第3节)* | | 🟡 建议 | `FinanceReport2.php`<br>`managerDiscountExport()` 等 | **直接修改超全局变量**:`$_GET['admin_id'] = $this->admin_id;` 污染全局状态,影响后续中间件或日志记录。 | 使用局部变量 `$params` 接收并扩展参数,保持 `$_GET` 纯净。 | ```php<br>$params = $this->input->get(null, true);<br>$params['admin_id'] = $this->admin_id;<br>$params['admin_name'] = $this->admin_name;<br>``` | | 🟡 建议 | `TimedTask.php`<br>`releaseRewardFrozen()` | **魔法数字**:`$time = time() - 610;` 中的 `610` 无业务含义注释,降低可读性。 | 提取为类常量并添加注释说明业务背景。 | ```php<br>const FROZEN_EXPIRE_SECONDS = 610; // 业务规定:冻结10分钟+10秒缓冲<br>$time = time() - self::FROZEN_EXPIRE_SECONDS;<br>``` | ## 3. 总结与行动建议 ### 🚨 优先修复的关键问题 1. **修复事务断裂逻辑**:`mUpStockByOrder` 中的 `break` 必须配套 `trans_rollback()`,否则在高并发或异常场景下会导致数据库锁表或脏数据。 2. **重构导出内存模型**:立即移除 `ini_set("memory_limit", "500M")`,将全量查询改为**分批游标查询**或**流式写入**。对于超大数据量,务必迁移至异步任务队列(如 `php-resque` / `RabbitMQ` / `Supervisor` 守护进程)。 3. **统一输入与响应规范**:全局替换 `$_GET` 为 `$this->input->get()`,移除所有 `exit()`,改用框架标准响应输出,确保日志、性能分析、Hook 正常执行。 ### 🛠 后续重构与优化方向 1. **架构模式升级(模板方法/策略模式)**: 当前报表导出代码重复率 > 80%。建议抽象一个 `ReportExportService` 或基类控制器: ```php abstract class BaseReportExportController extends CI_Controller { abstract protected function getColumns(): array; abstract protected function fetchData(array $params): array; public function executeExport() { $params = $this->input->get(null, true); $columns = $this->getColumns(); $data = $this->fetchData($params); // 统一处理表头、分页、Excel/PDF 分支、设置保存 $this->Export_model->generate($columns, $data, $params); } } ``` 2. **模型加载优化**:将 `$this->load->model()` 从方法内移至 `__construct()`,或使用 CI 的 `autoload.php` 预加载高频模型,减少 I/O 开销。 3. **安全与类型强化**: - 开启 `php.ini` 的 `display_errors = Off` 与 `log_errors = On`。 - 对 `json_decode($_GET['export_fields'])` 增加 `JSON_ERROR_NONE` 校验,防止非法 JSON 导致解析失败。 - 逐步引入 PHP 7+ 类型声明(`declare(strict_types=1);`、参数类型、返回类型),提升代码健壮性。 4. **定时任务规范化**:`TimedTask.php` 承担了过多职责。建议按业务域拆分为独立脚本(如 `DepositExpireTask.php`, `StockSyncTask.php`),并通过 `crontab` 或调度中心独立管理,避免单文件臃肿与状态干扰。 > 💡 **局限性说明**:本次审查基于提供的控制器片段。部分逻辑(如 `get_page_suit()`、`_export_check_time()`、各 Model 内部实现)未提供源码,若其中存在未过滤的 `ORDER BY` 拼接或全表扫描,可能进一步放大性能与安全风险。建议结合完整调用链进行二次审查。 --- *此 Issue 由代码审查服务自动创建*
TEXT
milestone_id
INTEGER
priority
INTEGER
is_closed
INTEGER
is_pull
INTEGER
num_comments
INTEGER
ref
TEXT
deadline_unix
INTEGER
created_unix
INTEGER
updated_unix
INTEGER
closed_unix
INTEGER
is_locked
INTEGER NOT NULL (default 0
content_version
INTEGER NOT NULL (default 0
time_estimate
INTEGER NOT NULL (default 0
Update
Cancel