ラウンジ(兼FAQ掲示板)

あんQでの不具合について
過去ログ NO.1170302013
□ ひろたか [2007年01月29日10時50分]
NXerさん緊急でお聞きします。
不具合です。
新規で投稿する際に複数の項目を入力すると□○○,××という風になり二つ目以降が投票項目として追加されません。
しかし、新規でアンケートを投稿した後に項目の追加でなら追加できます。
私なりにですが、恐らく新規で投稿した際に本来は□○○,□××とならなければならないのが二つ目以降の項目に関して□が不可されないのが原因だと考えます。
しかし、どの箇所を直せばいいのか解らず困っています。
宜しくお願いします
□ ひろたか [2007年01月29日11時19分]
NXerさんへ
もう少し詳しく調べてみたところ、下記のソースのPOSTをGETすれば新規でアンケートを投稿時に複数の項目を入力していても複数の項目で設定されるのですが、画像が添付しません。
一方POSTだと画像は添付されるが項目が複数の場合だと二つめ以降が表示されません。
どうすればいいでしょうか?
print "<form action='$script' method='POST' enctype='multipart/form-data' onSubmit='return lock()'>\n<table bordercolor='#FF8000' border>\n";
print "<input type=hidden name=mode value=new_file>\n";
print "<input type=hidden name=filename value=$newnum>\n";
print "<input type=hidden name=content>\n";
print "<input type=hidden name=pfilename>\n";
#print "※登録後の修正・削除できません\n";
print "<tr><td><b><font color='red'>あなたの名前(必須)</b>:</font></td><td><input size=30 name=name></td></tr>\n";
print "<tr><td>顔アイコン:</td><td>\n";
print "<input type=radio name=mail value=1><img src='./img/kao1.gif'>\n";
print "<input type=radio name=mail value=2><img src='./img/kao2.gif'>\n";
print "<input type=radio name=mail value=3><img src='./img/kao3.gif'>\n";
print "<input type=radio name=mail value=4><img src='./img/kao4.gif'>\n";
print "<input type=radio name=mail value=5><img src='./img/kao5.gif'>\n";
print "<input type=radio name=mail value=6><img src='./img/kao6.gif'>\n";
print "<input type=radio name=mail value=7><img src='./img/kao7.gif'>\n";
print "<input type=radio name=mail value=8><img src='./img/kao8.gif'>\n";
print "<input type=radio name=mail value=9><img src='./img/kao9.gif'><br>\n";
print "<input type=radio name=mail value=10><img src='./img/kao10.gif'>\n";
print "<input type=radio name=mail value=11><img src='./img/kao11.gif'>\n";
print "<input type=radio name=mail value=12><img src='./img/kao12.gif'>\n";
print "<input type=radio name=mail value=13><img src='./img/kao13.gif'>\n";
print "<input type=radio name=mail value=14><img src='./img/kao14.gif'>\n";
print "<input type=radio name=mail value=15><img src='./img/kao15.gif'>\n";
print "<input type=radio name=mail value=16><img src='./img/kao16.gif'>\n";
print "<input type=radio name=mail value=17><img src='./img/kao17.gif'>\n";
print "<input type=radio name=mail value=18><img src='./img/kao18.gif'><br>\n";
print "<input type=radio name=mail value=19><img src='./img/kao19.gif'>\n";
print "<input type=radio name=mail value=20><img src='./img/kao20.gif'>\n";
print "<input type=radio name=mail value=21><img src='./img/kao21.gif'>\n";
print "<input type=radio name=mail value=22><img src='./img/kao22.gif'>\n";
print "<input type=radio name=mail value=23><img src='./img/kao23.gif'>\n";
print "<input type=radio name=mail value=24><img src='./img/kao24.gif'>\n";
print "<input type=radio name=mail value=25><img src='./img/kao25.gif'>\n";
print "<input type=radio name=mail value=26><img src='./img/kao26.gif'>\n";
print "<input type=radio name=mail value=27><img src='./img/kao27.gif'><br>\n";
print "<input type=radio name=mail value=28><img src='./img/kao28.gif'>\n";
print "<input type=radio name=mail value=29><img src='./img/kao29.gif'>\n";
print "<input type=radio name=mail value=30><img src='./img/kao30.gif'>\n";
print "<input type=radio name=mail value=31><img src='./img/kao31.gif'>\n";
print "<input type=radio name=mail value=32><img src='./img/kao32.gif'>\n";
print "<input type=radio name=mail value=33><img src='./img/kao33.gif'>\n";
print "<input type=radio name=mail value=34><img src='./img/kao34.gif'>\n";
print "<input type=radio name=mail value=35><img src='./img/kao35.gif'>\n";
print "<input type=radio name=mail value=36><img src='./img/kao36.gif'><br>\n";
print "<input type=radio name=mail value=37><img src='./img/kao37.gif'>\n";
print "<input type=radio name=mail value=38><img src='./img/kao38.gif'>\n";
print "<input type=radio name=mail value=39><img src='./img/kao39.gif'>\n";
print "<input type=radio name=mail value=40><img src='./img/kao40.gif'>\n";
print "<input type=radio name=mail value=41><img src='./img/kao41.gif'>\n";
print "<input type=radio name=mail value=42><img src='./img/kao42.gif'>\n";
print "<input type=radio name=mail value=43><img src='./img/kao43.gif'>\n";
print "<input type=radio name=mail value=44><img src='./img/kao44.gif'>\n";
print "<input type=radio name=mail value=45><img src='./img/kao45.gif'>\n";
print "<tr><td class=input valign=top>添付画像ファイル</td><td><input type=file name=file size=50><br>Max:50k_max_size</td></tr>\n";
print "<tr><td>参照URL:</td><td><input size=40 name=url2 value='http://'></td></tr>\n";
print "<tr><td><b><font color='red'>アンケートテーマ(必須)</b>:</font></td><td><TEXTAREA cols=65 rows=3 name=subject></TEXTAREA><br>アンケートテーマは最大100文字までとなっております。</td></tr>\n";
print "<tr><td><b><font color='red'>カテゴリ(必須)</b>:</td><td><select name=mail2 >\n";
for ($i = 0; $i < 10; $i++) { if (! $i) { print "<option>--<option>芸\能\・映画<option>スポーツ・レジャー<option>趣味・生活<option>恋愛・夫婦<option>流行<option>ゲーム・パ\ソ\コ\ン<option>政治・経済<option>その他"; }else { print"<option>"; }
}
print "</select>\n";
print "<tr><td><b><font color='red'>アンケート項目(必須)</b>:</font></td><td><select name=anq_view onChange='mod(this)'>\n";
for ($i = 0; $i < 10; $i++) { if (! $i) { print "<option>現在設定されている項目はありません   "; } else { print "<option>"; } }
print "\n</select><br><input size=45 name=anq_value onFocus='key=1' onBlur='key=0'><input type=button onClick='value_plus()' value='追加'><input type=button onClick='del()' value='削除'><br>\n";
print "↑に投票項目を記入して【追加】をクリックして下さい。<br>修正:項目を選択→修正→【追加】<br>項目の削除:項目を選択→【削除】<br>(一度に設定できるのは10項目までです。)<br>(項目文字数は最大で20文字までとします。)</td></tr>\n";
print "<tr><td>アンケート項目の追加:</td><td><input type=radio name=ent_mode value=1>不可 <input type=radio name=ent_mode value=0 checked>可</td></tr>\n";

#print "<tr><td>重複投票:</td><td><input type=radio name=repost_mode value=1 checked>不可 <input type=radio name=repost_mode value=0>可</td></tr>\n";
print "<tr><td>アンケート終了日:</td><td>";

print "<select name=end_y>\n";
for ($i = $year; $i <= $year+5; $i ++) { print "<option value=$i>$i\n"; }
print "</select>年 \n";

print "<select name=end_m>\n";
for ($i = 1; $i <= 12; $i ++) {
if ($i == $month) { printf ("<option value=%02d selected>%02d\n",$i,$i); }
else { printf ("<option value=%02d>%02d\n",$i,$i); }
}
print "</select>月 \n";

print "<select name=end_d>\n";
for ($i = 1; $i <= 31; $i ++) {
if ($i == $mday) { printf ("<option value=%02d selected>%02d\n",$i,$i); }
else { printf ("<option value=%02d>%02d\n",$i,$i); }
}
print "</select>日<br>※終了日の設定にご注意下さい。\n";
#print "<input type=radio name=nolimit value=1 checked>指定しない→無期限</td></tr>\n";
print "<tr><td><b><font color='red'>削除用パスワード(必須)</b>:</font></td><td><input size=10 type=password name=pass>(半角英数)</td></tr>\n";
print "<tr><td colspan=2 align=center><input type=submit value=' 登 録 ' class=btn> <input type=reset value=' クリア ' onClick='resept()' class=btn></td></tr></table>\n<p>\n";
#print "■<a href='$script'>アンケート一覧へ</a>\n";
print "</blockquote>\n";
print "</form></body></html>\n";

exit;
}

sub new_file {
&photo_file;

$mesnew=$in{'name'};&antispam;
$mesnew=$in{'subject'};&antispam;
$mesnew=$in{'url'};&antispam;
□ NXer [2007年01月29日17時13分]

>緊急

当方のスクリプトで、日英2言語用にすると英語の場合に分かち書き、
例 第1項目 Is the world flat? 地球は平らですかと項目を設定します。
すると
----------
□Is
□the
□world
□flat?
□地球は平らですか
--------------------
となります。ひろたかさんの逆の現象です。当方も
>どの箇所を直せばいいのか解らず
絶望の谷底をさまよいました。幸い、ひろたかさんの次の問題は、
\, という2つの記号挿入でおそらく解決します。これがどん底から
はいあがる手がかり(handhold)になりました。NXerです。

問い
>GETすれば,,,複数の項目で設定されるのですが、画像が添付しません。
>一方POSTだと画像は添付されるが,二つめ以降が表示されません。

解消愚案
-------------------------
1075 if ($in{'content'}) {
#----------------------
#■@cont = split (/ /,$in{'content'});
 @cont = split (/\,/,$in{'content'});
#----------------------------------------
\とはエスケープ記号です。つづくコンマはperlの識別子では
なくコンマの意味の文字としてperlに認知処理されます。
javascrptとperlの併用のために、見落としがちな分割split()関数
です。
余談ですが、英語の半角空白の処理はさらにデコード部が関わります。
もし、日本語ベースで、しかも日英が混在する文の場合は、さらに
表示で幾つか処理が加わります。

以上です。
***********************************その他デバグの要領追記
添付画像を変更しない場合、編集すると拡張子のエラーがでました。
その修正愚案です。

もし(画像があれば){エラー処理します;}

という意味の、次の修正をしてください。
もし画像ファイルがあるときは、画像送信サブルーチンを
通します。それ以外の編集は、通らずにその先へすすみ
ます。

修正1
sub regist {
if ($in{'repost'}){unlink "$dir$in{'repost'}";}
#---------------
#■&photo_file;元、下新
if ($in{'file'}){&photo_file;}
#-----------------

あるいは、修正2
修正1をしないで、よりエレガントな処理は次です。
sub photo_file {
#----shadow.cgi 画像用なので#1でよいが画像なしにも対応{内に移動
#1 if (!($in{'pfilename'} =~ /\.gif|\.jpg/i)) { &error("画像ファイルの拡張子を .gif か .jpgにしてください。");}
if ($in{'file'}) {
if (!($in{'pfilename'} =~ /\.gif|\.jpg/i)) { &error("画像ファイルの拡張子を .gif か .jpgにしてください。");}

画像あんQですから、画像ファイル無しをエラーとするには
修正1を使います。

修正3
#■&photo_file;元、下新
if ($in{'file'}){&photo_file;}
 else {&error("画像ファイルを添付してください。");}
#-----------------
とします。

else 文がないスクリプトでは画像あんQでも画像なしのあんQテーマが
許可される例です。ぴったりの画像がないときに、とりあえずテキスト
ベースのあんQです。この場合、画像なしアイコンを if ($pfilename){
print "img src='なしアイコン';}のように表示すれば、ユーザに混乱
はありません。

テーマ一覧表をテーマ中心にコンパクトにするには日付の年を変更します。
2007年から93年後に2100年に桁上がりになります。3年後でも長すぎますが
上2桁は実世界では意味がないと思います。そこで次の変更をします。
---------substr()関数第2引数は開始桁位置、第3引数は文字数
■$up = substr($_,0,8);
□$up = substr($_,2,6);#2007年の20を飛ばし10の桁から、それは0から数えて2
■$up =~ s/(\d{4})(\d{2})(\d{2})/$1年$2月$3日/;
□$up =~ s/(\d{2})(\d{2})(\d{2})/$1\/$2\/$3\//;#さらに漢字を/にして軽くする
---------------------------------

付録**********原作にひろたかさんがアイテムを追加した、これからする場合
のデバグ作業のポイント例です。

type = hiddenで値を継承する例
----------
559 print "<input type=hidden name=target value='$num'>\n";
print "<input type=hidden name=pass value='$in{'pass'}'>\n";
#-----------------
print "<input type=hidden name=mes value='$mes'>\n";
print "<input type=hidden name=pfilename value='$pfilename'>\n";
#-----------------
print "<tr><td><input size=30 name=content value='$content'></td>\n";
-----------------------

編集で表示しないコメント内容の値
587 print "<input type=hidden name=pass value='$in{'pass'}'>\n";
#■ commet adreg------------------------------------------
print "<input type=hidden name=mes value='$mes'>\n";
#■ commet adreg------------------------------------------

削除で画像ファイル名の値の継承
689#---------------------
print "<input type=hidden name=pfilename value=$pfilename><td class=plain>\n";
print "  <input type=submit value='このテーマの削除' class=red></td></form>\n";

登録でファイル未保存の値を$in{  }に代入
-------------------------------
738 $val = "$newnum\,$in{'content'}\,$newpoint\,$in{'color'}\,\n";
if ($in{'content'}) { unshift (@new,$val); }
#□---------------------------------
$in{'pfilename'}=$pfilename;
$in{'mes'} = $mes;
#---------------------------------
$in{'url'} =~ s/http\:\/\///ig;

編集での各種の値(value)の損失は、編集で表示されないもの
変更の対象でないものなどを
1 type=hidden でフォームから送りcgiで
2 デコードした上、
3 登録で保存処理をします。

もしこれ以外に編集時に何かの値が消えることがあれば
1.1 編集ルーチン側で name= A value= B として送ります。
2.1 デコードで A = B という連想配列に格納します。それを
3.1 登録で 保存の $val に代入します。
デバグではこの流れを不具合の発生した変数ごとに、

1 送信側(編集ルーチン)と
2 受信側(デコードルーチン)の解読(信頼度100%)
3.1 代入(登録ルーチン)、さらに
3.2 保存スクリプト(登録ルーチン)でチェックしてください。
□ ひろたか [2007年01月31日18時13分]
NXerさんこちらもお聞きします。
以前、お聞きしましたコメントをアンケートを修正すると引き継がないとの事でしたが、画像添付式に変更してからまたコメントが引き継がなくなりました。
回避方法ありますでしょうか?
□ NXer [2007年02月01日12時53分]

>コメントを、、、、引き継がない

あんQにコメントと画像を追加したために編集でも
1 項目名などの変更はget メソッド
2 登録者名、テーマ名などは post メソッドで
  enctype='multipart/form-data' でエンコード
3 テーマ削除はget メッソド
とテキストあんQで機能した引継ぎが上手くいかないことも発生しま
すので、それぞれの引継ぎのアルゴリズムを検証してください。でき
るかぎりコメント文を挿入して保守性の向上を図(はか)ってくださ
い。NXerです。

以下の動作確認のためのモニタ行挿入
----------------------------
541 print "<tr><td>■最終投票日:</td><td>$lastmod</td></tr>\n";
print "</table><p>\n";
print "<table border>";
#---------------コメント文と画像名モニタ
print "<br>■";print $mes;
print "<br>■";print $pfilename;
----------------------------
if (! @lines) {
--------------------------------

もう一度、次の例を見て、データのread 文とwrite 文の変数の並び
と漏れがないかすべてチェックしてください。
当方は、終わりが次の3つになっています。、、、$url,$pfilename,$mes,

sub edit {
open(READ,"$tmp$file") || &error("[ $tmp$file ]が開けませんでした。");
@lines = <READ>;
close(READ);
$subject = shift(@lines);
($subject,$lastmod,$pass,$limit,$ent_mode,$repost_mode,$name,$mail,$url,$pfilename,$mes,) = split(/\,/,$subject);

編集ルーチンには、write 文はありません。一度編集した値を送信して
デコードします。そして登録ルーチンで書き込みます。

1 項目変更の時は、登録者名などは readした値をそのまま引き継ぎます。
746  $val = "$subject\,$lastmod\,$pass\,$limit\,$ent_mode\,$repost_mode\,$name\,$mail\,$url\,$pfilename\,$mes\,\n";

2 しかし、テーマなどを1字でも編集した場合には次のスクリプトであらたに
書き込みます。

753 $val = "$subject\,$lastmod\,$pass\,$limit\,$in{'ent_mode'}\,$in{'repost_mode'}\,$in{'name'}\,$in{'mail'}\,$in{'url'}\,$in{'pfilename'}\,$in{'mes'}\,\n";

以下、編集で何らかの変更があった場合の処理例です。
-----------------------------------------------------
715 if ($in{'mode'} eq 'change') {
if ($in{'target'} ne $num) { push (@new,$_); }
else { $newnum = $num; }
}
}
#------------------------この2行挿入
if ($in{'pfilename'}){$pfilename=$in{'pfilename'};}
else {$in{'pfilename'}=$pfilename;}
$in{'mes'}=$mes;
#--------------------------------------
編集では、すでに$mes があることから、登録ルーチンのreadで読み込んだ
値を、他の登録者名などの変更で新たな書き込みがあったとき、上で
ふれたとおり次の行で

753 $val = "$subject\,$lastmod\,$pass\,$limit\,$in{'ent_mode'}\,$in{'repost_mode'}\,$in{'name'}\,$in{'mail'}\,$in{'url'}\,$in{'pfilename'}\,$in{'mes'}\,\n";

の値に$in{'mes'}\,として代入します。これで正しく保存されます。

他方、画像ファイル名は、編集されることがあり、少し複雑な
条件文処理をして見ました。

1 画像を変更した場合は
  デコード部で $in{'pfilename'} の値になる画像名が得られて if 文
  が成立して同じ処理で継承されます。

2 編集で画像は変更しないが、登録者名やテーマ名などを変更した場合は
  split()で得た$pfilenameを else 文で、代入して継承します。
このあたりは、モニタして変更前後のファイル名を見ながら修正してください。

この結果 1/29の付録のようには、必ずしも type=hiddenで $pfilename,$mes
を送る必要はないと思われます。コメント文にして試してください。

削除サブルーチンで、画像も削除するには;

if ($in{'mode'} eq 'delfile') {unlink "$tmp$file"; &enter; exit;}

でテーマファイは削除されます。しかし、画像ファイルは削除されていません。
次のようにファイル名を送信して、pfilenameを得て、画像削除をする
方が確実と思われます。
------------------------
687 print "<input type=hidden name=data value=\"$in{'data'}\">\n";
#---------------------挿入
print "<input type=hidden name=pfilename value=$pfilename><td class=plain>\n";
#------------------------
print "  <input type=submit value='このテーマの削除' class=red></td></form>\n";
------------------------------
削除サブルーチン変更:
sub delete {
#if ($in{'mode'} eq 'delfile') { unlink "$tmp$file"; &enter; exit; }
if ($in{'mode'} eq 'delfile') {
unlink "$tmp$file"; unlink "$dir$in{'pfilename'}";&enter; exit; }
--------------------------------

締め切り初期値を2週後にするには:
スクリプトの初めではなくて、new_openルーチンだけに
2週後の日付を設定します。
------------------------
sub new_open {
&biweek;#締切日2週間処理
&header;
-------------------
あんQのスクリプトの終わりに追加するサブルーチン:
-------------------
sub biweek {
#月内は14日の加算処理のみ 上はファイル名など現在の日付以下締切日用
$tmpday = ($mday + 14);#仮締切日
if ($tmpday>30){#30日を越す場合の処理
$month=($mon+2);
$mday=$tmpday-30;
}
else {
$mday=$tmpday;
}
}
----------------------------------------------

webサイトをURLに登録できることから、サイトそのものや
掲載ページ記事画像をアンケート対象とすることも可能です。
その場合も、アンケートを装った悪戯に対象する必要があります。

目的はサイト名を知らせ、利用者がクリックすることが主たる
スパムの目的です。テーマ名や項目で拒否することばは、日本語
です。しかしURLは、アルファベットだけが有効ですから
アルファベットで、拒否したいことばを追加する必要があります。
セキュリティ上具体例は避けますが、次の薬物名を変更します。
---------------------------------
$mesnew=$in{'url'};&antispam;
-----------------------------------
$i=index($mesnew,"drug");#文字列中の指定語の位置
if ($i>=0){ &error("ご利用どうも。");}
------------------------------------

コンピュータが浸透し、だれでもがブログを開設できる時代ですが
ウェブプログラミングは、まだまだ「未開地」と思われます。
ブログやrssサービスでは創造できないネットの世界をcgiで
「開拓」できるといいですね。スパムや荒らしの嵐が、アンケート
worldにも襲来することが予想されます。セキュリティを向上
させるよい例があれば、それらを参考にしてください。
一定時間書込が無かったので過去ログに移りました

suepon.com | CGI作成/CGI制作 | JavaScript | ドメイン検索 | バナー自動作成 | Google ダンスツール | 松浦亜弥 | H.P.memo | パソコン | ネイル

Copyright (C) 2002 - 2008 suepon , All rights reserved. Powered by CGI Script Market.