2012-11-16 30 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

我正在使用放置在电子邮件字段中的随机令牌来键入要更新哪个用户。 –