我想通过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