1

我有一个更新 MD5 加密密码的表单。在此过程中,密码字段已更新为随机令牌,然后作为链接的一部分通过电子邮件发送给用户,然后该令牌用于匹配要更新的帐户。

我必须检查两个表,因为我们将管理员和用户分成不同的表。我收到以下 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">
4

2 回答 2

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 而不是密码要好得多。

查看https://www.codeigniter.com/userguide2/database/active_record.html

并供将来参考:https ://www.codeigniter.com/userguide2/libraries/encryption.html

于 2012-11-16T20:52:52.407 回答
2

更新两个表时,您需要指定它们的连接方式:

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

通常你会看到类似staff.admin_id=admin.id确保两个表连接在一起的东西。你在这里做的事情看起来很可怕。如果两个人的密码相同怎么办?你要同时改变它们。

WHERE admin.id=?在特定记录上更新为零会更安全。

于 2012-11-16T20:49:30.533 回答