0

データベース挿入のためにフォーム (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 構成でオフになっています。

テーブルは次のように設定されます。

  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 エラーを表示することを検討してください

編集:推測よりも問題を知る方が常に良いですが、最初に考えたのは、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]
            )
        );
    }
于 2012-06-12T07:04:20.607 に答える