记一次使用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’就行了
发布了11 篇原创文章 · 获赞 13 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/similing/article/details/80189480