2012-06-11 3 views
0

DB 삽입을 위해 CodeIgniter에 양식 (양식이 jQuery를 통해 추가 된 동적 양식)을 제출하려고합니다. 그것의 부분은 작동하고 다른 부분은 작동하지 않습니다. 여기 jQuery AJAX 및 CodeIgniter에서 500 내부 서버 오류 발생

는 jQuery의 :

function submitForm() { 
    $.ajax({ 
     type: 'POST', 
     url: '/raffle/save/', 
     data: $('#raffle').serialize(), 
     success: function (response) { 
      alert(response); 
     }, 
     error: function() { 
      alert('Failed'); // This is what I get unless I comment out the entry insert 
     } 
    }); 
} 

CI를 컨트롤러 :

class Raffle extends CI_Controller { 
    public function __construct() { 
     parent::__construct(); 
     $this->load->model('raffle_model'); 
     $this->load->library('form_validation'); 
    } 

    public function index() { 
     $data['title'] = 'Create a Raffle'; 
     $this->load->view('header', $data); 
     $this->load->view('raffles/create_view', $data); 
     $this->load->view('raffles/bottombar_view', $data); 
     $this->load->view('footer', $data); 
    } 

    public function save() { 
     foreach($_POST as $k => $v) { 
      if($k == 'entrant' || $k == 'tickets') { 
       foreach ($v as $i => $vector) { 
        $this->form_validation->set_rules('entrant[' . $i . ']', 'Entrant name', 'trim|required|min_length[1]|max_length[100]|xss_clean'); 
        $this->form_validation->set_rules('tickets[' . $i . ']', 'Number of tickets', 'trim|required|max_length[2]|is_natural_no_zero|xss_clean'); 
       } 
      } else { 
       $this->form_validation->set_rules('raffle-name', 'Raffle name', 'trim|required|min_length[4]|max_length[100]|xss_clean'); 
       $this->form_validation->set_rules('winners', 'Number of winners', 'trim|required|max_length[2]|is_natural_no_zero|xss_clean'); 
      } 
     } 

     if($this->form_validation->run() == FALSE) { 
      echo 'Validation failure!'; 
     } else { 
      if($this->raffle_model->add_raffle()) { // It does pass validation and goes to the model 
       echo 'Data added successfully!'; 
      } 
     } 
    } 
} 

그리고 CI 모델 :

class Raffle_model extends CI_Model { 
    public function __construct() { 
     parent::__construct(); 
    } 

    public function add_raffle() { 
     // This works 
     $meta = array(
      'user_id' => $this->session->userdata('user_id'), 
      'name'  => $this->input->post('raffle-name'), 
      'winners' => $this->input->post('winners'), 
      'created_ip' => $_SERVER['REMOTE_ADDR'] 
     ); 

     // This works and is a multidimensional array for insert_batch() 
     $entrants = array(
      array(
       'date'  => date(DATE_ATOM), 
       'raffle_id' => '1' 
      ) 
     ); 

     foreach($_POST['entrant'] as $name => $n) { 
      array_push($entrants, 
       array(
        'name' => $n, 
        'tickets' => $_POST['tickets'][$name] 
       ) 
      ); 
     } 

     $this->db->insert('raffle', $meta); 
     $this->db->insert_batch('entry', $entrants); // This one returns error 500 

     return true; 
    } 
} 

여기에 문제가 있습니다 : 양식을 제출하면 meta 부분이 raffle 테이블에 저장되지만 entrants 부분은 entry 테이블에 저장되지 않습니다. 간단한 더미 배열 (샘플 데이터, 포스트 데이터, 루프 없음)을 사용하여 작동하는지 확인하려고 시도했지만 여전히 그렇지 않습니다. 콘솔 로그는 POST http://rafflegrab.dev/raffle/save/ 500 (Internal Server Error)입니다.

CSRF는 CI 구성에서 해제되어 있습니다.

다음과 같이 테이블이 설정

:

  1. 테이블 이름 출품
  2. 이노
  3. ID - BIGINT (12) - UNSIGNED - NOT_NULL - AUTO_INCREMENT - PRIMARY
  4. USER_ID - INT (10) - UNSIGNED
  5. 이름 - VARCHAR (100)
  6. 티켓 - SMALLINT (5) - UNSIGNED
  7. 날짜 - 날짜
  8. raffle_id - INT (10) - UNSIGNED는

답변

1

난 당신이 $ _POST에 액세스 할 수 있도록 안전하지 않은 입력 방법을 사용하고 있으리라 믿고있어?

해당 필드와 함께 noddy 폼을 조롱하고 컨트롤러의 Save 액션에 게시하면 어떻게됩니까?

다음 질문은 일반적인 내용이지만 서버 로그는 무엇을 말합니까? 이벤트 로그 (Windows) 또는 /var/log/apache2/error_log (SUSE) 또는 이에 상응하는 시스템에서 살펴보십시오. 왜 작동하지 않는지 알려줄 것입니다.

그렇지 않은 경우 PHP 로그 수준이 오류를 출력 할만큼 충분히 높아야합니다. 프로덕션 환경에 있지 않은 경우이 문제를

편집을 추적 할 때까지

, displaying PHP errors을 고려 : 항상 더 나은 생각보다 문제를 알고 있지만 내 첫번째 생각은하는 그와 같은 2 차원 배열 모순 된.당신은 갖고있는 것 같다 :

array(
    array('date'=>blah, 'raffleId'=>blah), 
    array('name'=>blah, 'tickets'=>blah), 
    array('name'=>blah, 'tickets'=>blah) 
    ... 
) 

사실을 했

array(
    array('date'=>blah, 'raffleId'=>blah, 'name'=>blah, 'tickets'=>blah), 
    array('date'=>blah, 'raffleId'=>blah, 'name'=>blah, 'tickets'=>blah), 
    array('date'=>blah, 'raffleId'=>blah, 'name'=>blah, 'tickets'=>blah), 
    ... 
) 

줄까? 아마도 다음과 같습니다 :

$entrants = array(); 
    $recordedDate = date(DATE_ATOM); 
    foreach($_POST['entrant'] as $name => $n) { 
     array_push($entrants, 
      array(
       'date'  => $recordedDate, 
       'raffle_id' => '1' 
       'name' => $n, 
       'tickets' => $_POST['tickets'][$name] 
      ) 
     ); 
    } 
+0

감사합니다! PHP.ini는'error_reporting = E_ALL'과'display_errors = On'으로 설정됩니다. 오류 로그 파일이 저장되어 있고 오류가 없습니다 (이전에 여러 개의 오래된 파일을 삭제 했으므로 작동합니다). 내가 수집 한 것으로부터 CI가 오류를 반환하면 CI는 500 오류를 반환합니다. 문제는 의심 스럽지만 이유는 확실하지 않습니다. POST 데이터가 없으며'insert_batch'를'insert'로 변경하는 insert 문에 대해 더미 배열을 만들려고했는데 그 결과는 같습니다. – Clowerweb

+1

CI의 데이터베이스 설정 파일에서 디버그가 'True'로 설정되어 있는지 확인하십시오. (사실, 제 설정은'(ENVIRONMENT == 'Development')') 그러나 요점은 – Basic

+0

입니다. – Clowerweb