2014-09-08 4 views
3

Я пытаюсь написать сценарий для хеширования временных паролей. В настоящее время временный пароль и хешированная версия хранятся в одной таблице. Как только я получу их хэширование, я собираюсь сбросить неповрежденную колонку. Проблема: Мой скрипт устанавливает все хэшированные пароли в соответствии с последней записью в таблице.Ошибка цикла SQL Server PDO UPDATE

$conn = new PDO("sqlsrv:Server=localhost;Database=database", "sqlUser", "password"); 
$result = $conn->prepare("SELECT tempPassword FROM employeeTable"); 
$result->execute(); 
$sql = "UPDATE employeeTable SET hashTempPass = :tempPass "; 

while($data = $result->fetch(PDO::FETCH_ASSOC)) 
{ 
    $tempPass = $data['tempPassword']; 
    $q = $conn->prepare($sql); 
    $q->bindValue(':tempPass', $tempPass); 
    $q->execute(); 
} 

Результаты являются такой

user1 unhashPass1 hashpass3 
user2 unhashPass2 hashpass3 
user3 unhashpass3 hashpass3 

Принимая во внимание то, что мне нужно

user1 unhashPass1 hashPass1 
user2 unhashPass2 hashPass2 
user3 unhashpass3 hashpass3 

Я надеюсь, что этот вопрос достаточно ясен. Спасибо.

Редактировать: Поскольку я боролся с этим, Я еще не хеширую пароли, пока не получу этот код.

+2

Почему бы не использовать предложение WHERE? –

+1

Doh ... пропустил отсутствующий WHERE – Ray

+0

Я просто добавил [WHERE tempPassword =: tempPass ";] в конец инструкции [$ sql]. Отрицательный аффект, код сломан. Я уверен, что сделал это неправильно. , если цикл while должен быть в try/catch? Если да, то как лучше всего сообщить об ошибках? –

ответ

2

Вы близки, но вы должны изменить запрос:

SELECT user, tempPassword FROM employeeTable 

и

UPDATE employeeTable SET hashTempPass = :tempPass WHERE user = :user 

это позволит вам захватить как хэш и временный пароль.

Вы можете обновить таблицу на основе пароля TEMP:

$conn = new PDO("sqlsrv:Server=localhost;Database=database", "sqlUser", "password"); 
$result = $conn->prepare("SELECT hash, tempPassword FROM employeeTable"); 
$result->execute(); 

//prepare it only once (no need to send query to server at each iteration 
$sql = "UPDATE employeeTable SET hashTempPass = :tempPass WHERE user = :user"; 
$q = $conn->prepare($sql); 

while($data = $result->fetch(PDO::FETCH_ASSOC)) 
{ 
    $tempPass = $data['tempPassword']; 
    $user = $data['user']; 

    $q->bindValue(':tempPass', $tempPass); 
    $q->bindValue(':user', $user); 

    $q->execute(); 
} 

Примечание

  • я назвал поле user, но вам нужно будет настроить это поле столбца , чтобы соответствовать Вашему конечно, конечно.
  • UPDATE без WHERE статья может привести к самой большой ошибке, которую может сделать администратор базы данных.
+1

Это, наконец, работает! Большое спасибо. Я не хочу признавать, как долго я работал над этим вчера. –