Commit 2f571548 authored by Nemo Ma's avatar Nemo Ma

cleanup

parent 1f46a556
# 种火功能调试排查记录
时间:2024-12-20
## 问题描述
用户反馈种火部署和强化功能虽然显示"命令已执行",但实际逻辑没有被执行。控制台中没有明显错误。
## 问题分析
经过代码审查,发现可能的问题点:
1. **参数传递问题**:前端JavaScript正确传递了参数,但可能在PHP端没有正确接收
2. **函数调用问题**:函数可能被调用但没有正确执行
3. **全局变量访问问题**:函数内部可能无法访问必要的全局变量
## 调试措施
### 1. 添加POST数据调试
在 `command.php` 第60行启用了 `var_dump($_POST);` 来查看POST数据是否正确传递。
### 2. 添加详细调试信息
在种火部署和强化命令中添加了详细的调试输出:
#### 种火部署命令(第395-409行)
- 显示命令开始执行
- 显示接收到的参数值
- 显示函数返回值
#### 种火强化命令(第448-459行)
- 显示命令开始执行
- 显示接收到的参数值
- 显示函数返回值
### 3. 修复全局变量访问
在 `include/game/club22.func.php` 中:
- `FireseedDeploy` 函数添加了 `$pid` 全局变量声明(第113行)
- `FireseedEnhance` 函数添加了 `$pid` 全局变量声明(第411行)
## 预期调试结果
通过这些调试信息,我们应该能够看到:
1. POST数据是否正确传递
2. 参数是否正确接收
3. 函数是否被调用
4. 函数是否正确执行并返回结果
## 下一步行动
1. 让用户测试种火部署和强化功能
2. 查看控制台和命令窗口中的调试信息
3. 根据调试信息确定具体问题所在
4. 针对性修复问题
## 修改文件列表
- `command.php`:添加调试信息和POST数据输出
- `include/game/club22.func.php`:修复全局变量访问问题
## 注意事项
调试完成后需要移除或注释掉调试输出,避免影响正常游戏体验。
# 枫火歌者种火强化功能修复记录
时间:2024-12-20
## 问题描述
枫火歌者使用焰火道具对种火进行强化时,提示操作失败,控制台显示以下错误:
- command.php 返回 500 状态码(内部服务器错误)
- JSON 序列化相关错误
- 跳过无效种火数据的提示
## 问题分析
通过分析代码和错误信息,发现以下问题:
1. **配置文件未加载**:FireseedEnhance 函数中使用了 $fireseed_enhance_multipliers 变量,但该变量定义在 club22cfg.php 配置文件中,而函数没有加载该配置文件。
2. **数据库更新不完整**:函数只更新了 clbpara 字段,但没有同时更新玩家的物品数据(itm1-6, itmk1-6, itms1-6 等字段)。
3. **错误处理不足**:缺少对 JSON 编码失败、数据库操作失败等情况的处理。
4. **数据验证不充分**:没有检查物品数量是否足够,没有处理种火 level 字段不存在的情况。
5. **除零风险**:在计算属性倍率时可能出现除零错误。
## 修复方案
### 1. 加载配置文件
在 FireseedEnhance 函数开始处添加:
```php
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
```
### 2. 完善数据验证
- 检查物品数量是否足够
- 检查种火 level 字段是否存在,不存在则初始化为 1
- 避免除零错误
### 3. 完整的数据库更新
同时更新 clbpara 和物品相关字段:
```php
$update_query = "UPDATE {$tablepre}players SET
clbpara='$encoded_clbpara',
$item_var='" . addslashes($$item_var) . "',
$itemk_var='" . addslashes($$itemk_var) . "',
$itemsk_var='" . addslashes($$itemsk_var) . "',
$iteme_var='" . intval($$iteme_var) . "',
$items_var='" . intval($$items_var) . "'
WHERE pid='$pid'";
```
### 4. 增强错误处理
- 检查 JSON 编码是否成功
- 检查数据库操作是否成功
- 提供更详细的错误信息
### 5. 数据类型处理
将计算结果转换为整数,避免浮点数精度问题:
```php
$clbpara['fireseed'][$fireseed_id]['hp'] = intval($clbpara['fireseed'][$fireseed_id]['hp'] * $ratio);
```
## 修复结果
修复后的 FireseedEnhance 函数具有以下改进:
1. 正确加载配置文件
2. 完整的数据验证和错误处理
3. 同时更新 clbpara 和物品数据
4. 防止 SQL 注入和数据类型错误
5. 提供详细的错误信息和调试支持
## 额外修复
### 1. 其他函数的配置文件加载问题
发现 FireseedDeploy、FireseedSearch、FireseedDrainNPC、FireseedBuffBonus 等函数也使用了配置文件中的变量,但没有加载配置文件。已在这些函数中添加配置文件加载:
```php
// 加载配置文件
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
```
### 2. JSON 编码错误处理
在 command.php 中添加了 JSON 编码失败的错误处理,当 JSON 编码失败时会:
- 记录错误日志
- 返回简化的错误响应而不是导致 500 错误
- 提供用户友好的错误信息
### 3. compatible_json_encode 函数优化
修复了 compatible_json_encode 函数,确保正确处理中文字符:
- 在 PHP 5.4+ 版本中使用 JSON_UNESCAPED_UNICODE 标志
- 避免中文字符被错误编码导致的问题
### 4. 数据库连接检查
根据服务器错误日志显示的 "Call to a member function query() on null" 错误,在所有使用数据库的函数中添加了数据库连接检查:
- FireseedRecruit 函数
- FireseedDeploy 函数
- FireseedSearch 函数
- FireseedDrainNPC 函数
- FireseedEnhance 函数
- FireseedFollow 函数
每个函数都会在使用 $db 对象前检查其是否有效,如果无效则返回错误信息。
### 5. 变量作用域修复
根据服务器错误日志 "Call to a member function query() on null",发现问题是变量作用域导致的。
修复了 FireseedEnhance 函数的变量声明:
- 直接使用 global 声明所有需要的变量,而不是通过 extract() 函数
- 确保 $db、$pid、$clbpara 和所有物品变量都能正确访问
- 移除了可能导致变量作用域混乱的 $pdata 和 extract() 调用
## 测试建议
1. 测试正常的种火强化流程
2. 测试物品数量不足的情况
3. 测试使用非焰火物品的情况
4. 测试种火不存在的情况
5. 验证数据库数据是否正确更新
6. 测试种火部署功能是否正常
7. 测试种火探物和索敌功能
8. 验证种火跟随加成是否正确计算
# 种火功能变量作用域修复记录
时间:2024-12-20
## 问题描述
在修复了数据库连接问题后,玩家反馈种火操作无法生效:
- 操作显示成功,但侧边栏信息没有更新
- 刷新页面也无法解决问题
- 种火强化功能遇到相同问题
## 问题分析
经过分析发现,问题出现在我之前的修复中:
### 原始问题
- 服务器错误日志显示 "Call to a member function query() on null"
- 这是因为 $db 对象在函数作用域中为 null
### 错误的修复方案
我之前尝试通过直接使用 global 声明所有变量来解决:
```php
function FireseedEnhance($fireseed_id, $item_index) {
global $log, $db, $tablepre, $pid, $clbpara;
global $itm1, $itm2, $itm3, $itm4, $itm5, $itm6;
// ... 更多变量
}
```
### 问题根源
这种方法的问题是:
1. **变量作用域隔离**:函数内对全局变量的修改不会自动同步回主作用域
2. **引用丢失**:直接使用 global 声明的变量不是引用,修改不会影响原始变量
3. **数据不一致**:数据库更新成功,但内存中的变量状态没有更新
## 正确的修复方案
### 1. 恢复引用传递机制
恢复使用 `extract($data, EXTR_REFS)` 来获取变量引用:
```php
function FireseedEnhance($fireseed_id, $item_index) {
global $log, $db, $tablepre;
if(!isset($data)) {
global $pdata;
$data = &$pdata;
}
extract($data, EXTR_REFS);
}
```
### 2. 保留数据库连接检查
保留数据库连接的有效性检查,但简化逻辑:
```php
// 检查数据库连接是否有效
if(!$db) {
$log .= "<span class='red'>数据库连接错误!</span><br>";
return false;
}
```
### 3. 保留配置文件加载
确保配置文件在函数中正确加载:
```php
// 加载配置文件
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
```
## 修复的函数
以下函数已恢复正确的变量作用域处理:
1. FireseedEnhance - 种火强化功能
2. FireseedDeploy - 种火部署功能
3. FireseedSearch - 种火探物功能
4. FireseedDrainNPC - 种火索敌功能
5. FireseedFollow - 种火跟随功能
## 技术要点
### EXTR_REFS 的重要性
`extract($data, EXTR_REFS)` 中的 `EXTR_REFS` 标志确保:
- 提取的变量是原始数组元素的引用
- 对提取变量的修改会直接影响原始数组
- 这样函数内的修改能够同步回主作用域
### 变量同步机制
1. command.php 通过 `fetch_playerdata_by_name()` 获取 `$pdata`
2. 通过 `extract($pdata, EXTR_REFS)` 将数据提取为引用变量
3. 函数内通过相同机制获取相同的引用
4. 函数内的修改通过引用同步回主作用域
5. 侧边栏显示的数据来自主作用域,因此能正确反映修改
## 测试验证
修复后需要验证:
1. 种火强化功能是否正常工作
2. 侧边栏信息是否正确更新
3. 种火部署状态是否正确显示
4. 数据库数据与内存数据是否一致
5. 页面刷新后数据是否保持正确
## 经验教训
1. **不要破坏现有的工作机制**:如果某个功能之前工作正常,修复时应该保持其核心机制
2. **理解变量作用域**:PHP 中的 global 声明和引用传递有本质区别
3. **测试完整流程**:不仅要测试功能执行,还要测试数据同步和显示更新
4. **保持数据一致性**:确保数据库、内存和显示三者的一致性
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment