
データベースに存在するデータと重複しない乱数を生成したいです。
再帰を使用して書いてみたのですが、考え方、書き方は正しいでしょうか?
手順としては、
1.乱数を生成
2.DBに接続(select ~ from テーブル名 where like 生成した乱数、で戻り値があるか確認)
3.重複していたら自分自身を呼び出し、再度乱数を生成。
function Func_CreateUniqueID(){
$temp_rand=mt_rand();//乱数を作る。
echo "生成された乱数: $temp_rand<br>";
try{
$pdo=new PDO("mysql:host=localhost;dbname=データベース名","ユーザ名","パスワード");
$res=$pdo->query("select ランダムID from テーブル名 where ランダムID like '$temp_rand'");
while($row=$res->fetch(PDO::FETCH_ASSOC)){//while実行,IDが重複しているケース
Func_CreateUniqueID();//重複データが存在していたら自分自身を呼び出す。
}
unset($pdo);
}catch(PDOException $e){
var_dump($e->getMessage());
}
return $temp_rand;
}
こんな感じで書いたのですが、どうでしょうか?
アドバイスをお願いします。
No.2ベストアンサー
- 回答日時:
少し前に質問者さんがやっている事とほぼ全く同じような事をしたので、大体どんな風に書いたか書きます。
$flg = false;
for($i=0;$i<3;$i++){
$uniqueId = func_rand_int();// 1~2147483647(Mysqlのintの最大値)をランダムで発生
$sql->query(sql_user_search($uniqueId));// $uniqueIdが登録されるかを調べる為のSQLを発行
if(!$sql->fetch_assoc()){ // クエリー無しの場合
// ここで登録処理
$flg = true;
break;
}
}
//ループを抜けた所で$flgがtrueだったらOK、falseなら例外でNG
DBに1000万件のデータが入っていたとしても、
例外で登録が失敗する可能性は確率的に約1000万分の1
単純にuniqueidやmicrotimeを使って被らないIDを作るのもありですが、
IDから時間が推測出来るので
問題が無いくらいの確率を考えてこういうロジックでやりました。
ありがとうございます。
アドバイスを参考に書いてみました。
<?php
function Func_CreateUniqueID(){
try{
$pdo=new PDO("mysql:host=localhost;dbname=DBNANME","USRNAME","PASS");
for($i=1;$i<=10;$i++){
$rand_num=mt_rand();
echo "発生させた乱数:$rand_num<br>";
$sql="select * from TBNAME where COLNAME like '$rand_num'";
$res=$pdo->query($sql); //クエリ実行
if($res->fetch(PDO::FETCH_ASSOC)){
echo "重複する値が存在しますよ、もう一度ループします<br>";
}else{
echo "重複する値が無いですよ、ループを抜けます. break<br>";
echo "ループ回数:$i<br>";
return $rand_num;
break;
}
} //for文終わり
}catch(PDOException $e){
var_dump($e->getMessage());
}
}
?>
まだ何を使えば良いのか、戻り値は何か?など細かい書き方について調べる必要がありますが、とりあえずは動きそうです。
どうもありがとうございました^^
No.3
- 回答日時:
INSERT IGNORE INTOでデータを強制インサートして、
mysql_affected_rows()で、戻り値が1ならOK、0なら再処理
ただし同じIDが振られる可能性が高いのであれば、あまりやるべきではない
念のためカウンタをつかって最多エラーヒット回数を別テーブルに
履歴としてのこしておくとよいかも。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpのheader("Location:#pos")...
-
セッション関数を使わずにファ...
-
SplFileObject を利用したとき...
-
PHP8でWarning:Undefined varia...
-
PHP8を使うと、大量のWarningが...
-
フォームで戻った際に入力済み...
-
PHPで画像の渡しが上手く行きま...
-
$filePath = './user_img/' . $...
-
php ラジオボタン
-
composerをインストールしたい...
-
phpの問い合わせフォームを作っ...
-
marginの値でマイナス値を設定...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
php でqiitaのサイトにあったフ...
-
PHPの勉強してます。 配列のと...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Pro*Cの構文エラー
-
JAVA SQLServerException 列名 ...
-
<VB.NET>INSERT文でDBにデータ...
-
insert1つの処理でもトランザ...
-
ResultSetインターフェイスでの...
-
VBA ACCESS SQL...
-
MySQL 複数の同じような命令が...
-
ASPでSQL文を使う場合に。
-
VB勉強中
-
PHPからデータベースに接続した...
-
VB.NET エラーになる箇...
-
SQLインジェクション対策
-
sqliteの構造体
-
Q&Aサイトを作成していてURLの...
-
データベースに存在するデータ...
-
C#でDBの特定列をUpdate
-
エクセルVBAのデータベース接続...
-
チェックボックスからの複数検...
-
SQL文の連結が、うまくいきません
-
CakePHPでquery()を使うときに...
おすすめ情報