前提・実現したいこと
お世話になっております。
パスワードを持たないユーザーを取得して1件ずつパスワードを発行してUPDATEしたいです。
普通にUPDATEすると全く同じパスワードで反映されてしまうのでこれを1件ずつ別々の文字列のパスワードを反映したいです。
初歩的な部分かもしれないのですがお知恵をお貸しいただけますと大変助かります。
よろしくお願い致しますm(_ _)m
※下記のusersテーブルでパスワードを持っていないuser_id毎に違うパスワードを発行したい
user_id | user_pw | user_name |
---|---|---|
1 | ユーザー1 | |
2 | ユーザー2 | |
3 | ユーザー3 | |
4 | ユーザー4 | |
5 | ユーザー5 |
⬇現在の状態
user_id | user_pw | user_name |
---|---|---|
1 | 12345678 | ユーザー1 |
2 | 12345678 | ユーザー2 |
3 | 12345678 | ユーザー3 |
4 | 12345678 | ユーザー4 |
5 | 12345678 | ユーザー5 |
⬇理想の形
user_id | user_pw | user_name |
---|---|---|
1 | 12345678 | ユーザー1 |
2 | 1234abcd | ユーザー2 |
3 | abcd1234 | ユーザー3 |
4 | 5678abcd | ユーザー4 |
5 | abcdefgh | ユーザー5 |
該当のソースコード
php
1# パスワード発行用 2$num = 8; 3$ar1 = range('a','z'); 4$ar2 = range('A','Z'); 5$ar3 = range('0','9'); 6$ar_all = array_merge($ar1,$ar2, $ar3); 7shuffle($ar_all); 8$pass = substr(implode($ar_all), 0, $num); 9 10 11# パスワードを持っていないユーザーを取得してパスワード発行 12$sql = ' 13 UPDATE users 14 SET pass = :pass 15 WHERE user_id = :user_id 16'; 17$prepare = $dbn->prepare($sql); 18$prepare->bindValue(':pass', $pass); 19$prepare->bindValue(':user_id', ''); 20$prepare->execute();
追記
これでランダム文字列をhash化して初期値の設定はできました。
php
1foreach($user as $user_id) { 2 $pass = substr(bin2hex(random_bytes($num)), 0, $num); 3 $hash = password_hash($pass, PASSWORD_BCRYPT); 4 $sql = ' 5 UPDATE users 6 SET user_pw = :user_pw 7 WHERE user_id = :user_id 8 '; 9 $prepare = $dbn->prepare($sql); 10 $prepare->bindValue(':user_pw', $hash); 11 $prepare->bindValue(':user_id', $user_id); 12 $prepare->execute(); 13}
回答2件
あなたの回答
tips
プレビュー