【问题标题】:Array to string conversion error in Code Igniter when inserting array of data into table in database将数据数组插入数据库表时,代码点火器中的数组到字符串转换错误
【发布时间】:2020-06-19 05:27:37
【问题描述】:

我正在尝试将一个数据数组插入到数据库中的一个表中,但是一个错误说数组到字符串转换错误

这是我的控制器中的 post 函数,首先我发布一个数据数组。数组的值将是名称和数字,它们不是 id。 id 只是 kodejdwl。这将传递给我的模型

function index_post() {
    $data = array(
        'kodejdwl' => $this->post('kodejdwl'),
        'tahun_akad' => $this->post('kode_tahun_akad'),
        'semester' => $this->post('semester'),
        'mk' => $this->post('mk'),
        'ruangan' => $this->post('ruangan'),
        'nama_dosen' => $this->post('nama_dosen'),
        'namakelas' => $this->post('nama_kelas'),
        'jam_mulai' => $this->post('jam_mulai'),
        'jam_selesai' => $this->post('jam_selesai'),
    );
}

将上述代码中的数据传递给模型后。我创建了一些新变量,它们是数组数据中每个值的名称的 id。例如,如果 data['mk'] 的值是网站,那么 id 将为 1,并且该 id 将存储在变量 $kodemk 中,我对数据中的每个值都执行此操作。然后我创建了 new_data,它存储了我之前制作的 id 数组。然后我将该数组插入到我的数据库中的一个表中。我认为这会很好,但它说数组到字符串转换错误。我应该怎么做才能将该数组插入到我的数据库中的表中?

public function insert($data){
    $this->db->select('thn_akad_id');
    $tahunakad_id = $this->db->get_where('tik.thn_akad',array('tahun_akad'=>$data['tahun_akad'],'semester_semester_nm'=>$data['semester']))->result();
    $this->db->flush_cache();

    $this->db->select('kodemk');
    $kode_mk =  $this->db->get_where('tik.matakuliah',array('namamk'=>$data['mk']))->result();
    $this->db->flush_cache();

    $ruangan = $this->db->get_where('tik.ruangan', array('namaruang' => $data['ruangan']), 1)->result();
    $this->db->flush_cache();

    $this->db->select('nip');
    $nip_dosen = $this->db->get_where('tik.staff',array('nama'=>$data['nama_dosen']))->result();
    $this->db->flush_cache();

    $this->db->select('kodeklas');
    $kodeklas = $this->db->get_where('tik.kelas',array('namaklas'=>$data['namakelas']))->result();
    $this->db->flush_cache();

    $this->db->select('kode_jam');
    $kode_mk =  $this->db->get_where('tik.wkt_kuliah',array('jam_mulai'=>$data['jam_mulai'],'jam_selesai'=>$data['jam_selesai']))->result();
    $this->db->flush_cache();

    $new_data = array(
        'kodejdwl' => $data['kodejdwl'],
        'thn_akad_thn_akad_id' => $tahunakad_id,    
        'matakuliah_kodemk' => $kode_mk,
        'ruangan_namaruang' => $ruangan,
        'staff_nip' => $nip_dosen,
        'kelas_kodeklas' => $kodeklas,          
    );

    $insert = $this->db->insert('tik.jadwal_kul', $new_data);
    return $this->db->affected_rows();
}

【问题讨论】:

  • tik.jadwal_kul 是你的表名吗?
  • 是的,这是我的表名

标签: php arrays codeigniter


【解决方案1】:

您可能希望使用row() 而不是result(),因为它只会包含您想要的一个结果。如果您想使用result() 并存储多个值,那么您必须使用implodeconcatenate 并将其存储为string
我已经为您的问题编写了一个可能的解决方案;有些东西丢失了,所以我在 cmets 中提到了它们。看看这对你有没有帮助。

public function insert($data){

    $this->db->select('thn_akad_id');
    $tahunakad_id = $this->db->get_where('tik.thn_akad',array('tahun_akad'=>$data['tahun_akad'],'semester_semester_nm'=>$data['semester']))->row(); // use row here
    $this->db->flush_cache();

    $this->db->select('kodemk');
    $kode_mk =  $this->db->get_where('tik.matakuliah',array('namamk'=>$data['mk']))->row();
    $this->db->flush_cache();

    // remove your_ruangan_column with your desired column name
    $this->db->select('your_ruangan_column');
    $ruangan = $this->db->get_where('tik.ruangan', array('namaruang' => $data['ruangan']), 1)->row();
    $this->db->flush_cache();

    $this->db->select('nip');
    $nip_dosen = $this->db->get_where('tik.staff',array('nama'=>$data['nama_dosen']))->row();
    $this->db->flush_cache();

    $this->db->select('kodeklas');
    $kodeklas = $this->db->get_where('tik.kelas',array('namaklas'=>$data['namakelas']))->row();
    $this->db->flush_cache();

    // Not sure where this ↓↓ is being used but you can use it the same way as others
    $this->db->select('kode_jam');
    // duplicate variable name here ↓↓ (fix this)
    $kode_mk =  $this->db->get_where('tik.wkt_kuliah',array('jam_mulai'=>$data['jam_mulai'],'jam_selesai'=>$data['jam_selesai']))->row();
    $this->db->flush_cache();

    $new_data = array(
        'kodejdwl' => $data['kodejdwl'],
        'thn_akad_thn_akad_id' => $tahunakad_id->thn_akad_id, // {$tahunakad_id} consists an object with the key {thn_akad_id}-- table_column_name
        'matakuliah_kodemk' => $kode_mk->kodemk, // ...
        'ruangan_namaruang' => $ruangan->your_ruangan_column, // ... 
        'staff_nip' => $nip_dosen->nip, // ...
        'kelas_kodeklas' => $kodeklas->kodeklas // ...         
    );

    $insert = $this->db->insert('tik.jadwal_kul', $new_data);
    return $this->db->affected_rows();
}

【讨论】:

    【解决方案2】:

    您总共对数据库进行了 7 次单独的访问。 最佳实践建议您始终尽量减少访问数据库以获得最佳性能。事实是,只要您设置正确的 INSERT 查询,您的任务就可以在一次访问数据库中执行选择子查询。

    我不知道你的非英语单词是什么,所以我将在我的演示中使用通用术语(我已经在我自己的 CI 项目中成功测试过)。我还将子查询总数减少到 3 个,以减少我的 sn-p 中的冗余。

    $value1 = $this->db->select('columnA')->where('cond1', $val1)->get_compiled_select('childTableA');
    $value2 = $this->db->select('columnB')->where('cond2', $val2)->get_compiled_select('childTableB');
    $value3 = $this->db->select('columnC')->where('cond3', $val3)->get_compiled_select('childTableC');
    
    return (int)$this->$db->query(
        "INSERT INTO parentTable
             (column1, column2, column1)
         VALUES (
             ($value1),
             ($value2),
             ($value3)
         )"
    );
    // to mirror your affected rows return... 1 will be returned on successful insert, or 0 on failure
    

    当然这不是使用 ActiveRecord 技术来形成完整的 INSERT 查询,但这是因为 CI 不允许在 VALUES 部分中使用子查询(例如,如果您要使用 set() 方法)。我猜这是因为不同的数据库使用不同的语法来形成这些类型的 INSERT——我不知道。

    底线是,只要您从这些子 SELECT 中的每一个的单行中获取单列值,与运行 N 个个别查询。因为所有涉及的变量都使用get_compiled_select() 注入到sql 字符串中,所以稳定性/安全完整性应该是相同的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2019-07-18
      相关资源
      最近更新 更多