2012-12-03 86 views
0

我在通過PHP類更新MySQL數據庫時遇到了一些問題(這是我第一次真正進入PHP類,因此我可能會缺少一些非常基本的元素)。我已經包含了與我遇到的問題相關的代碼(即,沒有正確更新MySQL表)。遇到PHP類和MySQL插入/更新的問題

爲了快速解釋我的代碼,我在構造對象時從數據庫中提取用戶信息。然後,我調用函數modify_column()來增加或減少我拉出的數據的數值。最後,我運行save()來更新MySQL表。

我有兩個問題:(1)$this->info沒有被所述修改函數正確地更新(例如,如果我modify_column('age', '1'),一個的var_dump顯示age int(3)而非age string(2) = 10(假設原始年齡爲9)和(2。 ),更新查詢不起作用,我假設這是因爲我的第一個問題引起的變量大小不正確。

代碼片段(我的數據庫函數基於PDO包裝器,它們有總是工作得很好):

class user { 

    public $id; 

    public function __construct($id) { 

     global $db; 

     /* pull the user's information from the database */ 
     $bind = array(':id' => $id); 
     $result = $db->select('user', 'id = :id', $bind, '*', SQL_SINGLE_ROW); 

     $this->id = $result['id']; 
     $this->info = $result; 
    } 

    /* 
    * Update the user's MySQL table, thereby saving the data. 
    */ 
    public function save() { 

     global $db; 

     $bind = array($this->id); 
     $db->update('users', $this->info, 'id = ?', $bind); 

    } 

    public function modify_column($column, $amount) { 
     $this->info[$column] += $amount; 
    } 
} 

另外,請求e讓我知道是否有更好的方法來完成我正在嘗試完成的任務(即,使用類函數快速修改表中的數值。

謝謝!

回答

0

您似乎沒有任何條款來鍵入您的變量。當您將數據添加到$this->info時,所有值都將設置爲字符串。您不想在字符串上進行增量數學運算(即+=-=等)。您需要將這些值轉換爲整數。我的建議是添加一個擁有你的類屬性和類型數組的類屬性。在設置$info陣列時,您將能夠根據其類型投射所有值。

因此,像這樣

protected $fields = array(
    'age' => 'integer', 
    'name' => 'string', 
    // etc. 
} 

然後你就可以添加這樣的函數

protected function type_cast(&$value, $key) { 
    // field type to use 
    $type = $this->fields[$key]; 
    if ($type === 'integer') { 
     $value = (integer)$value; 
    } else if ($type === 'string') { 
     $value = (string)$value; 
    } // etc. 
} 

而且在你的構造,只是走$result通過type_cast功能:

array_walk(&$result, array($this, 'type_cast')); 
$this->info = $result; 

您可能還需要確保您的ID值c如果您在數據庫中使用整數,則爲整數。

我不確定你的數據庫抽象如何工作,很難說出發生了什麼。我會建議迴應查詢本身,並嘗試對數據庫進行嘗試,或者查看正在返回的MySQL錯誤,以便了解哪裏出了問題。