SQL Server PDO UPDATE循环错误

时间:2014-09-08 20:09:40

标签: php sql pdo sql-server-2012

我正在尝试编写一个脚本来散列一些临时密码。现在,临时密码和散列版本存储在同一个表中。一旦我得到它们的哈希值,我就会放弃没有散列的列。 问题是:我的脚本正在设置所有哈希密码以匹配表中的最后一条记录。

$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

我希望这个问题足够明确。谢谢。

编辑:由于我在努力解决这个问题,我还没有哈希密码,直到我的代码正常运行。

1 个答案:

答案 0 :(得分:2)

您已关闭,但您需要更改查询:

SELECT user, tempPassword FROM employeeTable

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

这将允许您同时获取哈希和临时密码。

然后,您可以根据临时密码更新表格:

$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可能会让您遇到数据库管理员可能犯的最大错误。