0

我正在尝试向 CodeIgniter 提交一个表单(它是一个动态表单,其中包含通过 jQuery 添加的字段)以进行数据库插入。一部分有效,另一部分无效。

这是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) - 未签名
  5. 名称 - varchar(100)
  6. 门票 - smallint(5) - 未签名
  7. 日期 - 日期时间
  8. raffle_id - int(10) - 未签名
4

1 回答 1

1

我假设您使用不安全的输入法来访问 $_POST ?

如果你用这些字段模拟一个 noddy 表单并将其发布到Save控制器上的操作会发生什么?

下一个问题是通常的问题,但服务器日志说什么?查看事件日志 (windows) 或/var/log/apache2/error_log(SUSE) 或系统上的等效项。它应该告诉你为什么它不起作用。

如果没有,请确保您的 php 日志级别足够高以输出错误。

如果您不在生产环境中,请考虑显示 PHP 错误,直到找到问题为止

编辑:总是比猜测更好地了解问题,但我的第一个想法是您的二维数组不一致。你似乎有:

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]
            )
        );
    }
于 2012-06-12T07:04:20.607 回答