2012-11-16 32 views
1

我有一個更新MD5加密密碼的表單。在此過程中,密碼字段已更新爲隨機令牌,然後通過電子郵件將該令牌發送給用戶,作爲鏈接的一部分,然後該令牌用於匹配要更新的帳戶。CodeIgniter SQL更新和聯合在一起?

我要檢查兩個表,因爲我們爆發了管理員和用戶分成不同的表。我收到以下SQL錯誤。 SQL和CodeIgniter對我來說都是非常新的。

SQL錯誤:

Error Number: 1064 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION UPDATE staff SET staff_password = '098f6bcd4621d373cade4e832627b4f6' WHERE' at line 1 

UPDATE admin SET admin_password = '098f6bcd4621d373cade4e832627b4f6' WHERE admin_password = 'fd323219f98afd367fee9907173012db' UNION UPDATE staff SET staff_password = '098f6bcd4621d373cade4e832627b4f6' WHERE staff_password = 'fd323219f98afd367fee9907173012db' 

型號代碼:

public function update_password() { 
    $sql = "UPDATE admin SET admin_password = ? WHERE admin_password = ? UNION UPDATE staff SET staff_password = ? WHERE staff_password = ?"; 
    $password = $this->input->post('password'); 
    $token = $this->input->post('token'); 
    $query = $this->db->query($sql, array($password, $token, $password, $token)); 

    if($query->num_rows() == 1) { 
     return true; 
    } else { 
     return false; 
    } 
} 

令牌被設置爲在視圖中隱藏字段:

<input type="hidden" name="token" value="<?php echo $token;?>" id="token"> 
+1

FYI:MD5是*不*對密碼進行加密的安全方式。現在還沒有很長時間:http://stackoverflow.com/a/770923/183254 http://en.wikipedia.org/wiki/MD5 – stormdrain

+0

謝謝。我意識到這一點,我們將在移居前採取更安全的保護措施。現在這是建立網站框架的問題。 –

回答

3

您可以單獨更新表:

$this->db->update('admin',array('admin_password'=>'098f6bcd4621d373cade4e832627b4f6'),'id = 123'); 
$this->db->update('staff',array('staff_password'=>'098f6bcd4621d373cade4e832627b4f6'),'id = 456'); 

您還可以使用方法鏈:

$this->db->where('id','123')->update('admin',array('admin_password'=>'newpass')); 

正如tadman說,更好的去檢查用戶ID,而不是密碼。

退房http://ellislab.com/codeigniter/user_guide/database/active_record.html

而且以供將來參考:http://ellislab.com/codeigniter/user_guide/libraries/encryption.html;)

+0

正確使用CodeIgnighter的好答案。 – tadman

2

當更新兩個表,你需要指定他們如何加入:

UPDATE admin, staff 
    SET admin_password=? staff_password=? 
    WHERE admin_password=? AND staff_password = ? 

通常你會看到類似staff.admin_id=admin.id,以確保兩個表連接在一起。你在這裏做什麼看起來很可怕。如果兩個人擁有相同的密碼怎麼辦?你會改變他們兩個。

這是一個很大安全與WHERE admin.id=?更新到零上特定記錄。

+0

我同意這看起來有點不方便。我會考慮爲他們在電子郵件中點擊的網址添加另一個唯一標識符。 –

+0

如果您通過電子郵件發送此郵件,請創建一個**隨機令牌**,該令牌**無法被猜出來解決您應該更新哪個用戶。通過ID引用是一個非常糟糕的主意。 – tadman

+0

我正在使用放置在電子郵件字段中的隨機令牌來鍵入要更新哪個用戶。 –