Ошибка преобразования массива в строку в Code Igniter при вставке массива данных в таблицу в базе данных - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь вставить массив данных в таблицу в базе данных, но ошибка говорит об ошибке преобразования массива в строку

Это функция post в моем контроллере, сначала я отправляю массив данных. Значениями массива будут имена и числа, а не id. Идентификатор - это только кодейдвл. Это будет передано моей модели

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'),
    );
}

после того, как данные из приведенного выше кода будут переданы модели. Я создал несколько новых переменных, которые являются идентификатором каждого имени значения в массиве данных. например, если значением data ['mk'] является Веб-сайт, тогда идентификатор будет равен 1, и этот идентификатор будет сохранен в переменной $ kodemk, и я делаю это для каждого значения в данных . Затем я создал new_data, в котором хранится массив ранее созданных идентификаторов. Затем я вставляю этот массив в одну таблицу в своей базе данных. Я думал, что все будет хорошо, но там говорилось об ошибке преобразования массива в строку. Что мне делать, чтобы я мог вставить этот массив в таблицу в моей базе данных?

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

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Всего вы совершаете 7 отдельных обращений к базе данных. Лучшая практика рекомендует вам всегда минимизировать количество обращений к базе данных для лучшей производительности. На самом деле ваша задача может быть выполнена за одно обращение к базе данных, если вы настроили правильный запрос INSERT с помощью SELECT подзапросы.

Я не знаю, какие у вас sh неанглийские слова, поэтому я буду использовать обобщенные термины в своей демонстрации (я успешно протестировал это в своем собственном проекте CI). Я также собираюсь уменьшить общее количество подзапросов до 3, чтобы уменьшить избыточность в моем фрагменте. 'не разрешать подзапросы в части VALUES (скажем, если вы использовали метод set()). Я предполагаю, что это связано с тем, что разные базы данных используют разный синтаксис для формирования этих типов INSERT - я не знаю.

Суть в том, , если вы выбираете одно значение столбца одна строка в каждом из этих подвыборов, этот единственный запрос будет выполняться быстрее и с гораздо меньшим раздутием кода, чем выполнение N отдельных запросов . Поскольку все задействованные переменные вводятся в строку sql с использованием get_compiled_select(), целостность стабильности / безопасности должна быть одинаковой.

1 голос
/ 19 июня 2020

Вероятно, вы захотите использовать row() вместо result(), потому что он будет содержать только один результат, который вы хотите. Если вы хотите использовать result() и сохранить несколько значений, вам нужно будет использовать их от implode до concatenate и сохранить как 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...