【问题标题】:SQL Server PDO UPDATE loop errorSQL Server PDO UPDATE 循环错误
【发布时间】:2014-09-08 20:09:39
【问题描述】:

我正在尝试编写一个脚本来散列一些临时密码。目前临时密码和散列版本存储在同一个表中。一旦我将它们散列,我将删除未散列的列。 问题是:我的脚本正在设置所有散列密码以匹配表中的最后一条记录。

$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

我希望这个问题足够清楚。谢谢。

编辑:因为我一直在努力解决这个问题,我还没有散列密码,直到我让这段代码工作。

【问题讨论】:

  • 为什么不使用WHERE 子句?
  • Doh...错过了丢失的WHERE
  • 我刚刚在 [ $sql ] 语句的末尾添加了 [ WHERE tempPassword = :tempPass"; ]。负面影响,代码已损坏。我确定我做错了。另外,应该while 循环在 try/catch 中?如果是,报告错误的最佳方法是什么?
  • 您需要添加另一个子句WHERE tempPassword = :tempPass AND user = :user 类型的东西。至于错误,您可以在打开连接后立即添加$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);,如果这是您所要求的错误,则可以添加error_reporting(E_ALL); ini_set('display_errors', 1);

标签: php sql pdo sql-server-2012


【解决方案1】:

你很接近,但你需要更改查询:

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 子句可能会导致您犯数据库管理员可能犯的最大错误。

【讨论】:

  • 终于成功了!非常感谢。我不想承认我昨天为此工作了多长时间。
猜你喜欢
  • 2014-05-26
  • 1970-01-01
  • 2016-08-09
  • 2014-02-26
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 2016-03-27
  • 2018-10-28
相关资源
最近更新 更多