PHPで乱数を生成し重複チェックする方法

このQ&Aのポイント
  • PHP4とmySQLを使用して、数字3文字の乱数を生成し、DBに重複チェックを行い、重複していなければDBに書き込む方法について教えてください。
  • また、DBに値が1000個入っている場合には処理を中止する方法も教えてください。
  • GOTO命令がPHPにはないため、スマートなやり方を知りたいです。
回答を見る
  • ベストアンサー

GOTO命令のようなことをPHPで

PHP4とmySQLで、以下のことがしたいのですが ・数字3文字の乱数を生成する ・DBに同じ値がないかチェックする ・同じ値が既にDBにあったときは乱数を生成するところからやり直す ・なければDBに書き込んで処理終了 ※DBには オートインクリメントのID | 乱数 の2フィールドを使用 ※乱数はintではなくvarcharとして書き込む PHPにgoto命令がないので、スマートなやり方ご存知の方いらっしゃいましたら教えてください。 あと数字3文字の組み合わせなので、DBに値が1000個入っているとそれ以上書き込めないので処理の中止(exit)を行いたいのですが、どこで分岐したものか悩んでますので、併せてご指導いただければ幸いです。 $rand1 = (0,99); $rand2 = (0,99); $rand3 = (0,99); $abc = $rand1.$rand2.$rand3. $sql = //省略 $result = $sql; if($abc == $result){ //重複アリ:この中の処理をどうするとスマートなのか、、、} elseif{ //重複してないのでDBに書き込みます }

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

>数字3文字の乱数を生成する 二桁の数字を三つ生成しているように見えるんですが、 それだと都合6桁になりませんか? 重複したときのリトライ云々は do { ・数字3文字の乱数を生成する ・DBに同じ値がないかチェックする } while (重複なし); DBへの登録 で何か不都合が? つーか三桁の組み合わせにしろ、六桁の組み合わせにしろ、 いちいち乱数で生成して確かめてなんてやるよりは あらかじめ三桁なり六桁の数字を配列に生成しておいて、 それをシャッフルして順に取り出せばいいのではないでしょうか? これなら生成した配列の終端まで行ったら登録数の上限に 達したということだから一緒にチェックできるでしょう。

optional
質問者

お礼

doという便利な命令があるのを知りませんでした。 これで解決できそうです。ありがとうございます。 >二桁の数字を三つ生成しているように見えるんですが、 書き間違えていました。$rand1 = (0,9); の間違いです。 配列案は、いちどの処理を全て埋まるまで実行するわけでは ないので、違う方法を考えてみます。 大変助かりました、ありがとうございました!!

関連するQ&A

  • エクセル 任意の数字から始まる重複しない乱数

    お世話になります。 エクセル2003/XP 使用です。 RANK関数またはそれに似た利用方法でご教授願いします。 下記ページを参考に、"重複しない乱数”を作成しました。 http://www.relief.jp/itnote/archives/001798.php (ページ中程、▼操作手順:重複しない乱数を作成する 以下の部分) 乱数の最初の数字が1から始まる分には問題なくできるのですが、 乱数の数字を、「任意の数字から始めて」、 「任意の数字で終わる」ようにすることは可能でしょうか? 例えば、下記の例でいうと、 6から始まり10で終わる乱数です。        A列     B列 1行目 / =RAND() / 1-5の範囲でランダムな重複しない乱数 2行目 / =RAND() / 同上 3行目 / =RAND() / 同上 4行目 / =RAND() / 同上 5行目 / =RAND() / 同上 ------------------------------------------------------------ 6行目 / =RAND() / 6-10の範囲でランダムな重複しない乱数 7行目 / =RAND() / 同上 8行目 / =RAND() / 同上 9行目 / =RAND() / 同上 10行目 / =RAND() /同上 (11以下、繰り返し 略) よろしくお願いします。

  • エクセルで3ケタの乱数

    今度くじ引き大会をするのに3ケタの数字を250名ほどに配りたいのですが、それぞれの数字が重複なくかつ各桁数の数字が重複しないで乱数をエクセルで生成する方法を教えてください。(例えば、101,221,199などは除外したいです) RAND,RANDBETWEEN関数を使ってみましたが、重複してしまうし、221などのような各桁で数字が重複してしまうものができてしまうのでうまくいきません。 よろしくお願いします。

  • PHP+MySQLでXMLを作成し、それをいくつか連結したものを返す方

    PHP+MySQLでXMLを作成し、それをいくつか連結したものを返す方法を教えてください。 HTML ↓(1)httpリクエスト,パラメータ (2)main.php(XML化メイン処理) XMLデータ送信→ HTML ↑ ↑ ↑ ↓ ↓ ↓ (3)xml_1.php xml_2.php xml_3.php(XML生成子処理) ↑ ↑ ↑ ↓ ↓ ↓ DB (2)main.phpでHTMLから受け取ったコマンドを元に生成するXMLの取得を振り分ける。(switch文) (3)各phpでDBからデータを取得しXML形式にする。 (4)main.phpでそれぞれのXMLを連結し送信。 というのがやりたいことなんですけど、 ・SQLからデータを取得し、XMLにする方法 ・メイン処理でそれぞれを連結する方法 がわかりません。 main.php <?php function xml_main($cmd, &$xml ){ global $log4php,$con,$debugMode; $result = false; $dbErrMsg; // DB Open openDb(); dbErr(); // log4phpオブジェクト //$log4php = new log4php('log4php_xml.properties'); // トランザクション開始 mysql_query('BEGIN'); $log4php->debug('トランザクション開始'); /* try{ // 文字コード変換(ujis=EUC-JP) // TIPS デフォルトの文字コードがEUCだった場合は以下の二行を削除してください。 $sql = "SET NAMES utf8"; $result = @mysql_query($sql); } */ // XML Header生成 // コマンド毎の呼び出し switch($cmd){ case 0: xml_1.phpとxml_2.phpで生成したxmlを連結 break; case 1: xml_1.phpとxml_3.phpで生成したxmlを連結 break; case 2: xml_2.phpとxml_3.phpで生成したxmlを連結 break; default: break; } // XML基本情報タグ生成 // XML Footer生成 // DB Close closeDB(); } ?> xml_1.php <?php function xml_1($id,$member,$msg,&$xml){ //DBからデータを取得 //xmlを作成 } ?> という感じでやろうとしてるんですが。 xml_1.php xml_2.phpで文字列をreturnしてmain.phpでSimpleXMLで連結させるというのも方法として書いてあったんですが、 具体的なやり方がわかりません。 環境はPHP5.1 MySQL5です。

    • ベストアンサー
    • PHP
  • PHP+mysql データ重複登録

    ◆PHPバージョン 5.3.3 ◆mysqlバージョン 4.1.22 ◆テーブル情報 `no` int(11) NOT NULL auto_increment, `name` text NOT NULL, `mail` text NOT NULL, `memo` text NOT NULL, `updating` timestamp NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (`no`) ENGINE=MyISAM DEFAULT CHARSET=utf8 ◆SQL (1)insert into test(name, mail, memo) values ('abc','abc@test.com','abc') (2)insert test set name='abc', mail='abc@test.com', memo='abc' ◆処理概要 $conn = mysql_connect(ホスト、ユーザ、パスワード); mysql_query("set names utf8"); $rs = mysql_select_db(DB名, $conn); $result = mysql_query(SQL, $conn); ◆登録情報 (1, 'abc', 'abc@test.com', 'abc', '2011-09-02 16:28:57'), (2, '', '', '', '2011-09-02 16:28:57'), 【問題】 上記SQL(1)、(2)どちらでDBに登録しても、登録情報のように同時に空データも同時に登録されてしまう 全く原因の検討がつかないので、何か手がかりがありましたらご教授頂けたらと思います。 どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL
  • データベースに存在するデータと重複しない乱数を生成する関数、再帰を使用。

    データベースに存在するデータと重複しない乱数を生成したいです。 再帰を使用して書いてみたのですが、考え方、書き方は正しいでしょうか? 手順としては、 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; } こんな感じで書いたのですが、どうでしょうか? アドバイスをお願いします。

    • ベストアンサー
    • PHP
  • PHP初心者です。

    PHP初心者です。 index.php から外部関数に飛び、文字列を返してきてindex.phpで それらの文字列を表示するプログラムはどのように書けばいいんでしょうか? /* ---func1.php--- */ function func1($aa,$bb){ $moji=""; $moji.= "ああ".$aa."ああ"; $moji.= "いい".$bb."いい"; //$mojiの内容を返す } /* ---func2.php--- */ function func2($cc,$dd){ // DBからデータを取得して $sql = "SELECT name, add, mail, tel FROM tbl_a WHERE cc = ".$cc; $moji_db = ""; $result = mysql_query($sql); while ($row = mysql_fetch_assoc($result)){ $moji_db .= $row['name']; $moji_db .= $row['add']; $moji_db .= $row['mail']; $moji_db .= $row['tel']; } //$moji_dbを返す } index.php で $mojiと$moji_dbを出力する 以上のようなプログラムなんですけど、 func1,2の戻り値の書き方、index.phpでの受け取り方がわからないので教えてください。

    • ベストアンサー
    • PHP
  • 関数内で処理した内容を計算式で使用するには?

    function dbcount($table,$category) { require_once'DB.php'; $username = "abc"; $password = "abc"; $host = "abc"; $database = "abc"; $db = DB::connect("mysql://$username:$password@$host/$database"); $sql = "select count(*) from $table where $id;"; $result = $db->query($sql); while($row = $result->fetchRow()){ echo $row[0]; } } $kazu = 5; if ( $kazu >= db("table","key=1") ) { echo "真"; } else { echo "偽"; } ――――――――――――――――――――――――― といった感じのプログラムなのですが、if文が正常に処理されずに困っています。 関数dbを実行すると60が帰ってくるので、本来ならば「偽」と表示され、るはずなのですが、何故か「真」が表示され、文字の左側には60が表示されています。 60は関数を使用した結果なのですが、ここに表示されているという事は、条件式の数字として認識されていないという事でしょうか? だとすれば、どのようにすれば正常に計算されるのでしょうか?

    • ベストアンサー
    • PHP
  • PHPからデータベースへの登録について

    はじめまして。現在、仕事の関係でPHPのプログラムを勉強している者です。 早速ですが、質問させていただきます。 PHPで作成したフォームメールから別で用意したデータベースに 入力データを登録しようとしているのですが、エラーでうまく動作しません。 PHP側のコードミスもあるかもしれませんが、PHPを動作させているサーバーと データベースサーバーの文字コードが違う点も原因しているのでは?と調べている状況です。 フォームからのデータを送るPHP ⇒ Shift_jis PHPをアップしているWebサーバー ⇒ Shift_jis データベースサーバー ⇒ EUC-JP データベースへの接続は問題なく行えているようですので、 登録処理するコードの部分のみを書きます。(↓) ******************************************************************************** // データベースへの登録 $sql = "INSERT INTO FORM_DATA(DataNumber, Time, Name, Email, Area, Sex, Interest, Commnet, OS, IP) VALUES('$tsvcount', '$ymdhis', '$sender_name', '$mail_address', '$mail_area', '$mail_sex', '$mail_interest', '$mail_body', '$os', '$ip')"; $sql = mb_convert_encoding($sql, 'EUC-JP', 'sjis'); mysql_query("SET NAMES 'EUC-JP'"); $db_result = mysql_query($sql); print $sql; print $db_result; if (!$db_result) { exit('Error! データを登録できませんでした。'); } // データベースとの接続解除 $db = mysql_close($db); if (!$db) { exit('データベースとの接続を閉じれませんでした。'); } **************************************************************************** PHP&Webサーバーとデータベースの文字コードを統一すればいい話かもしれませんが、 事情により異なる文字コードの環境で開発しております。 上記の通り、データベースに送信するSQL文はmb_convert_encoding()で「EUC-JP」に変換し、 mysql_query($sql);でデータベースに送信している形です。 この状態で送信すると、エラーとなり送ったSQL文を処理してくれません。 文字コードの変換処理、コードの記述など何が原因なのか分からず困っています。 考えられる原因と、解決策があればご教授いただきたいです。 ちなみに私はPHPはもちろんプログラム自体もまだ経験が浅く、 基礎的なことも理解していないことがかなりあります。 その上でご説明いただけますと大変有難いです。 ではよろしくお願い致します。

    • 締切済み
    • PHP
  • MySQLのINSERT時にたまに重複になる

    下記の通り同じデータが無かった場合に限りインサートしています。 //同じデータが既にあるか確認 $sql = "select * from `reg_data` where "; $sql .= "`Date` = '".$date."' and "; $sql .= "`ID` = '".$id."' and "; $sql .= "`No` = '".$no."'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); //データが0なら今日のレコード作成 if($rows == 0){ $sql = "insert into `reg_data` values('0', '".$date."', '".$id."', '".$no.")"; mysql_query($sql); } しかし、3%ぐらいの確立で重複インサートになってしまいます。 重複といっても 1個目のフィールドはAUTO_INCREMENTになっておりまして AUTO_INCREMENTの値が重複する事は無いです。 $date、$id、$noがまったく同じテーブルがいくつか重複した場合でも AUTO_INCREMENTの値は全て連番になっています。 重複インサートが発生しないよう改善するには どうしたら良いでしょうか。 日付を2フィールド目に書いているので 0時0分1秒辺りでインサートが集中してしまいます。 分散させられたら改善するような気がしますが いい案が思いつきません。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHP+PDO+MYSQL で実行されたSQL文の取得について

    PHP+PDO+MYSQL で実行されたSQL文の取得について PEARのDBからPDOへの移行をしていましてデバック用のSQL文取得で困っています。 $sql = "SELECT * FROM sample where id = ? And id2 = ?" PEARのDBでは $db->query($sql,array(1,5)); $db->last_query; で実行したSQL文を取得することは可能でした。 PDOの場合 $sql_result = $pdo->prepare($sql); $sql_result->execute(array(1,5)); でリプレースフォルダ(クォート処理?)を利用してSQLを実行出来るようですが、 実行したSQLを確認する方法がマニュアル等を読みましたがどうしても分かりません。 どなたかご存知の方がいらっしゃいましたらご教授お願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう