Php 生成随机密码并更新数据库

Php 生成随机密码并更新数据库,php,sql,sql-server,Php,Sql,Sql Server,我必须用随机唯一密码更新所有现有用户的密码。我有大约4000名用户使用SQL SERVER 我的代码是 $userSQL = "SELECT a002UserID FROM tbl002password WHERE a002UserID LIKE 'non%'"; $userrs = $db->query($userSQL); $userList1 = array(); while($row = $userrs->fetch(PDO::FETCH_OBJ)){ $userL

我必须用随机唯一密码更新所有现有用户的密码。我有大约4000名用户使用SQL SERVER

我的代码是

$userSQL = "SELECT a002UserID FROM tbl002password WHERE a002UserID LIKE 'non%'";
$userrs  = $db->query($userSQL);
$userList1 = array();
while($row = $userrs->fetch(PDO::FETCH_OBJ)){
    $userList1[] = $row->a002UserID;
}
foreach($userList1 as $uid){
    function generatePassword ($length = 8)
    {
        $password = '';
        $chars = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
        for ($i = 0; $i < $length; $i ++) {
            $password .= $chars[array_rand($chars)];
        }
        return $password;
    }

    $pass_gen = generate_password();
    $insertPass = "UPDATE tbl002password SET a002password = '$pass_gen' WHERE a002UserID = '$uid'";
    $db->exec($insertPass);
    echo "updated $uid";
}
$userSQL=“从tbl002password中选择a002UserID,其中a002UserID类似于“non%”;
$userrs=$db->query($userSQL);
$userList1=array();
while($row=$userrs->fetch(PDO::fetch_OBJ)){
$userList1[]=$row->a002UserID;
}
foreach($userList1作为$uid){
函数生成器密码($length=8)
{
$password='';
$chars=array_merge(范围('a','z')、范围('a','z')、范围(0,9));
对于($i=0;$i<$length;$i++){
$password.=$chars[array_rand($chars)];
}
返回$password;
}
$pass\u gen=生成密码();
$insertPass=“UPDATE tbl002password SET a002password='$pass\u gen',其中a002UserID='$uid';
$db->exec($insertPass);
echo“更新的$uid”;
}
如果需要,请删除“for”循环

  • 当我只为一个用户运行查询时,它运行良好
  • 选择所有用户时,将为所有用户分配相同的密码
//1。不要在循环中声明函数。通常只应声明函数
//在全局范围或类定义中。
函数生成器密码($length=8){
$password='';
$chars=array_merge(范围('a','z')、范围('a','z')、范围(0,9));
对于($i=0;$i<$length;$i++){
$password.=$chars[array_rand($chars)];
}
返回$password;
} 
$userSQL=“从tbl002password中选择a002UserID,其中a002UserID类似于“non%”;
$userrs=$db->query($userSQL);
$userList1=array();
while($row=$userrs->fetch(PDO::fetch_OBJ)){
$userList1[]=$row->a002UserID;
}
// 2. 准备这样的语句会提高性能,因为它们只被解析一次,
//但是执行了很多次。
$insertPass=$db->prepare(“更新tbl002password集a002password=?其中a002UserID=?”;
foreach($userList1作为$uid){
$pass\u gen=生成密码();
$insertPass->execute([$pass\u gen,$uid]);
echo“更新的$uid”;
}
//1。不要在循环中声明函数。通常只应声明函数
//在全局范围或类定义中。
函数生成器密码($length=8){
$password='';
$chars=array_merge(范围('a','z')、范围('a','z')、范围(0,9));
对于($i=0;$i<$length;$i++){
$password.=$chars[array_rand($chars)];
}
返回$password;
} 
$userSQL=“从tbl002password中选择a002UserID,其中a002UserID类似于“non%”;
$userrs=$db->query($userSQL);
$userList1=array();
while($row=$userrs->fetch(PDO::fetch_OBJ)){
$userList1[]=$row->a002UserID;
}
// 2. 准备这样的语句会提高性能,因为它们只被解析一次,
//但是执行了很多次。
$insertPass=$db->prepare(“更新tbl002password集a002password=?其中a002UserID=?”;
foreach($userList1作为$uid){
$pass\u gen=生成密码();
$insertPass->execute([$pass\u gen,$uid]);
echo“更新的$uid”;
}

我刚刚在沙箱中运行了这个:

$userList1 = array(1, 2, 3, 4, 5);

function generatePassword ($length = 8)
    {
        $password = '';
        $chars = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
        for ($i = 0; $i < $length; $i ++) {
            $password .= $chars[array_rand($chars)];
    }
    return $password;
}; 


foreach($userList1 as $uid){
    $pass_gen = generatePassword();

    echo $pass_gen . '   ';
}

我觉得很好。代码中有一个明显的语法错误。您可以调用“generate_password();”,而函数实际上被称为“generatePassword”。我同意Raymond Nijland关于SQL的观点。我建议您也更改此选项。

我刚刚在沙箱中运行了此选项:

$userList1 = array(1, 2, 3, 4, 5);

function generatePassword ($length = 8)
    {
        $password = '';
        $chars = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
        for ($i = 0; $i < $length; $i ++) {
            $password .= $chars[array_rand($chars)];
    }
    return $password;
}; 


foreach($userList1 as $uid){
    $pass_gen = generatePassword();

    echo $pass_gen . '   ';
}

我觉得很好。代码中有一个明显的语法错误。您可以调用“generate_password();”,而函数实际上被称为“generatePassword”。我同意Raymond Nijland关于SQL的观点。我建议您也更改此设置。

为什么要在4000行中循环

我会应用一个更新

示例

Declare @tbl002password  table (a002UserID  varchar(50),a002password varchar(50))
Insert Into @tbl002password values
 ('JS1234'   ,'Password1')
,('nonTI5656','Password2')
,('nonSC5657','Password3')

Update @tbl002password set a002password=right(NewID(),3)+left(abs(convert(bigint,HashBytes('MD5', a002UserID))),5)
 Where a002UserID like 'non%'


Select *
 From  @tbl002password
a002UserID  a002password
JS1234      Password1
nonTI5656   FED25902
nonSC5657   3C815639
更新后的表格

Declare @tbl002password  table (a002UserID  varchar(50),a002password varchar(50))
Insert Into @tbl002password values
 ('JS1234'   ,'Password1')
,('nonTI5656','Password2')
,('nonSC5657','Password3')

Update @tbl002password set a002password=right(NewID(),3)+left(abs(convert(bigint,HashBytes('MD5', a002UserID))),5)
 Where a002UserID like 'non%'


Select *
 From  @tbl002password
a002UserID  a002password
JS1234      Password1
nonTI5656   FED25902
nonSC5657   3C815639

为什么要在4000行中循环

我会应用一个更新

示例

Declare @tbl002password  table (a002UserID  varchar(50),a002password varchar(50))
Insert Into @tbl002password values
 ('JS1234'   ,'Password1')
,('nonTI5656','Password2')
,('nonSC5657','Password3')

Update @tbl002password set a002password=right(NewID(),3)+left(abs(convert(bigint,HashBytes('MD5', a002UserID))),5)
 Where a002UserID like 'non%'


Select *
 From  @tbl002password
a002UserID  a002password
JS1234      Password1
nonTI5656   FED25902
nonSC5657   3C815639
更新后的表格

Declare @tbl002password  table (a002UserID  varchar(50),a002password varchar(50))
Insert Into @tbl002password values
 ('JS1234'   ,'Password1')
,('nonTI5656','Password2')
,('nonSC5657','Password3')

Update @tbl002password set a002password=right(NewID(),3)+left(abs(convert(bigint,HashBytes('MD5', a002UserID))),5)
 Where a002UserID like 'non%'


Select *
 From  @tbl002password
a002UserID  a002password
JS1234      Password1
nonTI5656   FED25902
nonSC5657   3C815639

由于您先选择,然后再更新,因此很容易出现争用情况。。除此之外,它还很容易被SQL注入。如果外部世界无法访问此代码,并且只有一个用户正在运行此代码,请忘记我所说的。。首先,您需要将函数
generatePassword()
放在循环外部。不要存储纯文本密码,将其散列。我确实将函数放在循环外部,但它不起作用。由于您先选择,然后再更新,因此看起来很容易出现争用情况。。除此之外,它还很容易被SQL注入。如果外部世界无法访问此代码,并且只有一个用户正在运行此代码,请忘记我所说的。。首先,您需要将函数
generatePassword()
放在循环外部。不要存储纯文本密码,将其散列。我确实将函数放在循环外部,但它不起作用。