代码之家  ›  专栏  ›  技术社区  ›  Brandon Frohbieter

来自外部源的变量名中的点和空格转换为下划线

  •  2
  • Brandon Frohbieter  · 技术社区  · 14 年前

    尝试一下Ajax,我发现我的大部分数据都充满了下划线! 文档确认这是按预期工作的。有没有完整地将表单信息传递给PHP的方法?我正在使用代码点火器,所以我的通行证看起来像/controller/function/variable, 接收控制器:

    controller{
     function($v=0){#what once was hello world is now hello_world...}
    }
    

    我不能很好地执行撤消操作,数据可能包含下划线。

    谢谢, 布兰登

    编辑:

    我认为这是在转换价值。代码要点如下:

    <form>
    <text input name="tbox"/>
    <submit/>
    </form>
    
     ajax_handler(
        v = form.name() + form.val()
        do_ajax('/controller/function/v')
     )
    
    controller(){
       function($v=0){#spaces and periods in v are converted to underscore}
    } 
    

    再次感谢 布兰登

    这是实际代码:

    <input type="text" id="tusername" name="tusername" class="checkable tbox"/>
    <button id="unsubmit" name="wizard" class="formable">next</button>
    
    
            $('.formable').live('click',function(event){
                event.preventDefault();
                var n = $(this).attr('id');
                var a = $(this).attr('name');
                var v = dosend(); 
                $.ajax({
                        url: '/form/'+n+'/'+v,
                        type: 'post',
                        success: function(result){
                             alert(result);
                        }  
                });
                function dosend(){
                        var inputs = $(":input");
                        var s = "";
                        inputs.each(function(){
                                s += $(this).attr('name')+":";
                                s += $(this).val()+";";
                        });
                        return s;
                }
        });
    
       class Form extends Controller{
           function Form(){
               parent::Controller();
               session_start();
           }
           function unsubmit($v=6){
               print $v;
           }
       }
    

    字符串中传递给控制器函数的任何空格或句点都将转换为下划线。我在这个盒子里输入hello world,它就会打印出hello world。

                $w = explode(';',$v);
                foreach($w as $i){
                        $x = explode(':',$i);
                        if(isset($x[1])){
                          $_AJAX[$x[0]] = $x[1];
                        }
                }
    
    4 回复  |  直到 14 年前
        1
  •  0
  •   Community Michael Schmitz    7 年前

    如果你需要保存它们,考虑把它们当作别的东西发送 application/x-www-form-urlencoded multipart/form-data . 例如,这个优秀的提问者试图使用JSON,您可以随意解析它: handle json request in PHP

    JSON更容易解析。但是,您可以使用 应用程序/X-WWW-FORM-URLENCODED 表单(不处理文件上载), file_get_contents('php://input') ,并根据自己的喜好分析字符串。

    有了一个又脏又脏的黑客,上周我很高兴听到这个消息 多部分/表单数据 : Get raw post data


    错过了“'m just using post,separating keys and values with':'and pairs with';'”,非常明显:

            $.ajax({
                    url: '/form/'+n+'/'+v,
                    type: 'post',
                    contentType: 'text/plain', //<-- add this
    

    可能通过以下方式进行分析:

        <?php
        $post = file_get_contents('php://input');
        $pairs = explode(':',$post);
        $values = array();
        foreach($pairs as $pair){
             $vars = explode(':',$pair,2);
             $values[$vars[0]] = $vars[1];
        }
        ?>
    
        2
  •  1
  •   Brandon Frohbieter    14 年前

    发现在 http://sholsinger.com/archive/2009/04/passing-email-addresses-in-urls-with-codeigniter/ ,现在解决。

    在特定条件下,通过uri段传递的值中的句点可以不正确地转换为下划线。为了实现这一点,必须使用mod_rewrite,并且rewriterule指令通过查询字符串传递重写的段。例子:

    RewriteRule ^(.*)$ /index.php?/$1 [L]
    

    要解决此问题,必须编辑配置值uri_协议。默认值为“auto”。必须将其设置为“查询字符串”。例子:

    $config['uri_protocol'] = 'QUERY_STRING';
    
        3
  •  0
  •   Your Common Sense    14 年前

    PHP不转换数据,只转换变量名。
    您确定不能更改字段名吗?

        4
  •  0
  •   Powerlord    14 年前

    据我所知,没有。

    如您所说,PHP正在重命名变量,如 Variables From External Sources PHP手册页:

    注:变量中的点和空格 名称转换为下划线。 例如<input name=“a.b”/> 变为$_请求[“a_b”]。

    不过,我不知道为什么会有什么不同。存储在该变量中的数据保持不变。