• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CGIで生成したランダムな文字列を、ユニークなカラムにINSERTする方法は?)

CGIで生成したランダムな文字列をユニークなカラムにINSERTする方法は?

thatsthatの回答

  • ベストアンサー
  • thatsthat
  • ベストアンサー率55% (15/27)
回答No.1

RaiseErrorがonでも、eval{};とif($@){}で例外が拾えますので、  直接Insertを試してみて、  一意制約違反になったら、ランダム文字列を作り直し。  Insertに成功するか、その他の(おそらく致命的な)エラーが  出るまで繰り返し。 という感じでどうでしょう? while(1){  $rstr=ランダム文字列作成  eval{ $sth->execute($rstr); # insert文実行 };  if($@){   next if($DBI::errstr=~m/(一意制約違反の時のエラー文字列)/);   die $@; # 一意制約違反以外のエラーはdie  }  last; } (MySQL環境が手元にないので、  m//の箇所、一意性違反の時のエラーメッセージが分かりませんでした。)

sweepea
質問者

お礼

ご回答、ありがとうございます。 身近に詳しい人がいないので、ありがちな処理でいつも悩んでしまいます。 ずばりな回答ありがとうございます。 これなら、eval内の処理も1つだけなので、rollbackしなくても済みますね。 ちなみに、Perl+DBIの際のevalとif($@)を使用したスタイルは、 http://homepage3.nifty.com/hippo2000/perltips/dbimemo.htm を見て知っておりましたが、実際の悩みは、evalエラーの際の if($@)の中身の方でした。 つまり、予期されるエラー(一意制約違反)の時にdieされては困るけど、 予期せぬエラー(例えばSQLの構文エラー)の時に、whileでループされるのも困る。 なので、↓のようにすることで  next if($DBI::errstr=~m/Duplicate entry '$rstr'/);  die $@; 回避できるという訳ですね。 ちょっと目から鱗ですが、予期されるエラーかそうでないのかの判断は、 やはり、$DBI::errstr内の文字列のマッチングという原始的な方法しか ないのでしょうか? とにかく、この問題は解決しましたので、お礼いたします。

関連するQ&A

  • ランダム文字列を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万の見込みです。 以上、長くなりましたがよろしくお願いします。

    • ベストアンサー
    • PHP
  • アルファベットを含むランダムな文字列を生成するには?

    通常の数字を用いた乱数を発生させるには OrderNo + Int(17 * Second(Time) * Rnd) :OrderNoはDB上にある注文番号の最終レコード値です という感じで、とりあえず適当にランダムな値を自動で生成させることができるのですが、 アルファベットなどの文字を含む場合のランダムな文字列の生成はどのようにすればよいのでしょうか? 感じできには、 UkB1PgMJ zK22fw2W N1np8zDb DbetjqKq Cj58pfYm というものです。 例は、小文字の[i][l][o]と大文字の[I][L][O]と数字の[0]を含まないランダムな文字列を8桁で生成しています。 (使用したソフトは、Fapsis氏のPassword Creator TypeB Ver3.5です) 具体的には何か関数で、このような文字列をランダムに発生させるものがあるのでしょうか?

  • エクセルVBAで、INSERT文を生成

    エクセルのデータよりDBにINSERTするためのINSERT文を生成するマクロを作っています。 INSERT文生成のVBAはできたのですが、少し仕様がいつもと違い困っております。皆様のお知恵を拝借できればと思っております。 【仕様】 1.1行ずつセルに文字列があるかどうかチェックする 2.セルに文字列が入ってる場合、例えば"z_1"が入ってる場合、一番左端のセル(A列)に記載されているID、例えば"001"、とともにinsert文を生成。 → INSERT INTO TBL名 id,code VALUES ('001','z_1') 3.1行には複数文字列が入っている場合があるので、文字列がある限りinsert文を生成。 4.文字列がないと判明した場合、次の行へ移動。 【具体例】 A1のセルにID:001 1行目の行、C1のセルに"z_1"、F1のセルに"j_5"、M1のセルに"c_3"などといった文字列があります。 この行のセルを一個ずつチェックして文字列があると、A1のIDを参照して、 INSERT INTO TBL名 id,code VALUES ('001','z_1') などといったインサート文を生成。 文字列がある限りINSERT文を生成します。 お知恵を拝借できれば幸いです。

  • ランダム文字列の生成の仕方

    こんばんは。 はじめまして。 JAVAでランダムの文字列を生成する時に何か便利な機能はあるのでしょうか? CGIでは確かあったはずなんですが、 自分なりに探してみたのですがわかりませんでした。 今の自分の考えでは、ランダムで数字は生成できるので それをChar型を使って文字コードで一文字取得して、それを連結するのかな? なんて考えています。 もっといい方法があればできればご教授ください。 よろしくお願いします。

  • あるカラムのMAX値+1をINSERTしたい。

    DB2環境です。 ある列のMAX値+1をINSERTしたいと思っています。 INSERT INTO TableName (atai1) Values ((SELECT MAX(BILLSUBNO)+1 FROM TR0400)) このように書いてみたのですが、「入力ホスト変数または パラメーター*Nで変換エラー」 と言われてしまい、コミットすることが出来ません。 +1を除けば出来るのですが、DB2ではVALUESの中で演算をすることは できないのでしょうか? もし方法がありましたら、教えてください。

  • ランダム文字列

    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
  • DBD::mysqlで「表」という文字をテーブルへインサートしたい

    お世話になります。 環境は windows2000pro perl 5.8.8 mysql 5.0.22 です。 mysqlの文字コード関連の設定はmy.iniにてsjisに統一してあります。 DBIを使って、perlスクリプトからmysqlのテーブルへ「表」という文字をインサートしようとするとエラーになります。mysqlクライアントからならちゃんと「表」もインサートできました。 エラーは以下のようになっています。 「 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''表\')' at line 1表 」 とにかくインサートしようとする文字列の最後の文字が「表」なら同様のエラーになります。 「表示」なら問題なくインサートできます。表の2バイト目が5cなのがまずいと思うのですが、どう対処すればよいかわかりません。 ヒントを下さい。よろしくお願いします。 ----- use strict; use DBI; use Encode qw(from_to); my $str = "表"; from_to($str,'utf8','shiftjis'); eval { my $dbh = DBI->connect( 'dbi:mysql:test,hostname=localhost', 'root','bnogl399',{ RaiseError => 1, PrintError => 0}); $dbh->do("set names sjis"); $dbh->do("use mydb"); $dbh->do("insert into foo values (3, " . $dbh->quote($str) . ")"); $dbh->disconnect(); }; print $DBI::errstr if $@;

  • パラメータをランダム文字列で表わしたい

    某サイトでリンクをクリックすると、下記のようにランダム文字列がパラメータとして渡されるものがあります。 http://www.foobar.jp/cgi-bin/abcd.cgi?a=10004414&b=PMird395j ランダム関数で生成?もしくは暗号化?しているのではないかと思うのですが、例えば商品番号などをそのままの数値でなく暗号化することができれば、セキュリティの向上にもつながるのではないかと思います。 このような文字列をPHPで簡単に生成する方法には、どのようなものがあるでしょうか。もちろん、文字列から元のIDや番号を復元できなければなりません。暗号化を使うのが良いのでしょうか。

    • ベストアンサー
    • PHP
  • DBI トランザクション中の予期されるエラーとそうでないエラーの振り分け

    例えば、ユニークなカラムに、CGIで生成したランダムな文字列を挿入する場合、 下記のようにしようと思います。 while(1){  $rstr=ランダム文字列作成;  eval{ $sth->execute($rstr); # INSERT文実行 };  if($@){   # ランダム文字列がユニークでない場合のエラー(予期されるエラー)   next if($DBI::errstr =~ /Duplicate entry/);   # それ以外のエラー(予期されないエラー)   die $@;  } } 「ユニーク違反です」というエラーの際は、次のループに入る、   next if($DBI::errstr =~ /Duplicate entry/); というこの部分、文字列のマッチングを行っていますが、 他に方法はないでしょうか?

    • ベストアンサー
    • Perl
  • perlでランダムな文字列を作りたい

    perlでランダムな文字列を作成する簡単な方法はありませんか? 文字数と文字種を指定できるとありがたいのですが。 $foo = hoge(8,'a-zA-Z0-9'); みたいな感じでできるといいのですが。 お願いします。

    • ベストアンサー
    • Perl