
データベースに存在するデータと重複しない乱数を生成したいです。
再帰を使用して書いてみたのですが、考え方、書き方は正しいでしょうか?
手順としては、
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で質問しましょう!
似たような質問が見つかりました
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- PHP PHPSpreadsheetによる書き出し時のページネーション方法について 1 2023/03/20 10:35
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- 統計学 Excelによるサンプルの拡大について 6 2023/08/22 16:03
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQlite
-
VB勉強中
-
connectを使ったSQL実行でエラー
-
where以下の条件文
-
プリぺアドステートメントで変...
-
mysql php 複数のクエリ
-
PHPでMySQLのテーブルからcount...
-
配列データのレコード登録
-
MySQL 複数の同じような命令が...
-
教えて下さい。
-
データベースに存在するデータ...
-
データサイズでクエリ中止?
-
DBからSelectしたレコードのデ...
-
MySQLでの売上集計
-
下記エラーメッセージ解決について
-
MySQLの日付データについて
-
ループ内に任意行を差し込む処...
-
RFC822形式での日時の取得
-
MySQLのエラー出力
-
すいません、質問をさせて下さい。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
insert1つの処理でもトランザ...
-
<VB.NET>INSERT文でDBにデータ...
-
JAVA SQLServerException 列名 ...
-
Pro*Cの構文エラー
-
VBA ACCESS SQL...
-
PHP&MySQLでの文字列+数列の一...
-
【初歩】配列の格納データ数だ...
-
mysqliを使ってデータベースを...
-
配列で受け取った値がUPDATEで...
-
MySQLのINSERT時にたまに重複に...
-
一度検索されたものに対するソ...
-
cakePHPでSQLが実行できない。
-
PHP4とORACLE接続について
-
phpでforeach ($stmt as $row)...
-
phpmyadminにタグを格納するには
-
zendframework
-
データベースに存在するデータ...
-
データに「,」があると「"」で...
-
Q&Aサイトを作成していてURLの...
-
PHP+PDO+MYSQL で実行されたSQ...
おすすめ情報