0

jQuery データグリッド プラグインを使用して、サイトの管理領域でユーザーのテーブルを編集するための簡単なツールを作成しています。ユーザー登録時にパスワードを 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
));
?> 

私の validatePass() 関数:

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

4

2 に答える 2

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 をテストします。

于 2012-11-17T16:44:21.523 に答える
0

考えてみたら、答えは実は簡単でした。最初のコードでは、フォームで送信されたユーザー名のパスワードをデータベースでポーリングしていました。ユーザー名が変更された場合、もちろんクエリは失敗するため、パスワードが変更されます。代わりにIDに基づいてデータベースをポーリングするように設定することで、問題は自動的に修正されたようです。皆さんの助けに感謝します、私はあなたたちなしでこれを理解することは決してなかったでしょう。

于 2012-11-17T16:50:22.163 に答える