CodeIgniter + jQuery UI autocomplete = 500 внутренняя ошибка сервера (с кодом) из-за CSRF установлен в TRUE - PullRequest
4 голосов
/ 18 марта 2011

Вот код вида:

<html>
<head>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>

        <!-- Load JQuery UI -->
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
<script type="text/javascript">
    $( function() {    

        $("#input").autocomplete({
            source: function(req, add){
                $.ajax({
                    url: '<?php echo base_url(); ?>test/ac2',
                    dataType: 'json',
                    type: 'POST',
                    //data: req,
                    data: 'input='+req,
                    success: function(data){
                        if(data.response =='true'){
                           add(data.message);
                        }
                    }
                });
        },
        minLength: 2,
        select: function(event, ui){
            $(this).end().val(ui.item.value);
            }
        });

     });      
</script>
</head>
<?php

echo form_open();
echo form_input('input', '', 'id="input"');
echo form_close();

?>
</html>

и код контроллера:

class Test extends CI_Controller {

    function index()
    {
        $this->load->view('vw/test_vw');
    }

    public function ac2()
    {

        //$search = $this->input->post('term');
              $search = $this->input->post('input');

        $data['response'] = 'false';

        $this->db->select('*');
        $this->db->from('loc_exercise');
        $this->db->like('locations', $search);
        $locations = $this->db->get()->result();


        if (count($locations) > 0) {
            $data['message'] = array();

            foreach ($locations as $location) {
                $data['message'][] = array(  'label' => $location->locations,
                'item'  => $location->locations,
                'value' => $location->locations );
            }

            $data['response'] = 'true';
        }
        echo json_encode($data);
    }

Когда я набираю что-либо в поле ввода, я получаю это на консоли:

POST http://my.example.com/test/ac2 500 (Internal Server Error)

и в журналах ошибок CI, похоже, проблем нет (log_threshold равен 1, / logs - chmod 777).

Кстати, у меня есть мой config.php с запросом_strings TRUE и allow_get_array TRUE.

Есть идеи, как решить эту проблему?

Ответы [ 4 ]

5 голосов
/ 19 марта 2011

Это почти наверняка проблема с токеном CSRF.

См. на форумах CI и в этом сообщении в блоге

2 голосов
/ 18 марта 2011

Ничто в вашем вопросе не говорит о том, что вам нужно включить query_strings или allow_get_array

Попробуйте это

закомментируйте эту строку

$search = $this->input->post('term');

затем добавьте $search к вашей функции в качестве первого аргумента

public function ac2($search)

Тогда просто попробуйте перейти по URL с помощью браузера

http://yourdomain.com/index.php/test/ac2/<insert your search string here>

Теперь, когда мы знаем, что ваш URL-адрес хорош

верните свой контроллер обратно.

попробуйте это ...

data: 'term='+req,  //<-- change to this
1 голос
/ 29 мая 2012

кажется, вам не хватает sendig токена csrf с данными POST, попробуйте:

    $("#input").autocomplete({
        source: function(req, add){

    var cct = $("input[name=ci_csrf_token]").val(); //  <---

            $.ajax({
                url: '<?php echo base_url(); ?>test/ac2',
                dataType: 'json',
                type: 'POST',
                //data: req,
                data: 'input='+req,
    'ci_csrf_token': cct,   //  <---
                success: function(data){
                    if(data.response =='true'){
                       add(data.message);
                    }
                }
            });
    },
    minLength: 2,
    select: function(event, ui){
        $(this).end().val(ui.item.value);
        }
    });

 }); 

вы также можете найти токен как:

     csrf_test_name:$("input[name=csrf_test_name]").val(),

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

  <?php echo form_open();?>

Источники: * http://codeigniter.com/forums/viewthread/176318/ ** собственная головная боль

0 голосов
/ 18 марта 2011

Проверьте ваш код PHP без AJAX.Ваша ошибка говорит о том, что ваш PHP - тот, который вызывает ошибку.

Еще одна вещь, которую было бы лучше увидеть, если у вас есть результаты, прежде чем вы вызовете ->result()

...