Immer 500 Internal Server Error mit jQuery, AJAX und CodeIgniter
Ich versuche, ein Formular Absenden (es ist ein dynamisches Formular mit Feldern Hinzugefügt via jQuery), um CodeIgniter für eine db einfügen. Ein Teil davon funktioniert, der andere Teil nicht.
Hier der 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
}
});
}
Die CI-controller:
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!';
}
}
}
}
Und die CI-Modell:
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;
}
}
Hier ist das problem: dem Absenden des Formulars die meta
Teil nicht gespeichert raffle
Tabelle, aber die entrants
Teil nicht gespeichert entry
Tabelle. Ich habe versucht, mit einer einfachen dummy-array (sample-Daten, keine post-Daten, keine loops), um zu sehen, ob es funktionieren würde, aber es immer noch nicht. Console logs sagen POST http://rafflegrab.dev/raffle/save/500 (Internal Server Error)
.
CSRF-off ist in der CI-Konfiguration.
Die Tabelle ist wie folgt aufgebaut:
- Tabelle-name: Eintrag
- InnoDB
- id - bigint - (12) - UNSIGNED - not_null - AUTO_INCREMENT - PRIMARY
- user_id - int(10) - UNSIGNED
- name - varchar(100)
- tickets - smallint(5) - UNSIGNED
- Datum - datetime -
- raffle_id - int(10) - UNSIGNED
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin davon ausgegangen, dass Sie unsichere input-Methoden werden in der Lage, Zugriff auf $_POST ?
Was passiert, wenn Sie mock-up ein noddy-Formular mit dieser Felder und senden Sie es an die
Save
Aktion auf dem controller?Nächste Frage ist die übliche Zeug, aber was tun die server-logs sagen? Werfen Sie einen Blick in das Event-Log (windows) oder
/var/log/apache2/error_log
(SUSE) oder das äquivalent auf deinem system. Es sollte Ihnen sagen, warum es nicht funktioniert.Wenn nicht, stellen Sie sicher, dass Ihre php-log-level hoch genug ist, um Fehler bei der Ausgabe.
Wenn Sie nicht in einer Produktionsumgebung, sollten die Anzeige von PHP-Fehlern, bis Sie Sie aufgestöbert haben das problem
Edit: Immer besser zu wissen, das problem, als denke, aber mein Erster Gedanke ist, dass Ihre 2-dimensionalen array als inkonsistent. Sie scheinen zu haben:
Haben Sie in der Tat wollen
? Vielleicht etwas wie:
error_reporting = E_ALL
unddisplay_errors = On
. Ich habe die error-log-Datei gespeichert, und es sind keine Fehler drin (die ich vorher gelöscht, ein paar von den älteren aus, es funktioniert also). Von dem, was ich sammeln, CI liefert eine 500-Fehlermeldung, wenn die Datenbank einen Fehler zurück, das ich vermute, das Problem zu sein, aber nicht sicher, warum. Ich habe versucht, einen dummy-array für die insert-Anweisung, die enthalten keine POST-Daten, und änderninsert_batch
zuinsert
, und das Ergebnis ist das gleiche.True
(eigentlich habe ich mir gesetzt, um(ENVIRONMENT=='Development')
aber Sie bekommen das wesentliche.$db['default']['db_debug'] = TRUE;
.$entrants = array( 'name' => 'Me', 'tickets' => 2, 'date' => date(DATE_ATOM), 'raffle_id' => '1' ); $this->db->insert('entry', $entrants);
- gleiche 500 error 🙁