Правильный способ вставить NULL в базу данных с CodeIgniter - PullRequest
10 голосов
/ 17 марта 2011

У меня есть данные ExtJS из комбо-поля в CodeIgniter. CodeIgniter считывает опубликованные данные и запускает db-> insert для обновления базы данных mssql.

Проблема в том, что если пользователь не выбирает выбор из выпадающего списка, он отправляется в CodeIgniter как ничто, Codeignighter затем считывает этот фрагмент опубликованных данных в виде пустой строки и пытается записать это в поле int в базе данных. вызывает ошибку.

Мне кажется, мне нужен CodeIgniter для обработки строки как NULL, если она пуста, и числа, если оно таковое. Я пытался использовать php-тип juggling (int) для его преобразования, но он принимает значение 0. Это недопустимое значение, поскольку оно не соответствует ни одному выделению в моем поле типа int или int в моей БД.

Есть ли способ заставить CodeIgniter обрабатывать пустые строки как NULLS вместо пустых строк?

[ИЗМЕНЕНО ДЛЯ ДОБАВЛЕНИЯ КОДА]

{
//ExtJS combo object
xtype: 'combo',
id: 'Referrer',
store: new Ext.data.Store({
    proxy: new Ext.data.HttpProxy({
        url: '/referrals/index.php/referrers/read',
        method: 'POST'
    }),
    reader: new Ext.data.JsonReader({
        root: 'results',
        fields: [
            {name: 'ID'},
            {name: 'Referrer'}
        ]
    })
}),
displayField: 'Referrer',
valueField: 'ID',
value: 1,
typeAhead: true,
hiddenName: 'Referrers_ID',
mode: 'remote',
triggerAction: 'all',
fieldLabel: 'Referrer',
selectOnFocus: true,
anchor: '100%'
}

//CI CODE TO GRAB FROM POST INTO AN ARRAY THEN OUT TO THE DB
public function create(){
    $data = array(  
        'FirstName' => $this->input->post('FirstName', false),
        'LastName' => $this->input->post('LastName', false),
        'DOB' => $this->input->post('DOB', false),
        'Email' => $this->input->post('Email', false),
        'Phone' => $this->input->post('Phone', false),
        'StudentNo' => $this->input->post('StudentNo', false),
        'Sex' => $this->input->post('Sex', false),
        'Advisors_ID' => $this->input->post('Advisors_ID', false),
        'DateSeen' => $this->input->post('DateSeen', false),
        'Classifications_ID' => join(",", $this->input->post('Classifications_ID', false)),
        'Referrers_ID' => $this->input->post('Referrers_ID', false),
        'Referrals' => $this->input->post('Referrals', false),
        'ReferralNotes' => $this->input->post('ReferralNotes', false),
        'Registration1' => $this->input->post('Registration1', false),
        'Registration2' => $this->input->post('Registration2', false),
        'Notes' => $this->input->post('Notes', false)
    );

    $this->db->insert('Clients', $data);
    $insert_id = $this->db->insert_id();
}

Ответы [ 3 ]

10 голосов
/ 17 марта 2011

Предполагая, что ваша переменная называется $ myvar И предполагая, что вы сделали всю проверку, проверку и приведение ошибок до этого.

$myvar  = empty($myvar) ? NULL : $myvar;

Это даст правильные данные для codeignitor.

2 голосов
/ 17 марта 2011

Есть два способа решения вышеупомянутой проблемы.

Во-первых, вы можете просто изменить поле базы данных (при условии, что вы используете MySQL) с «NOT NULL» на «NULL», чтобы пустые строки автоматически конвертировались в NULL с помощью MySQL и не требовали бы изменений в вашем коде.

Во-вторых, вы можете запустить запрос, чтобы сказать CodeIgniter обнулить строку как таковую

$r = ($this->input->post('r') != FALSE) ? $this->input->post('r') : NULL;

Если вам понадобится функция 'null' чаще, рассмотрите возможность создания библиотеки или помощника в CodeIgniter с приведенным выше кодом в виде функции.

0 голосов
/ 23 мая 2016

Это сработало для меня :) Я назначил двойную строку одинарных кавычек, когда входное значение NULL или пусто

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...