記一次使用thinkphp的小bug的解決方案

這次錯誤出現在我post數據到某個action裏。
報錯內容如下:

非法操作:
錯誤位置 FILE: C:\inetpub\yinjinew\ThinkPHP\Library\Think\Controller.class.php  LINE: 170- 
TRACE
0 C:\inetpub\yinjinew\ThinkPHP\Library\Think\Controller.class.php(170): E('\xE9\x9D\x9E\xE6\xB3\x95\xE6\x93\x8D\xE4\xBD\x9C:\t\t...')
1 [internal function]: Think\Controller->__call('\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t...', '')
2 C:\inetpub\yinjinew\ThinkPHP\Library\Think\App.class.php(114): ReflectionMethod->invokeArgs(Object(Admin\Controller\SourceController), Array)
3 C:\inetpub\yinjinew\ThinkPHP\Library\Think\App.class.php(204): Think\App::exec()
4 C:\inetpub\yinjinew\ThinkPHP\Library\Think\Think.class.php(120): Think\App::run()
5 C:\inetpub\yinjinew\ThinkPHP\ThinkPHP.php(97): Think\Think::start()
6 C:\inetpub\yinjinew\index.php(24): require('C:\\inetpub\\yinj...')
7 {main}

這個錯誤看起來貌似是沒寫對方法名,不過我的鏈接直接訪問是沒有問題的,只有在保存(POST)的時候會出現錯誤。
逐步排查
1. 用echo輸出在控制器裏面沒有效果
2. 根據錯誤棧頂到棧底排查,排查到App.class.php(204)時發現ACTION_NAME是空的
3. 我找到了ACTION_NAME的定義位置,在/ThinkPHP/Library/Think/Dispatcher.class.php:Line_240這裏

 define('ACTION_NAME',       defined('BIND_ACTION')? BIND_ACTION : self::getAction($varAction,$urlCase));
  1. 查看了getAction方法發現
$action   = !empty($_POST[$var]) ?
            $_POST[$var] :
            (!empty($_GET[$var])?$_GET[$var]:C('DEFAULT_ACTION'));
  1. 由此我大概明白錯誤原因了,這個語句應該是thinkphp給沒有url重寫的服務器留的適配,這個action參數名字和我POST內容的選項a的name衝突了。
    找到問題了解決就很容易了,去Conf裏面把VAR_ACTION改個值不是’a’就行了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章