2016-09-27 3 views
0

в моем проекте Мне нужно отправить данные из модели представления в контроллер, но мой почтовый код AJAX не работает. Не могли бы вы помочь мне в решении этой проблемы?Ajax, php, jquery, codeigniter post error

Мой модальный код, который содержит форму с точки зрения:

<div class="modal fade" id="modal_form"> 
    <div class="modal-dialog"> 
     <div class="modal-content"> 
      <div class="modal-header"> 
       <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> 
       <h4 class="modal-title">Modal title</h4> 
      </div> 
      <div class="modal-body"> 

       <form action="#" method="post" id="form" role="form"> 
        <legend>Form title</legend> 
        <div class="form-group"> 
         <label >First Name</label> 
         <input name="firstname" type="text" class="form-control" placeholder="Input field"> 
        </div> 
        <div class="form-group"> 
         <label >Last Name</label> 
         <input name="lastname" type="text" class="form-control" placeholder="Input field"> 
        </div> 
        <div class="form-group"> 
         <label >gender</label> 
         <input name="gender" type="text" class="form-control" placeholder="Input field"> 
        </div> 

        <div class="form-group"> 
         <label >Address</label> 
         <textarea name="address" id="input" class="form-control" rows="3" required="required"></textarea> 
        </div> 
        <div class="form-group"> 
         <label >Dob</label> 
         <input name="dob" type="date" class="form-control" placeholder="Input field"> 
        </div> 
       </form> 
      </div> 
      <div class="modal-footer"> 
       <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
       <button type="button" id="savebtn" onclick="save()" class="btn btn-primary">Save changes</button> 
      </div> 
     </div> 
    </div> 
    </div> 

Мой АЯКС и JQuery код, чтобы отправить данные в контроллер,

function save(){ 
    $('#savebtn').text('saving...'); 
    $('#savebtn').attr('disabled',true); 


    $.ajax({ 
     url : "<?php echo base_url('index.php/Crud/add_details')?>", 
     type: "POST", 
     data: $('#form').serialize(), 
     dataType: "JSON", 
     success: function(data) 
     { 

      if(data.status) //if success close modal and reload ajax table 
      { 
       $('#modal_form').modal('hide'); 
       reload_table(); 
      } 

      $('#savebtn').text('save'); //change button text 
      $('#savebtn').attr('disabled',false); //set button enable 


     }, 
     error: function (jqXHR, textStatus, errorThrown) 
     { 
      alert('Error adding/update data'); 
      $('#savebtn').text('save'); //change button text 
      $('#savebtn').attr('disabled',false); //set button enable 

     } 
    }); 
    } 

функции контроллера

public function add_details() { 
    $data = array(
      'firstName' => $this->input->post('firstName'), 
      'lastName' => $this->input->post('lastName'), 
      'gender' => $this->input->post('gender'), 
      'address' => $this->input->post('address'), 
      'dob' => $this->input->post('dob'), 
     ); 

    $insert = $this->person->save($data); 
    echo json_encode(array("status" => TRUE)); } 

Но не отправляет данные на мой контроллер. Любая помощь будет оценена по достоинству. Благодарю.

+0

Какие ошибки (ы) вы получаете? – TrueStory

+0

На самом деле это не выводит никакого значения моему контроллеру, если я попытался распечатать $ _POST в контроллере, он будет пустым. –

+0

Но вы получаете сообщение об ошибке в своем контроллере, выполненная часть успеха или часть ошибки из вашего сценария ajax? – TrueStory

ответ

0

WOW !! 9 месяцев & Нет ответа Отправлено -: | $ - $ @ _ @

Хорошо, это CodeIgniter (& Я люблю CodeIgniter), я не могу отпустить ..

Wiki Начало: D

Если ваш адрес, работающий в браузере (, вы делаете запрос GET) & не работает с POST/AjaxPOST запрос и получение 500/403 Response/Статус, это означает: ВАМ необходимо отправить CSRF ЗНАК ВМЕСТЕ С POST/AjaxPOST

Если вы используете CodeIgniter CSRF защиты$config['csrf_protection'] = TRUE;внутри CodeIgniter/application/config.phpВЫ ДОЛЖНЫ БЫТЬ SEND CSRF ЗНАК ВМЕСТЕ С POST/AjaxPOST

Вы можете использовать CSRF токен внутри HTML формы:

<form action="#" method="post" id="form" role="form"> 
    <input type="hidden" name="<?=$this->security->get_csrf_token_name()?>" value="<?=$this->security->get_csrf_hash()?>"> 
    <!-- Your Other Stuff Waiting Here.... --> 
</form> 

или, используя CodeIgniter встроенный Form Helper (По умолчанию метод будет POST)

<?=form_open('controller/action', 'id="ci_form_csrf" class="form-controller"'); ?> 
    <!-- Your Other Stuff Waiting Here.... --> 
<?=form_close();?> 

Если Не используя CodeIgniter CSRF защиты$config['csrf_protection'] = FALSE; внутри CodeIgniter/application/config.php

и ..

  • Url работает с запросом GET

  • Url не работает с запросом POST или запрос AjaxPOST

Проверьте метод контроллера, если у вас есть любое условие проверки запроса или код для GET LY ..

public function my_method() { 
    if($this->input->get()){ 

    } 
} 
  • Url не работает с запросом GET

  • Url не работает с запросом POST

  • Url работает с запросом AjaxPOST/AjaxGET

Проверьте метод контроллера, если у вас есть какие-либо запрос проверить состояние или иметь код для AJAX только ..

public function my_method() { 
    if ($this->input->is_ajax_request()) { 

    } 
} 
  • Url не работает с запросом GET

  • Url не работает с запросом POST

  • Url не работает с запросом AjaxPOST/AjaxGET ..и ваша операционная система или Сервера LINUX/UNIX

Убедитесь, что Конвенция правильного именования для CodeIgniter контроллер файла & Модели : See CodeIgniter Change log:


имена файлов класса должны теперь быть Ucfirst и все остальное в нижнем регистре


CodeIgniter Класс Стандарт Нейминг:Ucfirst_controller, Ucfirst_model ...

Это означает, что каждый файл класса должен быть приклеить CodeIgniter Standard Naming Convention

имя файла контроллера User.php или User_controller.php

class User extends CI_Controller {} 

Правильный URL доступ:http://www.website.com/controller/method/param

Название модели файла User_model.php

class User_model extends CI_Model {} 

Правильный способ загрузки модели в контроллере:$ this-> load-> модель ('User_model')

Подождите ...как насчет AjaxPOST: |

Существует 2 Общий подход, чтобы отправить CSRF маркер вместе с AjaxPOST

1 - Использование PHP кода внутри встроенного JavaScript, $ this-> безопасности-> get_csrf_token_name() & $ this-> безопасности-> get_csrf_token_hash()

2 - Определите глобальный var/object JavaScript для хранения имени CSRF & значение & позже передайте вызов глобальной переменной JavaScript.

3 - Добавить метатег CSRF на верхнем корпусе html и присвоить ему имя и значение.

<meta id="CsrfSecrets" name="<?=$this->security->get_csrf_token_name()?>" content="<?=$this->security->get_csrf_hash()?>"/> 

4 - Установите CSRF маркер в пределах AjaxSetup,

// attach CSRF object for each AjaxPOST automatically 
$.ajaxSetup({ 
    data: CsrfSecret 
}); 

OMG !! :/Это так запутано для меня .. у вас есть какой-либо пример для меня plzzzzzz .. :(

Ммм .. не беспокойтесь, я даю вам пример, чтобы сделать вас счастливой :)

Пример Первый - (CodeIgniter CSRF Demo | AjaxPOST)

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <!-- Using meta tag to retrive CodeIgniter CSRF token --> 
    <meta name="<?=$this->security->get_csrf_token_name()?>" content="<?=$this->security->get_csrf_hash()?>"/> 
    <title>CodeIgniter CSRF Demo | AjaxPOST</title> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
    <script type="text/javascript"> 
    // Set CodeIgniter base_url in JavaScript var to use within 
    var _BASE_URL_ = "<?=base_url()?>"; 
    var _CSRF_NAME_ = "<?=$this->security->get_csrf_token_name()?>"; 
    (function($) { 
     // getting meta object from body head section by csrf name 
     var CsrfMetaObj = $('meta[name="' + _CSRF_NAME_ + '"]'), 
     CsrfSecret = {}; 
     // get meta tag name & value 
     CsrfSecret[CsrfMetaObj.attr('name')] = CsrfMetaObj.attr('content'); 
      // attach CSRF object for each AjaxPOST automatically 
      $.ajaxSetup({ 
       data: CsrfSecret 
      }); 
     })(jQuery); 
    </script> 
</head> 
<body> 
    <button class="button">Click Me to Trigger AjaxPOST</button> 
    <script type="text/javascript"> 
     // on DOM ready 
     $(document).ready(function(){ 
      // my button 
      $btn = $('.button'); 
      // on button click 
      $btn.on('click', function(e){ 
       // stop default event 
       e.preventDefault(); 
       // calling AjaxPOST 
       $.ajax({ 
        url: _BASE_URL_ + 'Controller/Method', 
        method: 'POST', 
        // or manually add csrf object 
        // data: $.extend({id:23, name:'scott'}, CsrfSecret); 
        success: function(data){ 
         alert('Success'); 
        }, 
        error: function(xhr, status, error){ 
         alert(error); 
        } 
       }); 
      }); 
     }); 
    </script> 
</body> 
</html> 

Пример второй - (CodeIgniter CSRF Refresh Demo | AjaxPOST)$config['csrf_regenerate'] = TRUE;

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta id="CsrfSecrets" name="<?=$this->security->get_csrf_token_name()?>" content="<?=$this->security->get_csrf_hash()?>"/> 
    <title>CodeIgniter Refresh CSRF Demo | AjaxPOST</title> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
    <script type="text/javascript"> 
    // Set CodeIgniter base_url in JavaScript var to use within 
    var _BASE_URL_ = "<?=base_url()?>"; 
    var _CSRF_NAME_ = "<?=$this->security->get_csrf_token_name()?>"; 
    (function($) { 
     /** 
     * New jQuery function to set/refresh CSRF token in Body & to attach AjaxPOST 
     * @param {[type]} $ [description] 
     * @return {[type]} [description] 
     */ 
     $.fn.CsrfAjaxSet = function(CsrfObject) { 
      // getting meta object from body head section by csrf name 
      var CsrfMetaObj = $('meta[name="' + _CSRF_NAME_ + '"]'), 
      CsrfSecret = {}; 
      // if CsrfObject not set/pass in function 
      if (typeof CsrfObject == 'undefined') { 
       // assign meta object in CsrfObject 
       CsrfObject = CsrfMetaObj; 
       // get meta tag name & value 
       CsrfSecret[CsrfObject.attr('name')] = CsrfObject.attr('content'); 
      } 
      // CsrfObject pass in function 
      else { 
       // get Csrf Token Name from JSON 
       var CsrfName = Object.keys(CsrfObject); 
       // set csrf token name & hash value in object 
       CsrfSecret[CsrfName[0]] = CsrfObject[CsrfName[0]]; 
      } 
      // attach CSRF object for each AjaxPOST automatically 
      $.ajaxSetup({ 
       data: CsrfSecret 
      }); 
     }; 
     /** 
     * New jQuery function to get/refresh CSRF token from CodeIgniter 
     * @param {[type]} $ [description] 
     * @return {[type]} [description] 
     */ 
     $.fn.CsrfAjaxGet = function() { 
      return $.get(_BASE_URL_ + 'Csrfdata', function(CsrfJSON) { 
       $(document).CsrfAjaxSet(CsrfJSON); 
      }, 'JSON');    
     }; 
    })(jQuery); 
    // On DOM ready attach CSRF within AjaxPOST 
    $(document).CsrfAjaxSet(); 
</script> 
</head> 
<body> 
<button class="button">Click Me to Trigger AjaxPOST</button> 
    <script type="text/javascript"> 
     // on DOM ready 
     $(document).ready(function(){ 
      // my button 
      $btn = $('.button'); 
      // on button click 
      $btn.on('click', function(e){ 
       // stop default event 
       e.preventDefault(); 
       // trigger refresh csrf token 
       var CSRF = $(document).CsrfAjaxGet(); 
       // use callback to put your AjaxPOST & Done! 
       CSRF.success(function(){ 
        $.ajax({ 
         url: _BASE_URL_ + 'Controller/Method', 
         method: 'POST', 
         success: function(data){ 
          alert('Success'); 
         }, 
         error: function(xhr, status, error){ 
          alert(error); 
         } 
        }); 
       }); 
      }); 
     }); 
    </script> 
</body> 
</html>