2010-08-18 79 views
4

我正在使用Codeigniters Active記錄庫對我的數據庫上的列執行更新。Codeigniter Activerecord更新方法拒絕插入NULL值

下面是表

CREATE TABLE `schedules` (
`id` INT(11) NOT NULL AUTO_INCREMENT, 
`reservation_id` INT(11) NULL DEFAULT NULL, 
`title` VARCHAR(255) NOT NULL, 
`description` VARCHAR(512) NULL DEFAULT NULL, 
`start_date` DATE NOT NULL, 
`start_time` TIME NOT NULL, 
`end_time` TIME NULL DEFAULT NULL, 
`enabled` TINYINT(1) NULL DEFAULT '1', 
`status` ENUM('OPEN','RESERVED') NULL DEFAULT 'OPEN', 
PRIMARY KEY (`id`), 
INDEX `fk_schedules_reservations` (`reservation_id`), 
CONSTRAINT `fk_schedules_reservations` FOREIGN KEY (`reservation_id`) REFERENCES `reservations` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION 

的SQL我已經聲明reservation_id可爲空(reservation_id INT(11) NULL DEFAULT NULL

的問題是,CI似乎並不想送創建語句時爲NULL值。

$data['status'] = $this->Schedule->get_status_open(); 
$data['reservation_id'] = null; 
$this->Schedule->update($s_id, $data); 

的代碼位剛剛生成以下錯誤消息

Error Number: 1452 

Cannot add or update a child row: a foreign key constraint fails (`ethyme/schedules`, CONSTRAINT `fk_schedules_reservations` FOREIGN KEY (`reservation_id`) REFERENCES `reservations` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) 

UPDATE `schedules` SET `status` = 'OPEN', `reservation_id` = '' WHERE `id` = '4' 

據我所知,所有你需要做的就是將值設置爲NULL和AR應該拿起它是一個NULL值,但這似乎並非如此。只是不斷髮送空值。

我是新來的CI,我必須做其他事情才能使它工作嗎?有任何想法嗎?

+0

這原來是一個非問題。我使用的基本模型是使用xss_clean來過濾數據,並且它正在篡改如NULL,TRUE,FALSE等數據類型。添加一個排除列表解決了這個問題。以上是發送NULL數據的正確方法 – JohnP 2010-08-19 08:18:01

回答

20

嘗試:

$this->db->set('reservation_id', NULL); 

很可能是$數據的做法不喜歡爲NULL。

+0

優秀!那工作。可悲的是,這意味着我將無法使用$ data方法,除非我使用遍歷數組並設置數據的中介方法工作。無論如何,問題解決了。感謝您的幫助,大家 – JohnP 2010-08-19 05:18:59

+0

做了更多的挖掘,結果xss_clean正在咀嚼我的數據。爲數據類型添加了一個排除列表,以便忽略NULL,TRUE和FALSE。畢竟看起來這個用法是正確的:/ – JohnP 2010-08-19 08:18:51

+2

是的,我認爲這可能是一個錯誤,但我知道這種工作方式。您能否將該錯誤提交給BitBucket上的CodeIgniter問題跟蹤器,然後嘗試修復該問題。另外,您可以根據需要隨意混合$ data和 - > set()。 – 2010-08-24 12:10:02

0

您的reservations_id列引用保留表中的id列,對不對?您是否檢查過reservstions表中的列是否也允許有空值?如果它的主鍵和自動遞增,那很可能是問題所在。我不認爲你可以在一個表中有一列作爲空值,如果它被指定爲不能在被引用表中爲空的列的外鍵。 我爲你解釋清楚了嗎?

+0

這不是問題,因爲我使用null手動運行查詢而不是引號,並且它工作正常。我只需要實際上能夠發送空值而不是空白。沒有把這個變成一個自定義查詢,沒有任何想法。 – JohnP 2010-08-18 10:01:35

1

在CI中,關鍵字NULL始終必須是大寫。試試這個簡單的改變,看看是否有效。 參考用戶指南的相關位here.

+0

不行,我早些時候嘗試過,但仍然行不通。由於它是一個空數據類型,我認爲這種情況不會有太大的區別。 – JohnP 2010-08-18 12:31:04

+2

這是風格指南的一部分,對任何事情都沒有影響。 – 2010-08-18 13:02:42

+0

這麼想,但值得一試! – musoNic80 2010-08-18 13:13:01

2

我這樣處理它:用這個方法擴展CI_Model類來處理空值。你必須在每次你期望null時調用它。我不經常使用空值,因此這種方法適用於需要設置空值的情況。只需從數據數組中傳遞一個字符串'NULL'即可。這會取消數組成員並將其設置爲活動記錄緩存。

 class MY_Model extends CI_Model { 

     public function __construct() { 
      parent::__construct(); 
     } 

     /* Handles null values for active record data array. If 
     * $dataarray[$data_key] is string 'NULL', 
     * use active record set method to set null and unset the 
     * string 'NULL'. $data_array is by reference. 
     * @param - array the data array 
     * @param - data_key - string the key to be evaluated */ 
     protected function handle_null_active_record(&$data_array, $data_key){ 
     if ('NULL'==$data_array[$data_key]){ 
      $this->db->set($data_key, null); 
      unset($data_array[$data_key]); 
     } 
     } 

    } 
0

從CI 3.0.0的文件:

集()也將接受一個可選的第三個參數($逃逸),這將阻止如果設置爲轉義數據。

$this->db->set('reservation_id', 'NULL', false);