1

在 CodeIgniter 中,我想准备一个从表单返回的值,这样如果它是 a 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为,例如,CI 确实会识别它并插入而不是. 所以我的准备函数确实被调用了,但是 CI 不会因此而允许它,而是将它转换为.25prep_zero_to_null25'0'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)
4

5 回答 5

1

只是快速看一下,我认为问题在于您的 $int == 0。 $int 是实际的 0 类型整数还是字符串?在这种情况下,正确的检查将是 $int == '0'。

于 2013-07-26T18:55:22.473 回答
1

Codeigniter 验证函数不会根据您返回的内容设置字段值,您的验证函数应返回 TRUE 或 FALSE 以说明某些内容是否有效。

如果您在更改某物的值之后,您需要通过引用接受变量并在函数中对其进行修改,然后您可以返回 TRUE 以便它通过验证。

最好的解决方案是在将数据插入数据库之前进行检查,而不是依赖验证库来完成这种肮脏的工作。

于 2013-07-27T04:05:35.607 回答
0

如果要将 null 插入数据库,则需要返回值为“null”的字符串。

function prep_zero_to_null($int) {
    return ($int == 0) ? 'NULL' : $int;
}
于 2013-07-26T19:05:18.017 回答
0

您是否尝试过取消设置变量。这有点难看,但它应该为该值返回 NULL 。

在这里测试。

于 2013-07-26T19:17:41.670 回答
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')
);

编辑:显然,这是正确的方法,因为在验证/控制器级别应该只有字符串。

于 2013-07-26T19:50:31.717 回答