2012-06-11 118 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

相关问题