db_insert и пустые значения

Главные вкладки

Аватар пользователя grincha grincha 14 января 2012 в 3:22

Добрый день.

Никак не могу реализовать вставку данных с помощью db_insert.
Вставка выполняется с помощью: db_insert('test_table')->fields($tbl_structure)->values($tbl_data)->execute();

$tbl_data = array_combine($tbl_structure, explode("\t", $sub_str));

$tbl_structure = array(10) {
[0]=>
string(7) "field_0"
[1]=>
string(7) "field_1"
[2]=>
string(7) "field_2"
...}

$tbl_data = array(10) {
["field_0"]=>
string(6) "data_0"
["field_1"]=>
string(0) ""
["field_2"]=>
string(6) "data_3"
...}

execute() вызывает ошибку: General error: 1366 Incorrect integer value: '' for column field_1...

Собственно вопрос. Как правильно вызвать db_insert или передать пустое значение в виде '' через $tbl_data?

ЗЫ: Данных много, структуру таблицы менять не желательно.

Комментарии

Аватар пользователя OldWarrior OldWarrior 14 января 2012 в 5:08

"grincha" wrote:
General error: 1366 Incorrect integer value: '' for column field_1...

А вы пытаетесь вставить строку (или что-то вроде этого):

<?php
$tbl_data 
= array(10) {
[
"field_0"]=>
string(6"data_0"
["field_1"]=>
string(0""
["field_2"]=>
string(6"data_3"
...}
?>

Может, должно быть так:

<?php
$tbl_data 
= array {
  
'field_0' => 'some value',
  
'field_1' => NULL,
  
'field_2' => 'some value',
...}
?>
Аватар пользователя OldWarrior OldWarrior 14 января 2012 в 5:07

В целом - если нужно вставить пустое (NULL) значение, то соответственно нужно для поля (колонки) в БД отключить свойство NOT NULL.

Аватар пользователя grincha grincha 14 января 2012 в 11:53

"OldWarrior" wrote:
Может, должно быть так:

Для int поля передать null не получается: Integrity constraint violation: 1048 Column 'field_1' cannot be null...

"OldWarrior" wrote:
в БД отключить свойство NOT NULL.

В БД поле определено как:
`field_1` INT(11) DEFAULT '0'

Аватар пользователя OldWarrior OldWarrior 14 января 2012 в 12:34

Ну передайте ноль для пустого значения.

<?php
$tbl_data = array {
'field_0' => 'some value',
'field_1' => isset($my_numeric_value) ? $my_numeric_value : 0,
'field_2' => 'some value',
...}
?>

Аватар пользователя grincha grincha 14 января 2012 в 22:16

Проблема в том, что данных много и городить дополнительные проверки не хочется, сильно замедляется обработка.

Поэтому и возник вопрос. Как передать в db_insert пустое значение ('' или null), чтобы отработал механизм подстановки БД (default values).