thinkphp I()方法获取不到ajax传值

把json数据post给PHP,但在PHP里面$_post获取不到,I(‘id‘)也获取不到,$_REQUEST也获取不到,可以看下ajax的contentType设置的数据类型是什么,php对对型如text/xml 或者 soap 或者 application/octet-stream 之类的内容无法解析,原来PHP默认只识别application/x-www.form-urlencoded标准的数据类型,我们只要将ajax的contentType设置成application/x-www.form-urlencoded就可以,或者使用file_get_contents("php://input")。下面我们在来看TP中的I()方法是如何做的?

function I($name,$default=‘‘,$filter=null) {
    if(strpos($name,‘.‘)) { // 指定参数来源
        //判断参数$name中是否包括.号
        list($method,$name) =   explode(‘.‘,$name,2);
        //如果包括.号将.号前后分隔,并且分别赋值给$method以及$name
    }else{ // 默认为自动判断
        //如果没有.号
        $method =   ‘param‘;
    }
    switch(strtolower($method)) {//将$method转换为小写
        //如果$method为get,则$input为$_GET
        case ‘get‘     :   $input =& $_GET;break;
        //如果$method为get,则$input为$_POST
        case ‘post‘    :   $input =& $_POST;break;
        //如果为put,则将post的原始数据转参数给$input
        case ‘put‘     :   parse_str(file_get_contents(‘php://input‘), $input);break;
        //如果是param
        case ‘param‘   :
            //判断$_SERVER[‘REQUEST_METHOD‘]
            switch($_SERVER[‘REQUEST_METHOD‘]) {
                //如果为post,则$input的内容为$_POST的内容
                case ‘POST‘:
                    $input  =  $_POST;
                    break;
                //如果为PUT.则input的内容为PUT的内容
                case ‘PUT‘:
                    parse_str(file_get_contents(‘php://input‘), $input);
                    break;
                //默认为$_GET的内容
                default:
                    $input  =  $_GET;
            }
            break;
        //如果$method为request,则$input为$_REQUEST
        case ‘request‘ :   $input =& $_REQUEST;   break;
        //如果$method为session,则$input为$_SESSION
        case ‘session‘ :   $input =& $_SESSION;   break;
        //如果$method为cookie,则$input为$_COOKIE
        case ‘cookie‘  :   $input =& $_COOKIE;    break;
        //如果$method为server,则$input为$_SERVER
        case ‘server‘  :   $input =& $_SERVER;    break;
        //如果$method为globals,则$input为$GLOBALS
        case ‘globals‘ :   $input =& $GLOBALS;    break;
        //默认返回空
        default:
            return NULL;
    }
    /**
     * 到此为止,已经根据传入的参数的需要(第一个参数.号前面的),把所有的变量都取到了。下面就是返回变量的内容了。
    **/
    //如果$name为空,也就是I()第一个参数的.号后面为空的时候
    if(empty($name)) { // 获取全部变量
        //获取到的变量$input全部复制给$data
        $data       =   $input;
        //array_walk_recursive — 对数组中的每个成员递归地应用用户函数
        //将$data的键值作为filter_exp函数的第一个参数,键名作为第二个参数
        //如果$data的键值中含有or或者exp这两个字符,自动在后面加一个空格
        array_walk_recursive($data,‘filter_exp‘);
        //判断过滤参数是否有,如果有的话,就直接使用过滤方法,如果没有的话,就使用配置中的过滤方法
        $filters    =   isset($filter)?$filter:C(‘DEFAULT_FILTER‘);
        if($filters) {
            $filters    =   explode(‘,‘,$filters);
            //将过滤参数中的每个方法都应用到$data中
            foreach($filters as $filter){
                //将$data的每个值使用$filters过滤
                $data   =   array_map_recursive($filter,$data); // 参数过滤
            }
        }
    }elseif(isset($input[$name])) { // 取值操作
        $data       =   $input[$name];
        is_array($data) && array_walk_recursive($data,‘filter_exp‘);
        $filters    =   isset($filter)?$filter:C(‘DEFAULT_FILTER‘);
        if($filters) {
            $filters    =   explode(‘,‘,$filters);
            foreach($filters as $filter){
                if(function_exists($filter)) {
                    $data   =   is_array($data)?array_map_recursive($filter,$data):$filter($data); // 参数过滤
                }else{
                    $data   =   filter_var($data,is_int($filter)?$filter:filter_id($filter));
                    if(false === $data) {
                        return   isset($default)?$default:NULL;
                    }
                }
            }
        }
    }else{ // 变量默认值
        $data       =    isset($default)?$default:NULL;
    }
    return $data;
}

  从源码中我们可以看到I方法的$method分为get、post、put、param,当ajax的contentType不是标准类型时,在我们接受值时可以写成

I(‘put.id‘)

  就可以正常接收到值了

时间: 2024-11-15 00:21:26

thinkphp I()方法获取不到ajax传值的相关文章

thinkphp I方法获取不到值、filter_var

用的TP的I方法,设置I('key','',"string") 当前台传入"<>"等html标签的时间发现,I方法获取不到值,追了下Tp的代码.I方法有段这样的代码: $data   =   filter_var($data,is_int($filter) ? $filter : filter_id($filter)); 当用string过滤的时候,相当于filter_var("<ssss>",FILTER_SANITIZ

jquery通过ajax方法获取json数据不执行success回调

问题描述:jquery通过ajax方法获取json数据不执行success回调方法 问题原因:json格式存在问题或不符合标准写法,导致总是执行error回调方法 解决方案:使json格式务必符合下述3个标准写法:      1)键名称:用双引号括起:    2)字符串:用双引号括起:    3)数字,布尔值不需要使用双引号括起 : 注意:一定是双括号!

jquery通过ajax方法获取json数据不执行success

1.jquery通过ajax方法获取json数据不执行success回调 问题描述:jquery通过ajax方法获取json数据不执行success回调方法 问题原因:json格式存在问题或不符合标准写法,导致总是执行error回调方法 解决方案:使json格式务必符合下述3个标准写法:      1)键名称:用双引号括起:    2)字符串:用双引号括起:    3)数字,布尔值不需要使用双引号括起 : 注意:一定是双括号! 2.jQuery中ajax使用json数据类型总是跳过success

web基础知识(一)关于ajax传值最基础东西

HTTP方法之 GET对比POST GET:从指定的资源请求数据, POST:向指定的资源提交要被处理的数据 GET方法: 请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的: /test/demo_form.asp?name1=value1&name2=value2 有关 GET 请求的其他一些注释: GET 请求可被缓存 GET 请求保留在浏览器历史记录中 GET 请求可被收藏为书签 GET 请求不应在处理敏感数据时使用 GET 请求有长度限制 GET 请求只应当用于取回

SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码;

情况一: ajax中传值时是乱码(后台可以获取到中文字符,但用@ResponseBody返回时前台为乱码) 情况二: Controller 中 request.getParameter()获取到的是乱码 @RequestMapping(params = "method=submit") public String submit(HttpServletRequest request, ModelMap modelMap) throws Exception{ String uname =

ajax 传值,Ajax: Asynchoronous Javascript and xml (异步的js和xml). 异步刷新,异步传递.替代表单提交数据,回调函数处理返回的数据

aspx里的代码 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="s

ThinkPHP 模型方法 getField() 和 select() 使用技巧

getField() 使用技巧 getField() 方法是 ThinkPHP 中用来获取字段值的方法,区别于 select() 和 find() 方法,通常仅用于获取个别字段的值.但是事实上并没有那么简单,该方法的用法总结如下: 获取某个字段值 这个是 getField() 方法最基本的用法,用于获取符合条件的某个字段值. // 实例化User对象 $User = M("User"); // 获取ID为3的用户的昵称 $nickname = $User->where('id=3

ThinkPHP CURD方法中field方法详解

导读:ThinkPHP CURD方法的field方法属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作. 1.用于查询在查询操作中field方法是使用最频繁的.$Model->field('id,title,content')->select(); 这里使用field方法指定了查询的结果集中包含id,title,content三个字段的值.执行的SQL相当于:SELECT id,title,content FROM table 当然,除了select方法之外

ThinkPHP快捷方法汇总(随时添加)

读取配置 C('参数名称') 例如,读取当前的URL模式配置参数: $model = C('URL_MODEL'); // 由于配置参数不区分大小写,因此下面的写法是等效的 // $model = C('url_model'); C方法也可以用于读取二维配置: //获取用户配置中的用户类型设置 C('USER_CONFIG.USER_TYPE'); 因为配置参数是全局有效的,因此C方法可以在任何地方读取任何配置,即使某个设置参数已经生效过期了. 动态配置 设置格式:C('参数名称','新的参数值