Использование AJAX для отправки данных в функцию контроллера Coder Igniter приводит к внутренней ошибке сервера 500.

Я пытаюсь использовать AJAX для отправки данных из представления Code Igniter на контроллер, который будет обрабатывать данные по мере необходимости. Я собираю данные с помощью плагина JQuery (Handsontable), и когда пользователь нажимает кнопку «Сохранить», он извлекает необходимые данные из таблицы и выполняет функцию ajax.

$.ajax({
    url: "/survey/save",
    data: {"data": data},
    type: "POST",
});

Я могу отправить его в обычный файл .php, который собирает данные с помощью $_POST, но не моего контроллера.

public function save() {
    $data = $this->input->post('data');

    $myFile = "testFile.txt";
    $fh = fopen($myFile, 'w') or die("can't open file");    

    for ($i = 0, $size = count($data); $i < $size; ++$i) {
        fwrite($fh, $data[$i][0]."\t".$data[$i][1]."\t".$data[$i][2]."\n");
    }
    fclose($fh);
}

Приведенный выше код - это не то, что я действительно хочу, чтобы контроллер делал, но если я смогу успешно выполнить этот код, я смогу делать то, что хочу.

У меня есть ощущение, что это как-то связано с URL-адресом функции ajax, но я очень новичок во всех этих языках и, вероятно, упускаю из виду что-то простое. Пожалуйста, дайте мне знать, если я должен включить какой-либо другой код!


person jlrosenberg    schedule 17.07.2013    source источник


Ответы (4)


Эй, вы должны изменить ajax url. Формат URL-адреса должен быть абсолютный путь, например.

По вашему представлению, ajax должен быть таким

$.ajax({
        url:'<?php echo site_url('survey/save'); ?>',
        type: 'post',
        data:  "data="+data,
        beforeSend:function(){
                //before send code for e.g. put a loader
        },
        success:function(result){ 
            // success result code goes here
        },
        error:function(jqXHR, status, error){
            if(status!='error')
                alert(error);   
        }
    });

Теперь в вашем контроллере вы можете получить данные

$data=$this->input->post('data');

и еще одна вещь, которую вы должны использовать относительный путь, когда вы используете fopen, например.

// вы использовали

$myFile = "testFile.txt";

//instead of that you have to use

$myFile="./YOUR_FOLDER_NAME/YOUR_FILE_NAME";

и вы можете установить в своем config.php

$config['base_url'] = '';
person Raj Jagani    schedule 18.07.2013
comment
Я внес изменения, которые вы предложили, но я все еще получаю внутреннюю ошибку сервера. Через консоль я могу просмотреть страницу опроса/сохранения, и она выдает мне ошибку через Code Igniter. Произошла ошибка. Запрошенное вами действие не разрешено. - person jlrosenberg; 18.07.2013
comment
Догадаться. Было связано с моими настройками csrf. - person jlrosenberg; 18.07.2013

Отвечая на мой собственный вопрос, если это поможет другим. Проблема заключалась в моих настройках csrf. Я понял, что отключение защиты csrf решило проблему, но я не хотел отключать защиту csrf. Я думаю, что CI, возможно, выпустила белый список, чтобы исправить это, но я только что отредактировал свой файл конфигурации следующим образом:

if(stripos($_SERVER["REQUEST_URI"],'/survey') === FALSE)
{
    $config['csrf_protection'] = TRUE;
}
else
{
    $config['csrf_protection'] = FALSE;
} 
person jlrosenberg    schedule 18.07.2013

Если вы сделали свой файл конфигурации в папке CI Application/Config

$config['base_url'] = 'http://yourwebsite.com/';

то для вашего URL это

"<?php echo base_url();?>survey/save", 
person Chitowns24    schedule 17.07.2013

Очень простой и легкий способ попробовать этот код:

сначала вы должны установить свой base_url в application/confiq.php или с помощью .htaccess

ваш сценарий:

<script type='text/javascript'>
var base_url = '<?=base_url()?>';

function m_ajax()
{
   var ids = $("#all_users").val();

   $.ajax({
      type:"POST",
      url: base_url+"history/home/get_users",
      data: "userid=" + ids,
      success: function(result){
        $("#m_ajax").html(result);
    }
    });

}
</script>

в вашем контроллере вы можете получить значение идентификатора пользователя как сообщение

 $userid = $this->input->post('userid');

и вы можете выполнять другие операции в соответствии с.

person MJ X    schedule 18.07.2013