我想通過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配置中關閉。
表被設置爲如下:
- 表名:條目
- InnoDB的
- ID - BIGINT(12) - UNSIGNED - NOT_NULL - AUTO_INCREMENT - PRIMARY
- USER_ID - INT( 10) - UNSIGNED
- 名稱 - VARCHAR(100)
- 車票 - SMALLINT(5) - UNSIGNED
- 日期 - 日期時間
- raffle_id - INT(10) - UNSIGNED
謝謝! PHP.ini設置爲'error_reporting = E_ALL'和'display_errors = On'。我保存了錯誤日誌文件,並且沒有錯誤(我以前清除了一堆較舊的錯誤,所以它正在工作)。從我收集的信息來看,如果數據庫返回一個錯誤,CI將返回一個500錯誤,我懷疑這個問題是錯誤的,但不確定原因。我試圖爲insert語句創建一個虛擬數組,它不包含POST數據,並將'insert_batch'更改爲'insert',結果是相同的。 – Clowerweb
在CI的數據庫配置文件中,確保debug設置爲True(實際上,我將它設置爲'(ENVIRONMENT =='Development')',但你得到了要點。 – Basic
我會在你的編輯中嘗試這個方法並在幾處報告 – Clowerweb