1

0CodeIgniter では、フォームから返された値が である場合、実際には として挿入されるように準備したいと考えてい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'はデータベースと同様にゼロを挿入しようとしますが、これは外部キー制約の 1 つを破ります。

興味深いことにNULL、たとえば関数25内でを置き換えるとprep_zero_to_null、CI は実際にそれを認識し、25代わりにを挿入し'0'ます。したがって、私の準備関数は実際に呼び出されますが、CI はNULLその結果として許可せず、代わりに に変換し'0'ます。

どうすれば私が望むものを達成できますか?

編集:疑問に思っている人のために、category_idフィールドはnullを許可します:

`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 に答える