2017-06-18 81 views
0

這是最奇怪的問題。如果我將它作爲查詢字符串編寫,我的更新查詢將一致工作。這裏是我的模型功能:CodeIgniter UPDATE可以在第一次但不是連續的AJAX調用中工作

public function approveListing($params) 
{ 
    //This always works. 
    $sql = "UPDATE `assets` set approved = ".$params['approved']." WHERE as_id = ".$params['as_id'].""; 
    $this->db->query($sql); 

    // and I use this select query to detect the actual updated value change. 
    $this->db->select('approved'); 
    $this->db->where('as_id', $params['as_id']); 
    $query = $this->db->get('assets'); 
    foreach($query->result() as $row) 
    { 
     $params['approved'] = $row->approved; 
    } 
    return $params; 
} 

...和輸出將是這個樣子:

as_id = 260 
approved = 1 (or 0, if the input param is 0) 

但是,如果使用查詢生成器方法,而不是一個SQL字符串,它的工作原理恰好一次:

public function approveListing($params) 
{ 
    // This only works on the first ajax call. After that, no update occurs. 
    $this->db->set('approved', $params['approved']); // this will be a value of 1 or 0 
    $this->db->where('as_id', $params['as_id']); 
    $this->db->update('assets'); 
    $params['updated'] = $this->db->affected_rows(); 

    // and I use this select query to detect the actual updated value change. 
    $this->db->select('approved'); 
    $this->db->where('as_id', $params['as_id']); 
    $query = $this->db->get('assets'); 
    foreach($query->result() as $row) 
    { 
     $params['approved'] = $row->approved; 
    } 
    return $params; 
} 

...和輸出將是這個樣子:

as_id = 260 
approved = 1 
updated = 0 <!- notice this is the affected_rows() value. :(-> 

$params['approved']10。在表assets領域approved是一個位(1)

的功能正在從控制器功能,它本身正在從一個AJAX調用被調用,它發送一組單選按鈕的點擊的變化稱爲(或者' 1'或'0')。

在查詢生成器更新的情況下,我還捕獲affected_rows。第一次執行查詢時,affected_rows()= 1。此後每次受影響的行數= 0,並通過檢查PHPMyAdmin中的記錄,我可以看到該值不想更改。

+0

什麼是生成的更新查詢(使用$這個 - > DB-> last_query ())以及它與原始查詢有何不同? – TimBrownlaw

+0

@TimBrownlaw這是生成的查詢:UPDATE'assets' SET'approved' ='1'WHERE'as_id' ='260'這看起來與手寫的sql字符串幾乎相同,但我認爲我看到了問題。因爲'批准'是一種BIT類型,我認爲它在引用價值的單引號:'approved' ='1'。 – TARKUS

回答

2

嗯,我真的不喜歡回答我自己的問題,但是因爲我確實找到了答案,並且由於問題(儘管很少)不是「太局部」,而實際上是其他編程人員要運行的東西如果他們嘗試更新MySQL數據類型BIT(爲什麼我們沒有看到關於數據類型BIT的很多問題是因爲它是最新的MySQL或MariaDB數據類型之一),那麼這就是發生了什麼。

笨查詢生成器包裝了單引號,像這樣的值:

UPDATE `assets` set approved = '1' WHERE as_id = 260 

MySQL不喜歡這樣。你可以只是手寫你的查詢,像這樣:

$sql = "UPDATE `assets` set approved = ".$params['approved']." WHERE as_id = ".$params['as_id'].""; 
$this->db->query($sql); 

......但這不是一個好的解決方案,它是一個copout。查詢生成器應該工作。

你所要做的就是聲明價值爲INT,你做的方式是這樣的:

$this->db->set('approved', (int) $params['approved']); 
$this->db->where('as_id', $params['as_id']); 
$this->db->update('assets'); 
+1

有趣的小Gotcha :)。是的,你需要將它轉換爲int類型。我有一個快速發揮,並確認你的發現。 – TimBrownlaw

+1

@TARKUS它比CodeIgniter更多的PHP!鬆散類型的值。我們非常習慣認爲字符串和數字在PHP中可以互換。 – MackieeE

相關問題