質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

5回答

6148閲覧

(神さまよ、仏さまよ)データベースの内容と重複しないランダム文字列を生成したい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2015/08/05 06:34

編集2015/08/05 07:19

ボタンを押した際、データベースの内容と重複しないランダム文字列を生成し、

echo $this->Form->button('ランダム文字列生成ボタン',array('onClick'=>'','type'=>'button','id' =>'generateRnd')); //ここに echo $this->Form->input('randommoji',array('label'=>'ランダム文字列','type'=>'text'));

表示させたいんですが、どうやって書けばいいんでしょうか?

昨日も質問しましたが、まだ解決できず...

色々調べましたが、このように

document.getElementById('generateRnd').addEventListener('click',function(){clickRnd();},false); function clickRnd() { var rndStr = Math.random().toString(36).slice(-7); document.getElementById('randommoji').value = rndStr; }

ただボタン押すとランダム文字列は出ますが、データベースを参照するランダム文字列ではないので…
三日間困っています。バカですみません。できれば参照できるコードを教えてくれたら、今日解放されます。ありがとうございます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

なんかデジャブな気もしますが、Ajaxでサーバサイドに処理を投げて、一意のランダム文字列をDBに突っ込んで返してあげれば済む話かと思います。

UserControllerのcreate_passアクションでランダム文字列を生成すると仮定します。
またUserモデルがあり、passwordというカラム名でランダム文字列を保持しているとします。
(実際passwordだったら暗号化しろよと言われそうですがとりあえず…)

javascript

1$(function() { 2 $("#generateRnd").on('click', function() { 3 $.ajax({ 4 type:'POST', 5 url:'/user/create_pass', 6 dataType:'text' 7 }) 8 .success(function(data) { 9 $("#randommoji").val(data); 10 }) 11 .error(function() { 12 alert('通信エラー'); 13 }); 14 }); 15});

UserController

PHP

1public function create_pass() { 2 while(1) { 3 // ランダム7文字生成のアルゴリズムがモゴモゴ 4 // 出来上がったものを仮に$passという変数に入れるとします 5 ・・・ 6 $res = $this->User->findByPassword($pass); 7 if (empty($res)) { 8 // ここにパスワード登録処理 9 ・・・ 10 break; 11 } 12 } 13 echo $pass; 14 exit; 15}

うーんざっとですがこんな感じでしょうか。

投稿2015/08/05 13:48

編集2015/08/05 13:59
yu-ri

総合スコア634

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ランダムな文字列と言っても、別に数学的厳密さやリアルタイムに生成することが求められている訳では無いのですよね!?
要は、利用者にとって予測困難な意味不明の文字列であればOKなのでしょう?

もしコーディング力の高さを競ってるので無ければ、以下のような「簡便法」はいかがですか?

① 当面必要十分な量のランダムな文字列を生成し、予めDBに登録しておく
② 『未使用』の文字列を一つDBから取得して使用する
③ ファイルアップデロードが済んだら、例えば使用済みフラグを立てる
(ファイル情報を追記することで代用出来るかも)
④ もし残りが少なくなったら、サーバメンテナンスと称して適宜追加登録する

この様にすれば、処理は極めて簡単になりますし、文字列を都度生成するコストも、毎度DBに問い合わせ重複していたらリトライするコストも発生しないので、速度的にも有利ではないでしょうか。

こんな手抜きは許せませんか?

投稿2015/08/05 09:44

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

つまりこうやりたいんですか?

1)ボタンをクリックするとランダムな文字列が生成される。
2)DBに重複した文字列がすでに登録されていないかを問い合わせる。
3)登録されていなければ、inputに表示、登録されていれば再度ランダムな文字列を生成して2)に戻る。

もしそうでしたら、今どこで引っかかってるんですか?

投稿2015/08/05 06:56

hintrarou

総合スコア162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hintrarou

2015/08/05 06:59

たった7文字なら、inputに表示した後、他の利用者の端末でも同じ文字列が出来上がる可能性ないですか?
退会済みユーザー

退会済みユーザー

2015/08/05 07:00

回答ありがとうございます。 その通りです。 今、登録されているかいないかを問い合わせるところで引っかてるんです。
退会済みユーザー

退会済みユーザー

2015/08/05 07:04 編集

一応、バリデーションルールで 'isUnique' をつけていますが、その前に登録されているかいないかを問い合わせたいので...
退会済みユーザー

退会済みユーザー

2015/08/05 07:22 編集

例えば、多くの文字列が既にランダムボタンで生成して登録されている場合は、同じ文字列が出る可能性があるので、DBの参照をしたいのです。
mtempa

2015/08/05 07:10

上記(2)ですが、 select * from "参照テーブル" where "ユニークキーカラム" = "生成した7文字" で結果が返ってこなければよしとするのではだめでしょうか?
退会済みユーザー

退会済みユーザー

2015/08/05 07:16

cakephpで作られているので、出来れば、controllerで制御したいので…
hintrarou

2015/08/05 07:44 編集

jQueryですみません。 あくまで、流れの説明です。このまんまは動きません。特にサーバ側のPHPも必要なので。 $('#erateRnd').click(function(){ var dup = 1; while(dup){ var randstr = ランダム文字列を生成する関数; //(a) var app = 'DBに問い合わせるphp名'; //(b)     $.post(app, {str: randstr }, function(data) {//postのname 'str' に文字列を入れて送信。 dup = data; //(c) }); } $('#erateRnd').val(randstr);//(d) }); 先ず、ボタンがクリックされたら、変数dupを1にしておきます。 while文でdupが1の時はその中の動きを繰り返します。 while文の中では、ランダムな文字列を生成し、(a) AjaxでDBに文字列を送ります。(b)には問い合わせ先のphpを指定します。 そのphpからは、重複があれば1をなかったら0を返します。 その結果をdupに代入します。(c) dupの値が1なら、(a)から繰り返し、0ならwhileから抜け出します。 (d)で文字列をinputに入れます。 mtempaさんのやりたい動きはこんな感じだと思います。 ただ、もしユーザが文字列を選ぶ必要がなく、システムで強制的にランダムな文字列を配布するのが目的なら、サーバ側で文字列を作って、MySQLに登録し、結果をユーザに返したほうがいいと思います。
退会済みユーザー

退会済みユーザー

2015/08/05 08:04 編集

回答ありがとうございます。大変助かります。 問い合わせ先のphpというのは controller での制御のことなんでしょうか? バカな質問してすみません。
hintrarou

2015/08/05 08:15

cakeならそうなります。
退会済みユーザー

退会済みユーザー

2015/08/05 08:33

回答ありがとうございます。 そのcontrollerも教えて頂けないでしょうか? 無茶なこと言って申し訳ございません。
hintrarou

2015/08/05 13:19

すみませんが、cakeはしばらくやってないのでよくわかりません。 SQLは: >select * from "参照テーブル" where "ユニークキーカラム" = "生成した7文字" >で結果が返ってこなければよしとするのではだめでしょうか? これで大丈夫です。 もし、結果が帰ってきたら、echo 1, 帰ってこなかったらecho 0でexit;するだけで大丈夫だと思います。
guest

0

昨日の質問というのは分かりませんが、

php

1hash_hmac( {ハッシュ方式}, {ハッシュ元}, {ハッシュキー} );

これでハッシュ文字列を生成すればハッシュ元の文字列に基づいた文字列が得られます。
ハッシュ方式をsha512などにし、回数を決めてストレッチングを行うなどはどうでしょう?

質問者の意図と異なっていましたら申し訳ありません。

投稿2015/08/05 06:43

mtempa

総合スコア129

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/08/05 06:54

回答ありがとうございます。 どうしても必要な文字列の数は7文字で、出来れば、データベースに登録されている文字列を参照したいので...
guest

0

他の方も回答サれていますが
ハッシュ関数を利用するのが一番いいのではないでしょうか
ハッシュ関数の元になる部分にマイクロ秒まで含む日時を指定すればどうでしょうか。

投稿2015/08/05 07:46

Hiroshi_Honda

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問