我想为我的行中的每一行创建一个随机字符串作为字段密码 - 基本上是一个批量密码生成器。
不幸的是,当我点击批量重置按钮时,密码会重置为所有相同的字符串。我希望每行都有一个不同的随机字符串。
这是我的代码:
echo '<form method="post" action=""><input type="submit" name="bulk_password_reset" value="Bulk Password Reset" /></form>';
if (isset($_POST['bulk_password_reset'])) {
$password = generateRandomString();
while ($result = $sqlUpdate->fetch()) {
$sqlUpdate = $dbh->prepare("UPDATE $tableName SET password = :password");
$sqlUpdate-> execute(array(':password'=>$password));
$sqlUpdate->execute();
header('Location: su_password_reset.php');
}
}
这是我的随机字符串生成器函数:
//Generate random password
function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, strlen($characters) - 1)];
}
return $randomString;
}
我做错了什么?
答案 0 :(得分:4)
您应该将$password = generateRandomString();
置于while循环中,并添加WHERE
条件(我假设您的表中有id
),以便将每个UPDATE
应用于一个行。
$sqlSelect = $dbh->query("SELECT id FROM $tableName"); // select ids where you want to change passwords
while ($result = $sqlSelect->fetch()) {
$password = generateRandomString();
$sqlUpdate = $dbh->prepare("UPDATE $tableName SET password = :password WHERE id = :id");
$sqlUpdate->execute(array(':password'=>$password, ':id'=>$result['id']));
header('Location: su_password_reset.php');
}
UPD 我不太确定语法,但是这会让您知道,需要做什么(为每行选择id,生成密码,然后仅更新此行的密码)。
答案 1 :(得分:1)
这似乎是问题所在:
UPDATE $tableName SET password = :password
您没有在WHERE
语句中指定UPDATE
子句,因此它将应用于整个列而不是特定行。
答案 2 :(得分:0)
在while
循环中移动它:
$password = generateRandomString();
目前,您只计算$password
一次,然后将该值用于每一行。
此外,您的UPDATE
子句不限于任何匹配条件。通过循环的每个循环,您将更新表中的每个行。您需要添加WHERE
子句以限制对该特定行的更新。
答案 3 :(得分:0)
尝试在while循环中移动$password = generatRandomString()
while ($result = $sqlUpdate->fetch()) {
$password = generateRandomString();
$sqlUpdate = $dbh->prepare("UPDATE $tableName SET password = :password");
$sqlUpdate-> execute(array(':password'=>$password));
$sqlUpdate->execute();
header('Location: su_password_reset.php');
}
答案 4 :(得分:0)
<?php
$password = generateRandomString(); // Move this inside your while loop
while ($result = $sqlUpdate->fetch())
{
$password = generateRandomString(); // Like so...
}
// Change function generateRandomString($length = 10) {...} to...
function generateRandomString()
{
return md5(rand().time());
}
在更新查询中添加where子句。