每个PDO行的PHP随机字符串

时间:2014-02-26 21:33:58

标签: php

我想为我的行中的每一行创建一个随机字符串作为字段密码 - 基本上是一个批量密码生成器。

不幸的是,当我点击批量重置按钮时,密码会重置为所有相同的字符串。我希望每行都有一个不同的随机字符串。

这是我的代码:

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;
}

我做错了什么?

5 个答案:

答案 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子句。