2012-06-11 137 views
0

我想通過CodeIgniter提交一個表單(它是一個帶有通過jQuery添加的字段的動態表單),用於db插入。其中一部分起作用,另一部分不起作用。使用jQuery獲取500內部服務器錯誤AJAX和CodeIgniter

這裏是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. InnoDB的
  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操作上,會發生什麼情況?

下一個問題是通常的東西,但服務器日誌說什麼?查看事件日誌(窗口)或/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將返回一個500錯誤,我懷疑這個問題是錯誤的,但不確定原因。我試圖爲insert語句創建一個虛擬數組,它不包含POST數據,並將'insert_batch'更改爲'insert',結果是相同的。 – Clowerweb

+1

在CI的數據庫配置文件中,確保debug設置爲True(實際上,我將它設置爲'(ENVIRONMENT =='Development')',但你得到了要點。 – Basic

+0

我會在你的編輯中嘗試這個方法並在幾處報告 – Clowerweb

相關問題