Точки и пробелы в именах переменных из внешних источников преобразуются в подчеркивания - PullRequest
2 голосов
/ 17 июня 2010

Попробую немного AJAX, и я обнаружил, что большая часть моих данных завалена подчеркиванием!Документация подтверждает, что это работает как задумано.Любой способ передать информацию о моей форме в PHP без изменений?Я использую CodeIgniter, поэтому мой проход выглядит как / 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}
} 

еще раз спасибо, brandon

вот фактический код:

<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 ]

1 голос
/ 18 июня 2010

Обнаружено упоминание об этом в http://sholsinger.com/archive/2009/04/passing-email-addresses-in-urls-with-codeigniter/, и теперь разрешено.

Периоды в значениях, которые передаются через сегмент URI, могут быть неправильно преобразованы в подчеркивания при определенных условиях. Чтобы это произошло, вы должны использовать mod_rewrite, а ваша директива RewriteRule пропускает переписанные сегменты через строку запроса. Пример:

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

Чтобы устранить проблему, вы должны отредактировать значение конфигурации uri_protocol. Значением по умолчанию является «АВТО». Должно быть установлено значение «QUERY_STRING». Пример:

$config['uri_protocol'] = 'QUERY_STRING';
0 голосов
/ 17 июня 2010

Насколько я знаю, нет.

Как вы сказали, PHP переименовывает переменные, как описано в Переменные из внешних источников Страница руководства PHP:

Примечание: точки и пробелы в переменной имена преобразуются в подчеркивания. Например, становится $ _REQUEST ["a_b"].

Я не уверен, почему это будет иметь значение, хотя. Данные, хранящиеся в этой переменной, остаются без изменений.

0 голосов
/ 18 июня 2010

Если вы хотите, чтобы они были сохранены, рассматривая отправку как что-то еще, тогда application/x-www-form-urlencoded или multipart/form-data. Например, этот хороший вопросник пытался использовать JSON, который вы можете анализировать на досуге: обрабатывать запрос json в PHP

JSON будет проще разобрать. Однако вы можете использовать форму application/x-www-form-urlencoded (которая не будет обрабатывать загрузку файлов), file_get_contents('php://input') и анализировать строку по своему вкусу.

С грязным, грязным хаком я был рад сообщить, что только на прошлой неделе это также может работать для multipart/form-data: Получить необработанные данные постов


Пропустил "я просто использую post, разделяя ключи и значения с помощью ':" и пары с ";" "очевидно:

        $.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];
    }
    ?>
0 голосов
/ 17 июня 2010

Php не преобразует данные, кроме имен переменных.
Вы уверены, что не можете изменить имя поля?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...