在CodeIgniter中,我想准备一个从表单返回的值,这样如果它是0
,它实际上将被插入为NULL
。
我在控制器类之外创建了一个函数:
function prep_zero_to_null($int)
{
if ($int == 0)
{
return NULL;
}
else
{
return $int;
}
}
在表单验证中,我这样做:
$this->form_validation->set_rules('category_id', 'Category',
'required|integer|prep_zero_to_null');
但是,CI仍会尝试在数据库中插入零作为'0'
,这会破坏我的一个外键约束。
有趣的是,如果我在NULL
函数中将25
替换为prep_zero_to_null
,则CI确实会识别它并插入25
而不是'0'
}。所以我的准备功能确实被调用了,但CI不会因此而允许NULL
,而是将其转换为'0'
。
我如何实现我的目标?
修改:对于那些想知道的人,category_id
字段确实允许空:
`category_id` int(10) unsigned DEFAULT NULL
确切的错误是:
INSERT INTO `articles` (`category_id`, `order`, `title`, `text`)
VALUES ('0', '0', 'test', 'test')
^
Should be NULL
Cannot add or update a child row: a foreign key constraint fails
(`db`.`articles`, CONSTRAINT `articles_ibfk_1` FOREIGN KEY
(`category_id`) REFERENCES `categories` (`id`)
ON DELETE SET NULL ON UPDATE CASCADE)
答案 0 :(得分:1)
快看一下我认为问题是你的$ int == 0. $ int是一个实际的0类型整数还是一个字符串?在这种情况下,正确的检查将是$ int =='0'。
答案 1 :(得分:1)
Codeigniter验证函数不会根据您返回的内容设置字段值,验证函数应返回TRUE或FALSE以声明某些内容有效。
如果您在更改某些内容的值之后,您需要通过引用接受变量并在函数中修改它,然后您可以返回TRUE以便通过验证。
最好的解决方案是在将数据插入数据库之前进行检查。不依赖验证库来做这种肮脏的工作。
答案 2 :(得分:0)
如果要向数据库插入null,则需要返回值为“null”的字符串。
function prep_zero_to_null($int) {
return ($int == 0) ? 'NULL' : $int;
}
答案 3 :(得分:0)
您是否尝试过取消设置变量。它有点难看,但它应该为值返回NULL。
答案 4 :(得分:0)
我在CodeIgniter的GitHub错误跟踪器上提交了一个问题,因为这似乎是一个错误。 https://github.com/EllisLab/CodeIgniter/issues/2563
目前,模型级别的解决方法如下:
$category_id = prep_zero_to_null($this->input->post('category_id'));
$data = array
(
'category_id' => $category_id,
'order' => $this->input->post('order'),
'title' => $this->input->post('title'),
'text' => $this->input->post('text')
);
编辑:显然,这是正确的方法,因为在验证/控制器级别应该只有字符串。