Вот код вида:
<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).
BTW У меня есть мой config.php с query_strings TRUE и allow_get_array TRUE.
Любые идеи, как решить эту проблему?
Это почти наверняка проблема CSRF.
Смотрите это на форумах CI и этом сообщении в блоге
Ничто в вашем вопросе не предполагает, что вам нужно включить 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
кажется, что вам не хватает sendgr токен 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/ ** собственная головная боль
Проверьте свой код PHP без AJAX. Ваша ошибка указывает на то, что ваш PHP является тем, который вызывает ошибку.
Еще одна вещь – лучше видеть, есть ли у вас результаты перед вызовом ->result()