You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向pendidikan表添加数据时出现Undefined variable: data等错误求助

向pendidikan表添加数据时出现Undefined variable: data和Invalid argument supplied for foreach()错误

此前功能正常,现在使用模态框添加数据时触发以下错误:

  • Undefined variable: data
  • Invalid argument supplied for foreach()

错误信息

错误截图1
错误截图2

添加数据模态框视图代码

<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">&times;</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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:21:59