2012-11-17 36 views
0

我正在使用jQuery datagrid插件来制作一个简单的工具来编辑我的用户在网站的管理区域的表。当用户注册时,我将密码存储为md5()。当我尝试更新表时,它会重新调整密码,从而使其无法使用。我已经尝试了几种验证密码的方法与数据库中的方法相同,但它们都没有工作。不匹配md5密码

这里是我的更新代码:

PHP

<?php 
require_once("../class/TimeClock.class.php"); 

$tc = new TimeClock(); 
$id = $_POST['id']; 
$username = $_POST['username']; 
$password = $_POST['password']; 
$email = $_POST['email']; 
$active = $_POST['active']; 
$role = $_POST['role']; 
$emp_id = $_POST['emp_id']; 

if($tc->validatePass($id, $password)) { 
try { 
    $tc->connect(); 
    $query = $tc->dbh->prepare("UPDATE us_users SET username=:username,email=:email,active=:active,role=:role,emp_id=:emp_id WHERE id=:id"); 
    $query->execute(array(':username' => $username, ':email' => $email, ':active' => $active, ':role' => $role, ':emp_id' => $emp_id, ':id' => $id)); 
    $tc->close(); 
} catch (PDOException $e) { 
    throw new Exception('Something bad happened' . $e->getMessage()); 
} 
} else { 
try { 
    $password = md5($password); 
    $tc->connect(); 
    $query = $tc->dbh->prepare("UPDATE us_users SET username=:username,password=:password,email=:email,active=:active,role=:role,emp_id=:emp_id WHERE id=:id"); 
    $query->execute(array(':username' => $username, ':password' => $password, ':email' => $email, ':active' => $active, ':role' => $role, ':emp_id' => $emp_id, ':id' => $id)); 
    $tc->close(); 
} catch (PDOException $e) { 
    throw new Exception('Something bad happened' . $e->getMessage()); 
} 
} 

echo json_encode(array(
'id' => $id, 
'username' => $username, 
'password' => $password, 
'email' => $email, 
'active' => $active, 
'role' => $role, 
'emp_id' => $emp_id 
)); 
?> 

我validatePasss()函数:

PHP

function validatePass($id, $pass) { 
    try { 
    $this->connect(); 
    $result = $this->dbh->prepare("SELECT username, password FROM us_users WHERE id=:id"); 
    $result->execute(array(':id' => $id)); 
    $userObj = $result->fetch(PDO::FETCH_ASSOC); 
    } catch(PDOException $e) { 
     throw new Exception('Something bad happened' . $e->getMessage()); 
     die(); 
    } 
    if($pass == $userObj['password']) { 
     return true; 
    } else { 
     return false; 
    } 
    $this->close(); 
} 

我知道mysql_代码过时,然而,当我尝试使用PDO时会抛出错误,我认为它与组件或其他东西有关。

感谢您提供任何帮助。

编辑:更改函数为纯PDO,这里是一个数据网格的图像,所以你看到密码存储为一个散列,并且,除非改变,应作为匹配传递给更新脚本到数据库中的内容。

http://www.bolinconstruction.com/timeclock/datagrid.png

+0

什么错误?如果你不能给我们提供线索,不能提供很多帮助。 – Brad

+0

杜,对不起。代码永远不会显示密码匹配,而是始终返回md5()密码,因此,如果我编辑了任何详细信息,用户就无法登录。 – FireCrakcer37

+0

是不是比较明文密码从形式与md5存储在数据库? –

回答

0

答案在我想通了之后实际上很简单。在最初的代码中,我正在轮询数据库以获取随表单提交的用户名的密码。如果用户名被改变了,那么查询就会失败,从而改变密码。通过设置它来根据ID来轮询数据库,问题似乎已经纠正了。谢谢大家的帮助,如果没有你们,我绝不会想到这一点。

1

在你validatePass()功能,必须比较

if(md5($pass) == $userObj['password']) { 
    return true; 
} else { 
    return false; 
} 

前散列密码你可以做同样的查询

select id 
from from us_users 
where username = :username and password = :password 

然后

$result->execute(array(':username' => $username, ':password' => md5($password))); 

并测试行数> 0.

+0

密码已经是哈希值,除非它已在表单中更改。基本上,除非我更改表单上的密码字段,否则它将首先传回与数据库相同的值。用firbug,我确定这是真的;但是,它仍然在每次更新时更改密码。 – FireCrakcer37

+0

信任来自互联网的md5散列与将未散列的密码存储在数据库中相同。 –