向pendidikan表添加数据时出现Undefined variable: data等错误求助
向pendidikan表添加数据时出现Undefined variable: data和Invalid argument supplied for foreach()错误
此前功能正常,现在使用模态框添加数据时触发以下错误:
- Undefined variable: data
- Invalid argument supplied for foreach()
错误信息


添加数据模态框视图代码
<button type="button" class="btn btn-sm btn-success float-right" data-toggle="modal" data-target="#exampleModal">Tambah Data</button> <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel">Tambah Riwayat Pendidikan </h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <form action="<?= base_url('pendidikan/tambah'); ?>" method="post" enctype="multipart/form-data"> <input type="hidden" class="form-control" name="institusi" value="<?php echo $akun['id']; ?>"> <div class="form-group"> <label for="recipient-name" class="col-form-label">Jenjang Pendidikan</label> <select class="form-control select2bs4" name="f_jenjang"> <option selected="selected">Pilih Jenjang</option> <option>SD</option> <option>SMP</option> <option>SMA / SMK / MA</option> <option>D3</option> <option>D4</option> <option>S1</option> <option>S2</option> <option>S3</option> </select> </div> <div class="form-group"> <label for="message-text" class="col-form-label">Institusi</label> <input type="text" class="form-control" name="f_institusi"> </div> <div class="form-group"> <label for="message-text" class="col-form-label">Jurusan</label> <input type="text" class="form-control" name="f_jurusan"> </div> <div class="form-group"> <label for="message-text" class="col-form-label">Tahun Masuk</label> <?php echo "<select class='form-control select2bs4' name='f_tahunmasuk'> <option selected>"; $tahun = 1980; for ($i = $tahun; $i <= $tahun + 50; $i++) echo "<option value=$i>$i<br />"; echo "</option></select>"; ?> </div> <div class="form-group"> <label for="message-text" class="col-form-label">Tahun Lulus</label> <?php echo "<select class='form-control select2bs4' name='f_tahunlulus'> <option selected>"; $tahun = 1980; for ($i = $tahun; $i <= $tahun + 50; $i++) echo "<option value=$i>$i<br />"; echo "</option></select>"; ?> </div> <div class="form-group"> <label for="message-text" class="col-form-label">Upload Ijazah</label> <div class="custom-file"> <input type="file" class="custom-file-input" name="ijazah" id="customFile"> <label class="custom-file-label" for="customFile">Pilih File ( .jpg, .jpeg, .png, .pdf)</label> </div> </div> <div class="modal-footer"> <button type="reset" class="btn btn-outline-danger" data-dismiss="modal">Tutup</button> <button type="submit" class="btn btn-outline-primary">Simpan</button> </div> </form> </div> </div> </div> </div>
Pendidikan表视图代码
<table id="example1" class="table table-bordered table-striped"> <thead> <tr> <th>No</th> <th>Jenjang Pendidikan</th> <th>Institusi</th> <th>Jurusan</th> <th>Tahun Masuk</th> <th>Tahun Lulus</th> <th>Ijazah</th> <th>Aksi</th> </tr> </thead> <tbody> <?php $no = 0; foreach ($data as $pendidikan) : $no++; $jenjang = $pendidikan['jenjang']; $institusi = $pendidikan['institusi']; $jurusan = $pendidikan['jurusan']; $tahunmulai = $pendidikan['tahunmulai']; $tahunselesai = $pendidikan['tahunselesai']; $ijazah = $pendidikan['ijazah']; ?> <tr> <td><?php echo $no; ?></td> <td><?php echo $jenjang; ?></td> <td><?php echo $institusi; ?></td> <td><?php echo $jurusan; ?></td> <td><?php echo $tahunmulai; ?></td> <td><?php echo $tahunselesai; ?></td> <td><?php echo $ijazah; ?></td> <td><a href="<?= base_url('pendidikan/viewPdf/' . $pendidikan['id_pendidikan']); ?>" target="_blank"><?php echo $ijazah; ?></a></td> <td><a href="<?= base_url('pendidikan/edit/' . $pendidikan['id_pendidikan']); ?>" class="btn btn-sm btn-outline-primary">Edit</a> <a href="<?= base_url('pendidikan/delete/' . $pendidikan['id_pendidikan']); ?>" class="btn btn-sm btn-outline-danger">Hapus</a> </td> </tr> <?php endforeach; ?> </tbody> </table>
Pendidikan模型代码
function get_pendidikan() { $email = $this->session->userdata('email'); $query = "SELECT * FROM pendidikan JOIN akun ON pendidikan.id_akun = akun.id WHERE akun.email = '$email'"; return $this->db->query($query)->result_array(); }
Pendidikan控制器代码
public function index() { $data['title'] = 'Pendidikan'; $data['akun'] = $this->db->get_where('akun', ['email' => $this->session->userdata('email')])->row_array(); $data['data'] = $this->pendidikan_m->get_pendidikan(); $this->load->view('templates/header', $data); $this->load->view('templates/sidebarmenu', $data); $this->load->view('templates/top_bar', $data); $this->load->view('pendidikan/index', $data); $this->load->view('templates/footer'); } public function tambah() { $data['title'] = 'Tambah Pendidikan'; $data['akun'] = $this->db->get_where('akun', ['email' => $this->session->userdata('email')])->row_array(); if ($this->form_validation->run() == false) { $this->load->view('templates/header', $data); $this->load->view('templates/top_bar'); $this->load->view('templates/sidebarmenu'); $this->load->view('pendidikan/index'); $this->load->view('templates/footer'); } else { if ($data) { $array = [ 'id_akun' => $data['akun']['id'], 'jenjang' => $this->input->post('f_jenjang'), 'institusi' => $this->input->post('f_institusi'), 'jurusan' => $this->input->post('f_jurusan'), 'tahunmulai' => $this->input->post('f_tahunmasuk'), 'tahunselesai' => $this->input->post('f_tahunlulus'), ]; //utk mengecek jika gambar yg di upload ada $upload_data = $_FILES['ijazah']['name']; if ($upload_data) { $config['allowed_types'] = 'jpg|jpeg|png|pdf'; $config['max_size'] = '2048'; $config['upload_path'] = './assets/doc/sertifikat/'; $this->load->library('upload', $config); if ($this->upload->do_upload('sertifikat')) { $new_ijazah = $this->upload->data('file_name'); $this->db->set('ijazah', $new_ijazah); } else { echo $this->upload->display_errors(); } } //insert to database $this->db->insert('pendidikan', $array); $this->session->set_flashdata('message', '<div class="alert alert-success" role="alert"> Data Berhasil ditambah</div>'); redirect('pendidikan'); } else { $this->session->set_flashdata('message', '<div class="alert alert-success" role="alert"> Data Gagal Disimpan</div>'); redirect('pendidikan'); } } }
问题修复方案
1. 修复表单验证失败时的视图数据传递
当表单验证失败加载pendidikan/index视图时,未传递$data['data']变量,导致视图无法找到$data。修改tambah方法的验证失败代码块:
if ($this->form_validation->run() == false) { $data['data'] = $this->pendidikan_m->get_pendidikan(); $this->load->view('templates/header', $data); $this->load->view('templates/top_bar', $data); $this->load->view('templates/sidebarmenu', $data); $this->load->view('pendidikan/index', $data); $this->load->view('templates/footer'); }
2. 修复文件上传字段名不匹配问题
表单中文件字段名为ijazah,但上传时调用do_upload('sertifikat'),字段名不匹配导致文件无法上传:
if ($this->upload->do_upload('ijazah')) { $new_ijazah = $this->upload->data('file_name'); $this->db->set('ijazah', $new_ijazah); }
3. 优化视图的foreach安全判断
在表视图中先判断$data是否有效,避免无效参数传入foreach:
<?php $no = 0; if (!empty($data) && is_array($data)) { foreach ($data as $pendidikan) : $no++; $jenjang = $pendidikan['jenjang']; $institusi = $pendidikan['institusi']; $jurusan = $pendidikan['jurusan']; $tahunmulai = $pendidikan['tahunmulai']; $tahunselesai = $pendidikan['tahunselesai']; $ijazah = $pendidikan['ijazah']; ?> <tr> <td><?php echo $no; ?></td> <td><?php echo $jenjang; ?></td> <td><?php echo $institusi; ?></td> <td><?php echo $jurusan; ?></td> <td><?php echo $tahunmulai; ?></td> <td><?php echo $tahunselesai; ?></td> <td><?php echo $ijazah; ?></td> <td><a href="<?= base_url('pendidikan/viewPdf/' . $pendidikan['id_pendidikan']); ?>" target="_blank"><?php echo $ijazah; ?></a></td> <td><a href="<?= base_url('pendidikan/edit/' . $pendidikan['id_pendidikan']); ?>" class="btn btn-sm btn-outline-primary">Edit</a> <a href="<?= base_url('pendidikan/delete/' . $pendidikan['id_pendidikan']); ?>" class="btn btn-sm btn-outline-danger">Hapus</a> </td> </tr> <?php endforeach; ?> <?php } else { ?> <tr> <td colspan="8" class="text-center">暂无数据</td> </tr> <?php } ?>
4. 修复模型SQL注入风险
模型直接拼接用户输入到SQL语句,改用查询构造器避免注入:
function get_pendidikan() { $email = $this->session->userdata('email'); return $this->db->select('*') ->from('pendidikan') ->join('akun', 'pendidikan.id_akun = akun.id') ->where('akun.email', $email) ->get() ->result_array(); }
内容的提问来源于stack exchange,提问作者labkes
相关产品推荐
相关产品推荐

