2011-03-18 2 views
3

Вот код вид:CodeIgniter + JQuery UI автозаполнения = 500 внутренняя ошибка сервера (с кодом)

<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,/журналы является чмо d 777).

BTW У меня есть мой config.php с query_strings TRUE и allow_get_array TRUE.

Любые идеи по устранению этой проблемы?

ответ

4

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

См this in the CI forums и это blog post

+0

вы прибивали его - как только я выключил CSRF, выпадающее меню автозаполнения работало нормально - теперь мне интересно, как это сделать Я собираюсь использовать CSRF ... до сих пор не переварил решения, предлагаемые в этом сообщении на форуме CI: P - в любом случае спасибо за кучу! – pepe

+0

Сообщение в блоге, упомянутое выше от @coolgeek, является удивительным и красиво объясняет, как исправить эту проблему. – pepe

+0

рад, что я мог бы помочь – coolgeek

2

Ничто в вашем вопросе не говорит о том, что вам необходимо включить 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 
+0

да! это работает и возвращает данные JSON в браузер с достойными совпадениями - но когда я вернусь к своей предыдущей настройке, я все равно получаю 500 на консоли - как я могу заставить это работать как ожидалось (т. е. совпадения показывают как выпадающее меню ниже INPUT)? – pepe

+0

FWIW - если я вернусь к предыдущей настройке (мой исходный код выше) и перейдите к 'http: // yourdomain.com/index.php/test/ac2 /' Я получаю данные JSON со всеми результатами из базы данных – pepe

+0

спасибо за помогая с этим - к сожалению, не работая, все равно получаю 500 - я обновил код от OP - вы увидите, что теперь я использую 'input' как пост-ключ, так как это имя на входе формы - я также упростил' foreach array' и добавил ваше предложение JS - но он все еще не работает, и я не могу понять, почему! – pepe

0

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

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

1

кажется вам не хватает 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/ ** собственная головная боль

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