将数据数组插入数据库的表时,代码点火器中的数组到字符串转换错误



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

这是我控制器中的 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();
}

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

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();
}

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

我不知道你的非英语单词是什么,所以我将在我的演示中使用广义术语(我已经在我自己的 CI 项目中成功测试了这一点(。 我还打算将总子查询减少到 3 个,以减少我的代码段中的冗余。

$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()方法(。 我猜这是因为不同的数据库使用不同的语法来形成这些类型的插入 - 我不知道。

底线是,只要您从每个子 SELECT 上的一行中获取单个列值,这个单个查询的运行速度就会比运行 N 个单独的查询快得多,代码膨胀要少得多。 由于所有涉及的变量都是使用get_compiled_select()注入到 sql 字符串中,因此稳定性/安全性完整性应该是相同的。

相关内容

  • 没有找到相关文章

最新更新