将'0'值预先设置为NULL

时间:2013-07-26 18:44:08

标签: php codeigniter validation

在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)

5 个答案:

答案 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。

Tested here.

答案 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')
);

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