データベース挿入のためにフォーム (jQuery を介してフィールドが追加された動的フォーム) を 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) - 未署名
- 名前 - varchar(100)
- チケット - smallint(5) - 署名なし
- 日付 - 日時
- raffle_id - int(10) - 未署名