トップページ⇒php
1001コメント362KB

Perlコーディング初心者質問スレ Part 40

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん05/01/27 18:08:42ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0202nobodyさん05/02/07 11:15:29ID:???
>>196
>>198
メールアドレスのローカルパートって他の世界のメールシステムとの
やりとりもありうるので適切にエスケープすればほぼなんでもありの
仕様になっています。rfc2821の4.1.2にBNFがあるのでLocal-partって
とこを見ればいいですが、「"」でくくってQuoted-stringにすれば\を
前に置くことでCR,LF以外の任意の文字を書くことが出来ます。

くくらない場合は、英数字または「!#$%&'*+-/=?^_`{|}~」からなる1文字
以上の文字列、またはそれをを「.」をはさんで複数つなげたものが許され
ます。ただし、一部のケータイなどで連続した「.」を含んだり末尾が「.」
で終わる仕様に違反したアドレスを許しているので、あまり厳しくチェック
すると文句がでるかもしれません。

これを気にしなくてよければEmail::Validそのままでいいんだけどね。


0203nobodyさん05/02/07 11:16:20ID:???
2chが使ってる公開串リストによる規制が簡単に組み込めるみたいなので
http://bbq.uso800.net/code.html
にあるBBQによる方法で導入してみました
動作確認したいのですが公開串って何処で公開されてるんでしょうか
0204nobodyさん05/02/07 12:26:41ID:???
>>196
perlに関係ないじゃん。
rfcでアドレスに使える文字を調べないさいよ。

>>203
板違いだね。
初級ネット板かセキュリティ板へ。
0205nobodyさん05/02/07 13:02:28ID:???
>>201
天然ちゃん?
0206nobodyさん05/02/07 13:24:25ID:???
>>203こそ誘導すべきなのに、誘導厨は、いつも見当外れだな。
0207nobodyさん05/02/07 13:29:03ID:???
誘導されてるけど?
0208nobodyさん05/02/07 15:47:18ID:???
ファイルを開いて書き込み中に他のプロセスがファイルを開けて囲うとすると
壊れますよね。
いわゆる排他処理って言うと思うんですが、今まで一度もやったことがありません。

Perlの経験はネットショップをmysqlとの連携で構築したりその他ちまちましたものばかりです。
基本的にファイルではなくDB連動ばかりだったので勝手に排他処理をしてもらってたせいで。

どこかPerlでやる排他処理について詳しいサイトありますか?
一応windowsでもUNIXでも共通の方法を探してます。
0209nobodyさん05/02/07 16:15:16ID:???
>>208
排他処理は難しい
多分このスレの半分はできないだろう
それくらい難しいし面倒だ
0210nobodyさん05/02/07 19:09:05ID:???
>>207
今回は違う人が誘導したんでしょ。
誘導厨フォーマットじゃないし。

↓

>>000
スレ違い

△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0211未承諾広告※ ◆TWARamEjuA 05/02/07 19:20:38ID:???
>>203
【BBQ 3本目】公開串登録所 【ピンポイント規制】
http://qb5.2ch.net/test/read.cgi/sec2chd/1105274729/l50

ここを眺めればいくらでも(w
0212nobodyさん05/02/07 20:05:31ID:???
>>210
おまい何でそんなに必死なん?
0213nobodyさん05/02/07 21:02:12ID:???
誘導厨の方が、明らかに必死だ罠
0214nobodyさん05/02/07 21:42:44ID:???
いいや、反応してるほうが相当に必死に見える。
0215nobodyさん05/02/07 21:54:28ID:???
nfkやmob_PaqlだったらFLOCK最強!
0216nobodyさん05/02/07 21:57:08ID:???
>>215
お前のエンゲージリングはプルタブ
0217nobodyさん05/02/07 23:02:26ID:???
だから誘導してみたかったんだけだろ
0218nobodyさん05/02/07 23:05:47ID:???
# main.cgi
#!/usr/bin/perl
require './require.pl';
&hogehoge;
# hogehoge2を呼び出さずに終了
exit;
-------------------------
# require.pl
sub hogehoge{
(中略)
}

sub hogehoge2 {
(中略)
}
--------------------------

この場合に呼び出していない、require.plのhogehoge2はコンパ
イルされるのでしょうか。
それとも、呼び出さなければコンパイルされないのでしょうか。
教えていただければ幸いです。
0219nobodyさん05/02/07 23:18:56ID:???
>>208
ttp://homepage1.nifty.com/glass/tom_neko/web/web_04.html
http://web.archive.org/web/20040216083853/www98.sakura.ne.jp/~jun/perl/flock.html
0220nobodyさん05/02/07 23:34:49ID:???
>>218
コンパイルされるはず。

それをなんとかしたければAutoLoaderについて調べてみるといい。

0221nobodyさん05/02/07 23:39:55ID:Cfgr4b2r
>>196
Email::Valid
Email::Valid::Loose
Docomoの変なのもおっけ
到達可能かもみます
0222nobodyさん05/02/07 23:43:35ID:???
>>220
コンパイルされますか…

# main.cgi
#!/usr/bin/perl
$_ = 1;
if ($_ == 1){ require './require1.pl }
elsif ($_ == 0){require './require2.pl'}
&hogehoge;
# require2.plを呼び出さずに終了。hogehoge2を
# コンパイルしない分負荷が減る
exit;
----------------------
# require1.pl
sub hogehoge {
(中略)
}
----------------------
# require2.pl
sub hogehoge2 {
(中略)
}
-----------------------
みたいな感じで別ファイルにして対処しようと
思います。ありがとうございました。
0223nobodyさん05/02/08 02:09:22ID:???
そんなんで負荷が減るとでも?
0224nobodyさん05/02/08 02:15:40ID:???
つまんないことに熱心になるやつっているもんだな。
0225nobodyさん05/02/08 02:54:05ID:???
ああ、誘導とか?
0226nobodyさん05/02/08 03:39:12ID:???
いや、その誘導に拘っていつまでもグダグダ言ってるやつのこと。
0227nobodyさん05/02/08 03:43:09ID:???
誘導を注意してる奴って複数居るけど、誘導厨って一人だよね?
なんでこんなに即レスなの?
0228nobodyさん05/02/08 03:51:50ID:???
暇なんじゃない?
0229nobodyさん05/02/08 13:26:19ID:???
誘導を注意してる奴のほうが一人だろ。
いつも誘導に反応する奴なんてまったくいないのに。
何人もいるように見せかけているが、近い時間に書いてるし。

いずれにしても注意してるヒマがあったら、ここでも誘導先でも
答えてやればいいのに。
0230nobodyさん05/02/08 15:05:46ID:???
>>224-229
暇だなお前ら。

>>231
質問ドゾ。
0231nobodyさん05/02/08 16:47:26ID:???
>>230
ご趣味はなんですか?
0232nobodyさん05/02/08 16:58:30ID:???
ショップとか掲示板とか何ページあろうが1個のCGIで済ませるときって
みなさんはページ移動をどうやってますか?

私は今まで
if ( $form{page} eq "hoge") {#hogeページの処理

}elsif( $form{page} eq "hage" ){#hageページの処理
}

こうしてました。で、ふと思ったのですが、もしかしてページごとにサブルーチンに
しておいて、$form{p}の値を見てどのルーチンを呼ぶかを分岐させた方が
わかりやすいかもって。

みなさんはどうやってますか?
0233nobodyさん05/02/08 17:00:00ID:???
>>232
ページごとに小さかったらサブルーチン、大きかったらファイルに分けちゃう。
0234nobodyさん05/02/08 18:38:16ID:???
>>229
誘導厨には誰も賛同しないからレスが着いてないだけだろ
0235nobodyさん05/02/08 18:48:30ID:???
お!注意厨が現れたね。
同じぐらいに時間に登場とはわかりやすい。
0236nobodyさん05/02/08 19:24:33ID:???
なんか、道ばたでタバコ吸ってるの注意されたけど、
お前に何の権利があるんだよとか、いちいち注意してんじゃねーよとか
意味不明な反抗をする高校生みたいになってきてるな。
0237nobodyさん05/02/08 19:25:19ID:???
あと、こんな時間に見回りなんてヒマだなとか、お前の息子だってやってんだろ?とか言うな。
0238nobodyさん05/02/08 21:06:40ID:???
>>232
4つぐらいならifで分岐させるけど、
それより多くなったらテーブル使うかな。
0239nobodyさん05/02/08 21:45:37ID:???
画像掲示板でHTMLを書き出すタイプのスクリプトを組みました。
そこで画像サイズを取得し、<img width="***" height="***" src="***">のように書き出そうと
Image::Size を使用しようとしましたがサーバーにはインストールされておらず、 Size.pm を設置する事にしました。

ローカルでは README.win32 に書かれたとおりの編集をし
perl/site/lib/Image/Size.pm に置く事で動きました。

サーバーに設置する事も想定し、スクリプトのあるフォルダに
lib/Image/Size.pm と設置し、スクリプトに use lib "lib"; の記述で動くことも確認しました。

そして、サーバーに同様の構造で「未編集」の Size.pm を設置しましたが動きませんでした。
# 正確にいうと ($width, $height) = imgsize("$file_name"); で止まるようです。
しかし、 README.win32 に書かれた編集を施した Size.pm では無事に動きました。

実際にした編集というのは use AutoLoader 'AUTOLOAD'; と __END__ の2行を消しただけです。

何故、 Win 用の編集で動くようになったのでしょうか?
動くようになったこと自体はいいのですが、サーバー側に迷惑をかけてる可能性はありますでしょうか?
0240質問05/02/08 22:09:04ID:???
tsv形式のデータをcgiで呼び出してリスト表示(html) 内容は担当者名や企業名、案件の内容等
 ↓
表示したリストからpptファイルへリンク

これって出来ますか
0241nobodyさん05/02/08 22:12:18ID:???
>>239が生きていること自体が世間に迷惑をかけている。
0242nobodyさん05/02/08 22:16:03ID:???
>239
君が初心者なのはわかった。
でも君がやろうとしてる事はちょっとだけ初心者の域を抜けかけてる。
初心者が下手にやると危険。
中級者になってから挑んでください。
024323905/02/08 22:44:01ID:???
レスありがとうございます。
危険な事だという事はわかりましたので、素直に Image::Size を
サーバー管理者にインストールして貰うようにメールしてみます。

あと、私の犯した過ちは Win 用のファイルをあげた点で間違いないでしょうか?
0244nobodyさん05/02/08 23:20:35ID:???
つーか主要な画像(JPEG, PNG, GIF)のサイズくらいなら、
自分のスクリプト内に、サイズ求めるソース組みこだらいい。
検索したら何かあるでしょ。
024523905/02/08 23:36:14ID:???
>>244
そうですね。私にはまだモジュールは早すぎたようです。
勉強して出直してきます。

レスありがとうございました。
0246nobodyさん05/02/09 00:34:32ID:???
>>239
いいや。今のまま使い続けても、何も心配する必要は無い。
Image::Size は様々な形式の画像ファイルのサイズを得る機能を有しているが、
ある特定の形式(例えばgif)のみのサイズを得たい場合
には、その形式に必要な機能のみを、メモリに展開すれば済む。
そこで、実際に指定された画像形式に応じて必要な機能のみを
実行時にメモリに展開するのがAUTOLOADだ。

> 実際にした編集というのは use AutoLoader 'AUTOLOAD'; と __END__ の2行を消しただけです。
それをやると、Image::Size が対応しているあらゆる画像形式の
機能が全てメモリに展開されることになる。だから、メモリ容量が
多少無駄になるが、特に支障があるというわけではない。
0247nobodyさん05/02/09 00:52:14ID:cKLRZBQZ
民明書房刊「イメージとメモリ〜鈴木支障と世界の中田〜」より
0248nobodyさん05/02/09 07:37:58ID:???
8文字以上の文字列の暗号化を行いたいのですが
cryptは8文字目以降は無視するようなので
crypt以外で8文字以上の文字列を暗号化する良い方法を教えてください
0249nobodyさん05/02/09 07:42:47ID:???
>>248
8文字ごとに切ってcryptする
0250nobodyさん05/02/09 08:23:26ID:???
>>248
MD5で暗号化する
0251nobodyさん05/02/09 10:13:54ID:???
ず〜っとハマってるんですが・・・
CGI.pmを使用して、クライアントからファイルのアップロードをさせたいのですが・・・
コードはこちらです。

#!/usr/bin/perl

use strict "vars";
use strict "subs";
use CGI;

print "Content-typt: text/html; charset=euc-jp\n\n";

our $fh;
our %columns{upload_file} = $query->param(’upload_file’);

&hozon();

sub hozon() {
 my $query = new CGI;
 $fh = $query->upload(’upload_file’);
 print ”$fh<BR>”;
 while(<$fh>) {
  print "$_<BR>"
 }
}

というコードだと、ブラウザにwhileの中の$_の内容を出力できないのです。
print ”$fh<BR>”;はきちんとファイルパス名が出力されます
ここでour $fhと宣言しますが、これを削除し、
my $fh = $query->upload(’upload_file’);
とローカルとして宣言するとブラウザに出力される事になります。
何が原因なんでしょうか?
0252nobodyさん05/02/09 10:50:26ID:???
>>251
空白や記号が全角になってるのを半角に直してperlに食わせてみたが
そもそも構文エラーでるじゃん。実際におかしいものと違うコードを
見せられてもなぁ。

025325105/02/09 11:20:40ID:???
>>252
まじっすか?

ごめんね。
ちょっとチェックしますね。
025425105/02/09 11:27:13ID:???
すいませんでした。
書き込むときってみやすいように全角使ったんですけど、
こういうのって直接コード書いたほうがいいんですかね?

#!usr/bin/perl

use strict "vars";
use strict "subs";
use CGI;

print "Content-typt: text/html; charset=euc-jp\n\n";

our $fh;
our %columns;


&hozon();

sub hozon() {
my $query = new CGI;
$columns{upload_file} = $query->param('upload_file');
$fh = $query->upload('upload_file');
print "$fh<BR>";
while(<$fh>) {
print "$_<BR>";
}
}
0255nobodyさん05/02/09 11:54:12ID:???
複数行をコメントアウトするにはどう書いたらいいんでしょうか?
Cでいったら/* */見たいなやつです。
0256nobodyさん05/02/09 12:00:37ID:???
>>255
ググればすぐ出てきます。
0257nobodyさん05/02/09 14:01:11ID:???
>>254
Content-typtという打ち間違いがある状態でまともに動いて
いるとは思えないのだが、そのコードでちゃんとおかしな現象が
再現してるのを確認してるかい? おかしい現象が起きてるものを
そのまま出してもらわないと付き合いきれんよ。

ちなみにそのtypoを直して実行してみたところ、そのコードで
普通にファイルの中身も出力された。

025825105/02/09 14:43:07ID:???
ごめん。
実際に動かしているコード
#!/usr/bin/perl

use strict "vars";
use strict "subs";
use CGI;

print "Content-type: text/html; charset=euc-jp\n\n";

our $fh;
our %columns;

&hozon();

sub hozon() {
my $query = new CGI;
$columns{upload_file} = $query->param('upload_file');
$fh = $query->upload('upload_file');
print "$fh<BR>";
while(<$fh>) {
print "$_<BR>";
}
}
やっぱりこれで、ブラウザに表示されないですね。
$fhにはC:\Documents and Settings\hogehoge\デスクトップ\新規テキスト ドキュメント.txtと出力されます。
$fh = $query->upload('upload_file');  を my $fh = $query->upload('upload_file');  にして
our $fh; を #our $fh;
にするとすべてブラウザに出力されますね。

リファレンスとか絡んでるんだろうか?
0259nobodyさん05/02/09 16:03:09ID:XVTcbf3E
ファイルにcsvもどきみたいな感じで
時間,名前,コメント
時間,名前,コメント
時間,名前,コメント
というようなデータの列挙が1000件以上あります。
これを元に色々な処理をしたいので、ハッシュに入れようと思ったけど、キーがないので入れられません;
1000件以上になるのでabcd...なども無理です。

そこで「a行数」のキーを与えようかとも思ったのですが、論理的なキーではないのでイマイチ気が乗りません。
何か良い方法はないでしょうか?普通はこういうときってどうするのでしょうか?

やはり「a行数」というキーを持たせるしかありませんか?
0260nobodyさん05/02/09 16:05:36ID:???
キーが無いならハッシュでなく配列に入れれば良いような気がするけど
特にハッシュにしなきゃいけない理由って何かあるの?
0261nobodyさん05/02/09 16:07:48ID:???
キーは数字からはじまってもいいんだよ。
0262nobodyさん05/02/09 16:11:56ID:???
>>258
手元で試した限りではそのままで出ますね。

026325905/02/09 16:15:15ID:XVTcbf3E
>>260
そうか・・・・・
>>261
それは知りませんでした;

しかし>>260さんが言うようにa行数のようにしたい時点で配列を使えばいい状況
ということですねm(_ _)m
配列の中にリファレンスでいれておきます。解決です。ありがとうございました!
0264nobodyさん05/02/09 16:16:02ID:???
>>259
配列に入れちゃダメなの?

open(FHIN,'csvfile') or die "can not open csvfile\n";
$i = 0;
while(<FHIN>) {
($time[$i],$name[$i],$coment[$i]) = split(/,/,$_);
}

とかで、いろいろ出来ると思うけど。

逆の他の人に聞きたいのは
while(<FHIN>) {
@datas[$i] = split(/,/,$_);
}
とかで
@datas0にデータ入れて
じゅんじゅんに
@datas1とかに入れるのってどうやってやんの?
0265nobodyさん05/02/09 16:16:49ID:???
>>264
インクリメント忘れた
026625105/02/09 16:27:57ID:???
俺の環境じゃダメだわ、もう逝くわ

みんな、ありがとう。

いい夢みろよ!!
0267nobodyさん05/02/09 16:51:03ID:???
>>264
#!/usr/bin/perl -w
my @data;
chomp, push @data, [ split /,/ ] while <DATA>;
print $data[1][2]; # h
__DATA__
a,b,c,d,e
f,g,h,i,j
k,l,m,n,o

http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldsc.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perllol.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html
0268nobodyさん05/02/09 17:27:25ID:???
>>264
pushだろ

って書こうとしたら267に先越された
0269nobodyさん05/02/09 17:31:30ID:???
>>267
chomp, push @data, [ split /,/ ] while <DATA>;

はいくらなんでも詰めすぎじゃないかと。

普通に書くなら

while (<DATA>) {
chomp;

push @data, [ split /,/ ];
}

ぐらいじゃないかなー。
0270nobodyさん05/02/09 17:54:45ID:???
>>269
そうかくと分かりやすいね。
0271nobodyさん05/02/09 18:59:46ID:???
人それぞれじゃない?
私は
chomp, push @data, [ split /,/ ] while <DATA>;
の方が直感的に頭に入ってくるな
0272nobodyさん05/02/09 19:02:07ID:???
育ってきた環境かね?
俺ってオライリーのperl本で勉強したから
>>269がわかりやすいなぁ
0273nobodyさん05/02/09 20:09:21ID:???
上我流
下主流
0274nobodyさん05/02/09 21:09:26ID:???
だな。
0275nobodyさん05/02/09 22:00:05ID:???
オライモンのperl CGIってのあると思うけど、
あれ面白い?っていゆーか実践的な内容?
0276nobodyさん05/02/09 22:19:03ID:oNgMiBuj
リダイレクトで'Location:http://hogehoge/'と出力させるとGETメソッドでしか
データを送ることができないと思うのですが、POSTで送る方法などはありますか?
0277nobodyさん05/02/09 23:07:01ID:???
>>276
http://homepage3.nifty.com/hippo2000/perltips/lwpcook.html#POST
0278nobodyさん05/02/10 02:07:22ID:???
@hoge=<IN>;
とするとき、改行\nを消す方法があれば教えてください
0279nobodyさん05/02/10 02:36:02ID:???
@hoge=<IN>;
chomp @hoge;
0280nobodyさん05/02/10 03:26:26ID:???
use strict;

$::info{'no_dir'} = [ q[test], q[test2] ];
BEGIN {
  #▼なんかディレクトリからファイルを返す関数
sub file_list (&$;$) {

  my ($code, $dir_name, $mode) = ($_[0], $_[1], $_[2]);

  my $pass;
    {
      $pass = $dir_name . q[./], last if(qq[\l$mode] eq q[p] or !$mode);
      $pass = "", last if(qq[\l$mode] eq q[f]);
    return();  #モードが変なのは処理しない。
    }
  opendir DIR, $dir_name or return ();
     my @file_list = grep{ $_ = $pass . $_; &$code; } (readdir DIR);
  closedir DIR;
  foreach my $file (@file_list){$file =~ s[/\./][/]g;}

  return(@file_list);

  }
0281nobodyさん05/02/10 03:27:00ID:???
#▼対象ディレクトリ全取得
{
search($::info{'pass'});    #対象ディレクトリ全検索

sub search {
  foreach my $dir (@_){
    my @list;
      @list = file_list {  #ディレクトリ全取得
        -d                      #範囲をディレクトリに絞って…
      and !(m/[\/\.]+$/)                #自己参照ディレクトリの類は排除して…
      and my $now_dir = $_            #ちょっとキモい処理をして…
      and !( grep { $now_dir =~ m[/$_$]; } @{$::info{'no_dir'}} )  #除外指定ディレクトリは無視。ところがこれがエラー
      } $dir;
      @list = map {$_ . '/'} @list;    #なんかUNIXではこれやらないとダメっぽい。(winではいらない)

    push @::dir_list, @list;      #ディレクトリ追加
    search(@list) if(@list);      #ディレクトリがまだあったら再帰
    }
  }
}

0282nobodyさん05/02/10 03:27:47ID:???
and my $now_dir = $_ #ちょっとキモい処理をして…
and !( grep { $now_dir =~ m[/$_$]; } @{$::info{'no_dir'}} ) #除外指定ディレクトリは無視。ところがこれがエラー

↑ここんことが変になるんですけど、どーしたらいいんかね?
028328205/02/10 03:32:30ID:???
あ、上げるの忘れてた。
あと、>>280の最後んとこでBEGINブロック閉じるの忘れたのは突っ込まないで。
0284nobodyさん05/02/10 05:12:42ID:FuWRzUOO
スレ違いだったすいません。
新しいサイトでフォームを使いたいのですがうまくいきません。
書き込み用のform.html(仮名)とform_mail.cgiは古いサイトでは
フォームの送信後メールがちゃんと届いたのですが、
新しいサイトでは何故か機能しません。
cgiのパールへのパスとドメイン所属のメールアドレス、
form.html内のform_mail.cgiへのパスは正しく書き換えている
(つもり)のに。。。ディレクトリーも同じように設定してます。
フォーム送信にhtmlとcgiファイル以外でしなければいけない事、
必要なファイルってありますか? 
ひとつ疑問に思ったのは古いサイトではcgiのパーミッションを入力して
再接続すると前回に入れた数字(755)が残るのに、
新しいサイトでは入力後に再接続してもその数字は残っていません。
あとフォームを機能させるためにhtaccessって必要ですか???? 
分かる人どうか宜しくお願いします!!
028528405/02/10 05:14:53ID:FuWRzUOO
284ですが、CGI質問スレ発見 あちらで聞きまスルー。
0286nobodyさん05/02/10 09:55:26ID:GQajLbsS
if (条件a){
$a = 1;
}elsif(条件b){
$a = 2;
}else{
$a = 0;
}

これを1行ないし2行で収めることはできませんか?
?演算子を使えばできるかと思ったのですが、3つは無理みたいで;
知恵をお貸し下さいm(_ _)m
0287nobodyさん05/02/10 10:09:46ID:???
>>286
$a = 条件a? 1: 条件b? 2: 0;

で普通にいけると思うけどなんか変になるのかね?
条件の部分は場合によってはカッコいるかも。
028828605/02/10 10:25:55ID:GQajLbsS
>>287
!?
そういうのもありなんですねm(_ _)m
028928605/02/10 11:06:28ID:GQajLbsS
追加質問ですみませんが、以前から気になっていたことがありまして;

XSS対策にメタ文字エスケープをするときってCGI関係ではよくありますよね。
基本的には埋め込む直前にケースバイケースのエスケープをするのですが、
みなさんはどうやってますか?

元の文字列を加工したものを『他の新しい変数に入れて』ますか?それとも
『元の変数に上書き』してますか?
後者だと元データがなくなるので何かと不都合の原因になりますよね。
しかし新しい変数を用意すると、色々なところで色々なエスケープが必要になるので
だんだん頭がこんがらがります;簡潔性を欠くといいますか・・・
0290nobodyさん05/02/10 11:42:53ID:???
>>289
俺は普通に上書きしてる
>元データがなくなるので何かと不都合の原因になりますよね
これの意味がわからん。必要なときは元に戻せばいいじゃないか。不可逆変換やってるわけじゃないんだから。
0291nobodyさん05/02/10 11:45:26ID:???
>>289
私は最終出力時にエスケープ派であります。といっても
最近はほとんどテンプレートライブラリ使うので、テンプレート
側でエスケープ形式を指定するだけのことがほとんどですが。
029228605/02/10 13:35:23ID:GQajLbsS
>>290-291
ありがとうございます。

やはりみなさんそれぞれなのですね。
見易さ・わかりやすさの点でやはり変数を用意したほうがいいのかなと思ってます。
%form
%form_html
%form_sql
現在こういう感じです。
0293nobodyさん05/02/10 13:58:59ID:???
>>292
SQLはプレースホルダ使うのでデータをエスケープすることは
ないなぁ。
0294nobodyさん05/02/10 15:15:16ID:???
mysqlのテーブルにデータを挿入時にユニークキーとして任意の数字列を使っています。(挿入時に重複でインクリメント)
インクリメントのせいで、一度入れないとユニークキーが何かわからないのですが
挿入した直後にそのユニークキーを表示させたいのですが、どうすればいいでしょうか?

ユニークキー以外は重複している可能性が十分にあるデータ群なので、途方にくれています

そのプロセスが今挿入したデータに挿入時に自動的につけられたユニークキーが
何だったのかを調べるにはどうすればいいでしょうか?
0295nobodyさん05/02/10 15:21:20ID:???
>>294
無理だろ。
だって極端な話にすれば、ユニークキー以外が全部同じ内容のものなら
自分のユニークが何なのかを調べる方法なんてない。
0296nobodyさん05/02/10 15:27:41ID:???
DBI使ってるならインクリメントしたかどうかを調べられたんじゃなかったか?
最近使ってないから忘れたw
0297nobodyさん05/02/10 15:36:08ID:???
面倒な方法だが、プロセスIDと挿入時の時間もとっておけば
それを元に取り出せるけどな。
まぁそのためだけに二つもフィールドを増やすのはあまり気分がよくないわな。
029829405/02/10 15:57:58ID:???
>>295
そうなのですかorz
実際にどういうデータが入ったかを確認するすべはないんですね…
>>296
本当ですか!?DBI使ってます。調べてみます。
>>297
そのためだけに増えるのはちょっとしんどいですよねorz

自分が挿入したレコードに付けられたユニークキーを調べることができないって…
つまり自分が何を入れたのかを確実に調べる方法が用意されてないってことですよね;
0299nobodyさん05/02/10 16:19:29ID:???
>>298
俺いまPostgreでユニークキーをインサートするためにやっているのが、
普通に順序のテーブルからnextvalでとってきて、
INSERTするときにnextvalからとってきてのをvalueで指定してるけど、
その考え方はだめ?
0300nobodyさん05/02/10 16:53:46ID:???
>>294
autoincrementじゃいかんの
030129405/02/10 17:06:32ID:???
>>300
いえ、ユニークキーがautoincrementになってるので、実際に挿入するまでは
どういうユニークキーになるのかわからないんです。
それで挿入した本人に自分が今入れたユニークキーを知らせることができずに困ってるのです。

>>299
nextvalって使ったことないです。ちょっと勉強してきます。
0302nobodyさん05/02/10 19:29:44ID:???
>>301
auto_incrementならば、select last_insert_id()で取り出せるし。
http://dev.mysql.com/doc/mysql/ja/miscellaneous-functions.html
> LAST_INSERT_ID([expr])
> AUTO_INCREMENT カラムに挿入された値のうち、最後に自動生成された値を返す。
> mysql> SELECT LAST_INSERT_ID();
> -> 195

>>294の説明では、自前でユニークキーを作成しているみたいに読めるが。
SQLの問題だね。
■ このスレッドは過去ログ倉庫に格納されています