【问题标题】:Getting 500 Internal Server Error with jQuery AJAX and CodeIgniter使用 jQuery AJAX 和 CodeIgniter 获取 500 内部服务器错误
【发布时间】:2012-06-14 20:59:08
【问题描述】:

我正在尝试向 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) - 未签名

【问题讨论】:

    标签: php jquery mysql ajax codeigniter


    【解决方案1】:

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

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

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

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

    如果您不在生产环境中,请考虑displaying PHP errors,直到您找到问题所在

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

    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]
                )
            );
        }
    

    【讨论】:

    • 谢谢! PHP.ini 设置为error_reporting = E_ALL 和display_errors = On。我保存了错误日志文件,其中没有错误(我之前清除了一堆旧的,所以它正在工作)。根据我的收集,如果数据库返回错误,CI 将返回 500 错误,我怀疑这是问题所在,但不确定原因。我已经尝试为insert语句制作一个虚拟数组,其中不包含POST数据,并将insert_batch更改为insert,结果是一样的。
    • 在 CI 的数据库配置文件中,确保调试设置为 True(实际上,我的设置为 (ENVIRONMENT=='Development'),但你明白了。
    • np - 该编辑是在我看到您的评论之前进行的。现在你不是批量插入,我不确定它是否仍然适用,但让我们看看
    • 嗯。好的,如果没有错误消息,这将很棘手。你可以尝试使用profiler,它可能在你死之前给你一些输出。或者,使用 Wireshark 或类似工具检查连接以查看实际执行的内容并跟踪它。
    • 已修复!它与表的设置方式有关 - 在尝试通过外键创建关系的尝试明显不成功后,我不得不删除表并重新创建它(我怀疑这是问题所在)。我仍然必须应用您的部分答案才能使其在没有虚拟数组的情况下工作(我需要将日期和 raffle_id 与每个条目一起推送),所以我将接受您的回答,再次感谢!
    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多