2016-09-17 5 views
0

Я только начинаю с codeigniter. Я хочу вставить некоторые данные в базу данных через ajax, но у меня есть проблема с моим вызовом ajax; Я искал два часа, но я не мог решить проблему. Моя проблема в том, что я нажимаю кнопку отправки, и она говорит, что она запрещена.
Также моя защита csrf установлена ​​в значение ИСТИНА! Пожалуйста, помогите, спасибозапрещен в функции ошибки вызова ajax в codeigniter csrf

JS

$(document).ready(function() { 

$(".addbtn").click(function (e) { 
     e.preventDefault(); 
     if($("#mname").val()==='' || 
      $('#sname').val() === '' || 
      $('#genre').val()==='' || 
      $('#album').val()==='' || 
      $('#publishyear').val() ==='' || 
      $('#artist').val()==='') 
     { 
      alert("Please fill all the fields!"); 
      return false; 
     } 

     $("#FormSubmit").hide(); 
     $("#LoadingImage").show(); 

     var baseurl = "<?php echo base_url(); ?>"; 
     var data = { 
       'mname': $("#mname").val(), 
       'sname': $('#sname').val(), 
       'genre': $('#genre').val(), 
       'album': $('#album').val(), 
       'publishyear': $('#publishyear').val(), 
       'artist': $('#artist').val(), 
       '<?php echo $this->security->get_csrf_token_name(); ?>': 
       '<?php echo $this->security->get_csrf_hash(); ?>' 
       }; 

     $.ajax({ 
     type: "POST", 
     url: baseurl+"index.php/admin_page/send_ajax", 
     data: data, 
     success:function(){ 
      alert("success"); 

     }, 
     error:function (xhr, ajaxOptions, thrownError){ 
      $("#FormSubmit").show(); 
      $("#LoadingImage").hide(); 
      alert(thrownError); 
     } 
     }); 
    });}); 

Конфигурационный файл

$config['csrf_protection'] = TRUE; 
$config['csrf_token_name'] = 'csrf_test_name'; 
$config['csrf_cookie_name'] = 'csrf_cookie_name'; 
$config['csrf_expire'] = 7200; 
$config['csrf_regenerate'] = TRUE; 
$config['csrf_exclude_uris'] = array(); 

Контроллер

public function send_ajax(){ 


    $data = array(
       'name_of_music'=>$this->input->post("mname", TRUE), 
       'artist'=>$this->input->post("artist", TRUE), 
       'name_of_singer'=>$this->input->post("sname", TRUE), 
       'genre'=>$this->input->post("genre", TRUE), 
       'album'=>$this->input->post("album", TRUE), 
       'publishyear'=>$this->input->post("publishyear", TRUE) 
      ); 
    $json_data['lyrics_info_data'] = json_decode($data); 
    $this->user_model->insert_json_in_db($json_data); 
    } 

Модель

public function insert_json_in_db($json_data){ 
    $this->db->insert('lyrics', $json_data); 
    } 
+0

вы должны 'json_encode ($ data)', а не json_decode – Zeeshan

+0

Zeeshan Я исправил это, но все еще не работает! говорит запрещено – Erfan

+0

Можете ли вы убедиться, что функция вашего контроллера получает вызов из ajax, просто поместив 'echo 'в контроллер, выйдите,' – Zeeshan

ответ

0

Можете ли вы подтвердить, что использование этой линии $json_data['lyrics_info_data'] = json_decode($data);? Я думаю, что ошибка связана с этой строкой.

Вы можете использовать $json_data['lyrics_info_data'] = $data; вместо $json_data['lyrics_info_data'] = json_decode($data);

Также функция модели необходимо обновить.

public function insert_json_in_db($json_data){ 
    $this->db->insert('lyrics', $json_data['lyrics_info_data']); 
} 

Script обновление

Codeigniter восстановит свою crcf фишку на каждом запросе и эта информация будет храниться в куки. Таким образом, значение маркера вам нужно взять из файла cookie и отправить вместе с данными ajax, которые вы передаете. Что я делаю с folliwing javascript, так это то, что, используя общую функцию для добавления значения crcf вместе со всем запросом ajax.

В jquery есть возможность добавлять пользовательские данные вместе с ajax-запросом. См Jquery документации http://api.jquery.com/jquery.ajaxprefilter/ для получения более подробной информации

<script> 
    $(document).ready(function(){ 

function getCookie(c_name) { // A javascript function to get the cookie value 
    if(document.cookie.length > 0) { 
     c_start = document.cookie.indexOf(c_name + "="); 
     if(c_start != -1) { 
      c_start = c_start + c_name.length + 1; 
      c_end = document.cookie.indexOf(";", c_start); 
      if(c_end == -1) c_end = document.cookie.length; 
      return unescape(document.cookie.substring(c_start,c_end)); 
     } 
    } 
    return ""; 
} 

$.ajaxPrefilter(function(options, originalOptions, jqXHR){ // This function will attach "csrf_test_name" with all the request you are sending. 
    if (options.type.toLowerCase() === "post") { // Required only if its a post method 
     var csrf_token = getCookie("csrf_test_name"); 
     // initialize `data` to empty string if it does not exist 
     options.data = options.data || ""; 

     // add leading ampersand if `data` is non-empty 
     options.data += options.data?"&":""; 

     // add _token entry 
     options.data += "csrf_test_name=" + csrf_token; 
    } 
}); 
}); 
    </script> 

Вы можете удалить '<?php echo $this->security->get_csrf_token_name(); ?>': '<?php echo $this->security->get_csrf_hash(); ?>' из var data.

Важное примечание. Если вы измените $config['csrf_token_name'] = 'csrf_test_name'; в config.php, вам также необходимо обновить этот скрипт.

Попробуйте обновить код и сообщите мне, существуют ли проблемы.

+0

все еще говорит, что запрещено. – Erfan

+0

Можете ли вы убедиться, что загрузили файл модели? – user6838959

+0

Я на 100 процентов уверен, потому что другие методы в моем контроллере работают правильно – Erfan

0

Убедитесь, что вы получаете право base_url() и в JavaScript, вы должны определить base_url() глобально где-то так, что вы можете получить доступ к нему в любом сценарии, как показано ниже

var baseurl = <?php echo base_url() ?>; 

`

0

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

$(function() { 
"use strict"; 
$("#form2").submit(function() { 
var data = $("#form2").serialize(); 
//alert(data); return false; 
$.ajax({ 
    url: "/log/login", 
    data: data, 
    type: "POST", 
    success: function (msg) { 
    $("#display").text(msg); 
    }, 
    error: function (msg) { 
    $("#display").text("its all bad"); 
    } 
    }); 
    return false; 
}); 
}); 

(Вы, конечно, нужно будет поставить свой собственный идентификатор формы в и т.д.)

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

$data = array(
'borncity' => htmlspecialchars(trim($this->input->post('borncity'))), 
'state'  => htmlspecialchars(trim($this->input->post('state'))), 
'country' => htmlspecialchars(trim($this->input->post('country'))), 
'family' => htmlspecialchars(trim($this->input->post('family'))), 
'year'  => htmlspecialchars(trim($this->input->post('year'))), 
'state1' => htmlspecialchars(trim($this->input->post('state1'))), 
'deathcity' => htmlspecialchars(trim($this->input->post('deathcity'))) 
); 

$this->form_validation->set_rules('borncity', 'city of birth', 'required|trim'); 
$this->form_validation->set_rules('state', 'state', 'required|trim'); 
$this->form_validation->set_rules('country', 'country', 'required|trim'); 
$this->form_validation->set_rules('family', 'family', 'required|trim'); 
$this->form_validation->set_rules('year', 'year', 'required|trim'); 
$this->form_validation->set_rules('state1', 'Born State', 'required|trim'); 
$this->form_validation->set_rules('deathcity', 'Death City', 'trim'); 

if($this->form_validation->run() == FALSE) { 
    echo validation_errors(); 
}else 
{ 
    $this->db->insert('cities', $data); 
    echo "Success"; //this will show up in your ajax success line 
} 
} 

Используйте CodeIgniter в ваш контроллер. Вам не нужно использовать json-декодирование. Обратите внимание, что это примеры

+0

Я обновил свой код, как указано выше, но не работает, по-прежнему запрещен! ajax не может отправить запрос методу, который я не знаю, но, похоже, он вообще не может найти метод. – Erfan

+0

Работает ли он, если вы не используете ajax?Помните, что URL-адрес ajax совпадает с методом url – Brad

+0

Да, я могу использовать форму codeigniter и отправлять свои данные контроллеру. Так будет хорошо. Я попробовал ваш код выше, но ajax снова отклонил запрос. – Erfan

Смежные вопросы