ランダム文字列をDBにINSERTする方法は?
- LAMPでWEBシステムを作成しており、ランダム文字列をDBにINSERTする方法について教えてください。
- 重複しないランダムな文字列をDBにINSERTする方法についてアドバイスをお願いします。
- MyIsamを使用し、PHPで作成したランダム文字列をDBにINSERTする方法について教えてください。
- ベストアンサー
ランダム文字列をDBにINSERT
はじめまして。お世話になります。 LAMPでWEBシステムを作成しております。 ランダムな文字列をDBにINSERTする処理に関して質問させて頂きます。 条件: ・DBに入るランダムな文字列は重複不可。 ・ランダムな文字列は[a-zA-Z0-9]の10桁とする。 ・1度の処理で、ランダムの文字列は確実にINSERTさせる。 ・同時に多数の処理が走ることがある。 ・処理は速いに越したことない(DBの負荷も低めがよい) 環境: PHP 4.4.4 Mysql 5.0.33 使用ストレージエンジン:MyIsam 私が思いついたのが以下の2通りです。 (1) ランダム文字列が入るカラムをユニークキーとし、PHP側で作成されたランダム文字列をINSERT。 重複していたらエラーが返ってくるが、正常にINSERTされるまでPHP側でループ。 (2) 対象テーブルをロックし、PHP側で作成されたランダムの文字列をSELECT。 なければその文字列をINSERTし、テーブルロック解除 (1)はループが少し怖く、(2)はDBへの負荷がかかってしまいそうですが どちらがよいでしょうか? もしくは、他に何か方法があればご教授頂けるとありがたいです。 また、現在MyIsamを使用しておりますが、場合によってはストレージエンジンの変更も 考えておりますのでその点も考慮して頂けると幸いです。 ちなみに検索条件は、ランダムの文字列をキーに全てのデータを取得するくらいです。 そのテーブルは、カラム数15、レコード数1,000万の見込みです。 以上、長くなりましたがよろしくお願いします。
- ibushi_007
- お礼率90% (10/11)
- PHP
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
予め、ランダムデータ用テーブルを1000万データ分作っておいて、 (まぁナンでしたら余裕をもって1億データくらいつくっておいてもよいかも) 新たにAUTO INCREMENTなどで振られたIDをもとに そのテーブルからランダムデータを渡してあげればよいのでは? ループでトライをする方式は場合によってはオーバーヘッドが 致命的になる場合もありますので。 メインテーブルにAUTO INCREMENT用テーブルが仕様上作成できないなら ランダムデータ用テーブルの方にフラグフィールドをつくっておき データを吐き出した時点でフラグをたてておけば、フラグのたってない データを渡すというやり方も考えられます。 まぁランダム用テーブルをつくるにあたっては、ループでトライアンド エラーでやることになりますが、データを作成するたびにトライするよりは ずいぶんすっきりすると思います
その他の回答 (1)
- hola1973
- ベストアンサー率45% (5/11)
私なら、ユニーク文字列を $id = md5 (uniqid (rand())); として、32桁で返します。 実装が簡単ですよ。
お礼
ご回答ありがとうございます。 ご提示頂いた $id = md5 (uniqid (rand())); としますと、完全に重複することはないのでしょうか? 可能性がわずかでもある場合は何かしらの処理が必要かと思われますので。 また、一応条件に、文字列は10桁(バイト数)とありますので、 できましたらこれに沿って頂けると助かります。
関連するQ&A
- CGIで生成したランダムな文字列を、ユニークなカラムにINSERTする方法は?
多重アクセスの問題です。 現在は、↓のようにしております。 (1) まず初めに、ランダムな文字列(例えば、「ptB0RzT8jtERPH8z」)を、CGIで生成します。 (2) その「ptB0RzT8jtERPH8z」をユニークなカラムにINSERTするのですが、 既に、「ptB0RzT8jtERPH8z」があると、DBエラーになりますので、 SELECTして、「ptB0RzT8jtERPH8z」がないかどうかをチェックします。 (3) あれば(1)に戻って、ランダム文字列を再生成、 なければ、INSERTします。 しかしこの場合、(2)でSELECTして、(3)でINSERTする間に、 別のユーザーが、「ptB0RzT8jtERPH8z」をINSERTすれば、 (3)で、DBエラーを起こします。 どのようにすれば、解決できるでしょうか? ちなみに、DBはMySQL5です。 エラったらdieせずに、rollbackすれば?との意見もあるかもしれませんが、 DBIコネクト時に、RaiseErrorをオンにしています。
- ベストアンサー
- Perl
- 文字列に対してPHP上で一括置き換えしたい
DBにあるテーブルの指定されたカラム全てを文字列に対してPHP上で一括置き換えしたいです。 phpアドミン上でSQL文を使って UPDATE `テーブル名` SET フィールド名A=REPLACE (フィールド名A,"置換前の文字列","置換後の文字列"); で実行したらうまくいくのですが、 これをPHP上で処理したいと考えてます。 require("godb.php");//DBにアクセス $sql ="UPDATE テーブル名 SET フィールド名 = REPLACE(フィールド名,"AAA","BBB")"; mysql_query($sql2); と実行してもうまくいきません。。。 これって、、、一個一個対象カラムをPHP上で取り出してから 処理をかけないといけないのでしょうか。。 アドバイスいただけたら幸いです。 よろしくお願い致します。
- ベストアンサー
- PHP
- 長さ1の空文字列?
タイトルの通り、長さ1の空文字列で困っています。 現在、Linux、Apache、MySQL、PHPを使って3階層アプリケーションを作っています。 予めMySQLでテーブルの形を決めておいて、CSVからデータを読み込ませておき、 PHPでSQL文を実行してレコードを取得することで、それらをユーザに表示という感じです。 複数あるカラムのうち、空文字列(CSV上でブランクだったもの)は表示させたくないので、 PHPで「 if(カラム=="")~ 」のように比較することで、空文字列だけ避けるつもりでした。 しかし上手くいかなかったので、strlen()で調べて見たところ、返り値が1でした。 本来は空文字列に対してstrlen()は0或いはfalseの返り値を返しますよね。 is_empty()でも空データ扱いにならず、当然NULLの扱いでもありません。 そのため、実データとの区別が出来ずに困っています。 何故、空文字列のカラムを除外したいかというと、 DB上のユニークなレコードを検索したいからです。 select * from where カラム='データ' and カラム='データ'… という風に。 「カラム=''」としてしまうと検索に引っかからなくなってしまいます。 どうすればよいでしょうか。 以下はそれぞれのバージョンです。 MySQL:5.0.95 PHP:5.1.6 Linux:RHEL5 Apache:2.2.3
- ベストアンサー
- PHP
- ランダム文字列
srand; @array = a .. z; @new; while ( @array ) { push( @new, splice(@array , rand @array , 1) ); } print @new, "\n\n"; print "<br>"; print @new, "\n\n"; print "<br>"; print @new, "\n\n"; ↑のような感じでランダム文字列の作成を考えています。 上記スクリプトですと、 aewpodigtusnkjycfxvmzqrlhb aewpodigtusnkjycfxvmzqrlhb aewpodigtusnkjycfxvmzqrlhb ↑のようにどの行も同一文字列になってしまいます。これを、行毎に異なった8文字のランダム文字列にしたいのですが、方法がわかりません。 いっぺんに100行のランダム文字列を生成する必要があります。どうぞよろしくお願いいたします。
- ベストアンサー
- Perl
- DBで大文字小文字を区別せずINSERTする方法
データベースに関する質問です。 現在、学校でデータベースを使用したシステムを開発しています。 データベースは主にPostgreSQLを使用しています。 データをINSERTする際に大文字小文字を区別せず、 同じ文字列であるかどうかチェックする方法はありますか? たとえば、「abc123」と「aBc123」を同一とみなし INSERTできないようにしたいです。(主キーのため) システム側ではなく、できればデータベース側で判定を行いたいです。 宜しくお願い致します。
- 締切済み
- PostgreSQL
- php db 文字化け
文字コードEUC-JPで開発しています。 題名の通り文字化けします。 どうやらDBからselectやinsertしたときに文字化けをするようです。 selectですと文字化た値が取れますし、 insertでは文字化けするためinsertできずエラーとなります。 sql直前で mysql_query("set names EUC-JP"); も行っています。 テーブルの文字コードはオプションで eucjpms -- UJIS for Windows Japanese としています。 個別に該当カラムもそうしています。 何がまずいでしょうか?
- 締切済み
- PHP
- パラメータをランダム文字列で表わしたい
某サイトでリンクをクリックすると、下記のようにランダム文字列がパラメータとして渡されるものがあります。 http://www.foobar.jp/cgi-bin/abcd.cgi?a=10004414&b=PMird395j ランダム関数で生成?もしくは暗号化?しているのではないかと思うのですが、例えば商品番号などをそのままの数値でなく暗号化することができれば、セキュリティの向上にもつながるのではないかと思います。 このような文字列をPHPで簡単に生成する方法には、どのようなものがあるでしょうか。もちろん、文字列から元のIDや番号を復元できなければなりません。暗号化を使うのが良いのでしょうか。
- ベストアンサー
- PHP
- ある文字列の一部がDBに有るか調べたい。
このような検索は出来ますでしょうか? PHP 5.1.6 Mysql5.0.45 で運用しています。 テーブルにemailのフィールドがあります。 名前<***@*******.com> と言う文字列のメールアドレスが テーブルのemailフィールドに有れば、その列をselect したいのです。 宜しくお願いいたします。
- ベストアンサー
- MySQL
- Accessへ日付をINSERT
今Access2000のテーブルから文字として受け取ったデータを 同じくAccessの別テーブルの日付型にINSERTしようとしています。 ソフトはVC6.0を使用しています。 受け取るSELECTはうまくできています。 UCHAR sqlstr [ ] ="INSERT INTO テーブル名" "(カラム1、カラム2、カラム3)" "VALUES(?,?,?)"; INSERTはこのようにSQL文を用意しておいてSQLExecuteで SQL文を実行しようとしています。 この場合にカラム1が日付型だとしたら、 「?」のパラメータには文字として渡し、 SQL文のなかで "VALUES(to_date(?,'YYYYMMDD'),?,?)"; とすればうまくいくと思ったのですができません。 いろいろサイトを見るとAccessでは「’」ではなく「#」を使うと 書いてあったので to_date(?,#YYYYMMDD#) とやったのですがエラーになってしまいます。 ちなみにパラメータとして渡す文字列は「20020413」という 8桁の普通の文字です。 どなたか知っている方いませんでしょうか? 他に方法があればそれでも構いません。 どうか教えてください。m(__)m どうしても先へ進めません…。
- 締切済み
- C・C++・C#
- OracleのLONG型への insert について
お世話になります。 ASP + Oracle8.0.5で開発中のシステムがあるのですが、 ASP上のテキストエリアに文章を記述して、OracleのテーブルのLONG型のカラムに対して insertを行うとエラーが起こってしまいます。 正しくは、全角で2000文字までは入力できるのですが、 それを越えてしまうと、ORA-01461エラー(LONG値はLONG列にのみバインドできます)という エラーが起こってしまい、カラムに対してinsertすることができません。 テーブルを見直してみたのですが、ちゃんとLONG型に設定してありました。 LONG型のカラムにデータを登録する際、4000バイト以上の文字列は挿入できないでしょうか? でもLONG型って、2GBまで使用できるはずでしたよね? ご教授のほど、よろしくおねがいします。
- 締切済み
- その他(データベース)
お礼
ご回答ありがとうございます。 ご提示頂いた実際の流れは、メインテーブルにINSERTする際にランダム文字列を取得する処理を考えた場合、 以下の流れでよろしいでしょうか? [DB部] ランダム文字列を格納するテーブルRAND_TBL(rand_seq_id int AUTO_INCREMET primary key, rand_id varchar(10) unique key)を作成、 必要分のデータををあらかじめ挿入。 メインテーブルMAIN_TBL(seq_id int AUTO_INCREMENT primary key, ....)作成 [処理部] メインテーブルへデータを挿入後、 "SELECT rand_id FROM RAND_TBL WHERE seq_id = ".mysql_insert_id();で取得 また、ランダム文字列をキーにMAIN_TBLからデータを取得する際に少しめんどくさそうなので、 できればメインテーブルにもランダム文字列を入れたいのですが、その後UPDATEしかないのでしょうか? PHPというより、Mysql分野に近くなってきましたが、何卒よろしくお願いします。
補足
Mysqlの分野のほうが近いような気がしますので、一旦締め切ります。 改めまして、再度Mysql板のほうで質問させて頂きます。 ありがとうございました。