ラウンジ(兼FAQ掲示板)

あんQの不具合やもろもろの質問ですA
過去ログ NO.1169006324
□ ひろたか [2007年01月04日22時08分]
NXerさんへ
あけましておめでとうございます。
今年も多々ご迷惑おかけするかもしれませんが宜しくお願いします。
本題ですが、質問させていただきます。
@現在アンケートテーマが100文字を超える時はエラーメッセージが表示されて、戻るボタンを押すと戻るんですが戻った際にそれまで入力していた項目がリセットかかってしまい一から入力しなおさなければなりません。
エラー行為で戻ってもそれまで入力していたものはそのまま残るようにはできないでしょうか?
A先日、教えていただいた訂正後にポイントがリセットになってしまう件ですが、前回も書きましたがアンケート項目の訂正については、リセットがかかりませんがアンケートテーマ以下を訂正するとやはりリセットしてしまいます。
どうすればいいでしょうか?
よろしくお願いします
□ NXer [2007年01月05日16時44分]

あけましておめでとうございます。NXerです。

>エラー行為で戻ってもそれまで入力していたものはそのまま残る

アルゴリズムとスクリプト変更の流れで記述します。

☆1
次の行に#を付けてコメント化(comment out)して非実行文にします
850 #if (length($in{'subject'})>40){&error("アンケートテーマは20文字までです。"); }

理由は、入力値をご破算にするからです。なお入力例は40バイト、20文字制限
例です。

今テーマを
■テーマ: あいうえおかきくけこさしすせそたちつてとなにぬねの
と25文字で5文字オーバーとしました。

新しいテーマの設定後に表示される画面例です。
ここで、字数が超過した時だけ修正依頼文を表示します。

-------------------------------------
■新しいテーマの設定

■以下の内容で新しいアンケートテーマを設定しました。

▲ 設置者からのお願い :
テーマは20字までです。入力の20字分が表示されています。
参考にして修正してください。

項目名     内容 
設定者の名前: てすと1
(略)

☆2
-------------------------------そのスクリプト
899 print "■以下の内容で新しいアンケートテーマを設定しました。<br><br>\n";
#■-----------------
if (length($in{'subject'})>40){
$in{'subject'}=substr($in{'subject'},0,40);
print "▲ 設置者からのお願い :<br>\n";
print "テーマは20字までです。入力の20字分が表\示されています。<br>\n";
print "参考にして修正してください。<br><br>\n";
}--------------------------上挿入
print "<table border>\n";
-----------------

修正する ボタンをクリックすることが期待されています。(強制的な
修正ではないために、必ずしも期待どおり利用者が行動しないかもしれ
ません。その時は管理人が修正することになります。100字を超える人は
少ないと思われます。)

編集モードになります。この時、
上のテーマ欄には、下の超過した文が表示されます。
しかし、下のテーマ欄は、仮修正の文です。
そこで、[編集]ボタンを必ずクリックします。

すると、
上のテーマ欄にも、仮修正文、または正しく修正した文に変化します。
その後 [編集終了]ボタンを押せば、他の入力項目も生きたまま
登録が完了します。

字数制限を越える人は少ないと思われますが、編集ボタンを押す
ことが期待されていることを利用ガイドで説明する必要があるかも
わかりません。ご自身で検証してください。

関連した変更文例です。
☆3
---------------------
465 print "<tr><td>ホームページ:</td><td><input size=40 name=url value='http://$url'></td></tr>\n";
#---------------------------次の2行 ここは$subjectのsubstr()値です。
if (length($subject)>40){
$subject=substr($subject,0,40);}
print "<tr><td>テーマ:</td><td><input size=50 name=subject value=$subject></td></tr>\n";
#---------------------------------------
print "<tr><td>更に追加する項目:

☆4
568 if ($in{'subject'}) {
     $subject = "$in{'subject'}";
#--------------------------------------大切な変更です。
if (length($subject)>40){
$subject=substr($subject,0,40);}
}
--------------------------------------括弧の対応注意

入力文字制限のアルゴリズムは当方未見です。1文字入力毎に数字や
棒グラフなどで現在の文字数表示することが可能かもわかりません。
手っ取り早くテーマを複数行入力可能な textarea の20字5行
にして入力欄の上にスケールを----+----0----+----0などと付け
ればいいのでしょうが、テーマは簡潔さが生命ですから、さっぱり
1行入力がよいと思います。

>アンケートテーマ以下を訂正する
上で触れた編集サブルーチンを見直してください。そのどこかに
評価ポイントを type=hidden で受け継ぐ input 文が入っていま
せんか。なければ追加してください。

また次のサブルーチンでも引き継いでいるかトレースしてみてください。
sub regist {
575 elsif (! $in{'content'}) { &error("項目が記入されていません"); }
#-----------------------------
if ($in{'eval'}){$eval = "$in{'eval'}";}
-------------------------------
上の行は当方は非実行文ですがものは試しですから、編集以外も見てください。

このような不具合は運用して初めて発生することもあります
ので、ひろたかさんの実務あんQの運用環境は当方には不明で
すが、アクセスの頻度によっては1日に1度は、temp作業ディレ
クトリ毎、契約ウェブサーバ内にコピーを残します。

例 
|-/temp/
|-/backup/
| |-/temp/ 同名で上書き

さらに
自コンピュータに転送します。予備データとして、不具合の発生した
データファイルだけをアップロードできるようにします。

丁亥の年らしく、早々から、デバグでは泥んこになっています。
猪突泥沼(quagmire)のとほほです。本年もよろしくお願いいたします。

******************* perlの エラー処理 の汎用性と問題
エラー処理ルーチンでは一度入力した値がリセットされます。
上記改造案は、perlの組み込みルーチンに依存しないエラー処理
です。名前の記入もれも同様に対処できます。
警告の点滅アイコンを表示する、さらに[編集]ボタンも
2種類用意して、記入漏れや字数超過時には、そのボタンが
点滅するなどして、利用者の注意を喚起するなどまだまだ
ユーザフレンドリーなcgiに改善する余地はあるように
思います。
****************************************
□ ひろたか [2007年01月06日16時45分]
NXerさんへ
やはり修正するとポイントがリセットしてしまうことに頭を抱えています。
当方のソースを貼り付けておきます。
どうでしょうか?
587行
print "<tr><th>項目</th><th>グラフ色</th><th>変更/削除</th></tr>\n";

foreach (@lines) {
($num,$content,$point,$color,) = split(/\,/,$_);
print "<form action='$script' method=POST>\n";
print "<input type=hidden name=data value='$in{'data'}'>\n";
print "<input type=hidden name=target value='$num'>\n";
print "<input type=hidden name=pass value='$in{'pass'}'>\n";
print "<input type=hidden name=evalat value='$evalat'>\n";
print "<input type=hidden name=mes value='$mes'>\n";
print "<tr><td><input size=30 name=content value='$content'></td>\n";
#print "<td><input size=5 name=point value='$point'></td>\n";
print "<td><font color='$color'>■</font><input size=10 name=color value='$color'></td>\n";
print "<td><input type=radio name=mode value=del>削除 <input type=radio name=mode value=change checked>変更\n";
print " <input type=submit value='実行' class=btn> <input type=reset value='リセット' class=btn></td></tr>\n</form>\n";
}
print "</table>\n";
□ NXer [2007年01月07日16時56分]

>当方のソース

を見せていただきました。NXerです。

以下では
1 エラーを再現することができました。
2 次の挿入位置変更とevalの名前で評価点を編集後も正しく引き継ぐ  ことができました。

スクリプト中に作業内容を明記します。■と□の2ヶ所です。

その1)
587行------------------------------
print "<tr><th>項目</th><th>グラフ色</th><th>変更/削除</th></tr>\n";
foreach (@lines) {
($num,$content,$point,$color,) = split(/\,/,$_);
print "<form action='$script' method=POST>\n";
print "<input type=hidden name=data value='$in{'data'}'>\n";
print "<input type=hidden name=target value='$num'>\n";
print "<input type=hidden name=pass value='$in{'pass'}'>\n";
#■-------------------------この行は無効または削除します。
#print "<input type=hidden name=evalat value='$evalat'>\n";
------------------------------------------
print "<input type=hidden name=mes value='$mes'>\n";
print "<tr><td><input size=30 name=content value='$content'></td>\n";
#print "<td><input size=5 name=point value='$point'></td>\n";
print "<td><font color='$color'>■</font><input size=10 name=color value='$color'></td>\n";
print "<td><input type=radio name=mode value=del>削除 <input type=radio name=mode value=change checked>変更\n";
print " <input type=submit value='実行' class=btn> <input type=reset value='リセット' class=btn></td></tr>\n</form>\n";
}
print "</table>\n";
------------------------さらにつづく編集後も評価点継承の行を挿入
}
print "<form name=form action='$script' method=POST>\n";
print "<table border>\n";
print "<input type=hidden name=data value=\"$in{'data'}\">\n";
print "<input type=hidden name=mode value=adreg>\n";
print "<input type=hidden name=pass value='$in{'pass'}'>\n";
#□---挿入します。なおnameの値eval 文字列$evalです。read write文中も同一名、変数であるものと想定します。
print "<input type=hidden name=eval value='$eval'>\n";#評価継承
----------------------------
print "<tr><td>登録者名:</td><td><input name=name value='$name'></td></tr>\n";
------------------------------------

たぶん挿入の位置を変更したことによって、
1 項目の変更では問題ないのに、 2 編集の下の表内変更で評価点が
リセットされる エラーは理論上は解消されます。 
2で 評価点の継承スクリプトを入れたことからモニタ用の行がはいっていれば

---------------------------------
print "</table><p>\n";
print "<table border>";
#-------------------------モニタ行挿入
print "評価:$eval\n";
if (! @lines) {
print "<td>現在登録されている項目はありません</td>\n</table>\n";
-------------------------------
上挿入で、評価点が表示されると思います。

スクリプトの行番号が相当食い違ったこと、ともにほぼ同じ行の繰り返
しのために、より初めの次の行の後に挿入されてのがエラーの原因と
考えられます。
----------------------
print "<input type=hidden name=pass value='$in{'pass'}'>\n";
-----------------------数行後の同一文の後に挿入。

なお evalat の名前は次の行に限定されます。
----------------------分岐付近
&get_cookie;
# evalat branching---------------------
if ($in{'evalat'}) { $evalflag=1;$file=$in{'evalat'};&vote;}
if ($in{'evalmns'}) { $evalmnsflag=1;$file=$in{'evalmns'};&vote;}
-----------------sub html内です。編集では使っていません
print "<form action='$script' method=POST>\n";
print "<table><input type=hidden name=data value=1>\n";
print "<table><input type=hidden name=evalat value=\"$in{'data'}\">\n";
print "<td class=plain><input type=submit value='評 価 +' class=btn></td></form>\n";
--------------------------------

複雑x2なスクリプトのために単純な変更、エラーであっても局部の
スクリプトでは当方もよく分からないことがあります。さらに不具合
など発生した場合は、次の点にご注意ください。
変更後の再配布は禁止ですから、全体の掲載はできませんが、サブルーチン単位ぐらいで貼り付けるか貴サイトにtext文としてアップロードしてそのURLをお知らせください。

上記は、あんQの改造、変更の範囲内ということでラウンジを利用
させていただきました。これまでも愚案に基づく不具合やあんQの
利用活動、アンケート内容など、ラウンジの枠を多少超えたことが
あったと思われますが、改造あんQがデジタルエンサイクロペディ
アに進化しつつあると愚考したためです。すえぽんさん、ご理解い
ただきご容赦ください。
□ ひろたか [2007年01月10日21時27分]
NXerさんへ
無事ポイントを引き継ぐことが出来ました。ありがとうございます。
別件ですが、アンケート作成時に終了日が今日の日付で表示されているのですが、そこの表示を1ヶ月進めた日にちが表示されるようには出来ますでしょうか?
試験的にサイトを立ち上げているのですが、よく終了日の設定間違いで当日が締め切りになっていることが多い為、設定したいのですが宜しくお願いします。
□ NXer [2007年01月11日17時23分]

>表示を1ヶ月進めた日にち

以下をお試しください。NXerです。

97#---------------- 詳細設定ここまで ----------------#
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
#■------------------以下挿入
#$mon=11; #12月が1月になるテスト #をはずしてテスト可。
#$month = ($mon + 1);#旧
$month = ($mon + 2);#新
if ($month==13){$month=1;}#12月の処理
#------------------------

コメント文をつけましたが、localtime()の12ヶ月は、次の点に注意してください。
0,1,2,3,4,5,6,7,8,9,10,11
です。今1月は0のために、元は1を足します。さらに1ヶ月先がご要望の
締め切り月です。2を加算します。
問題は12月です。今年の12月にならないと上の式が正しいことは検証で
きません。そこで人為的に $mon=11; でテストしてください。暦の12月
にテーマの登録をするとして、あんQの締め切りが確かに1月となって
います。

以上です。
************************************世論調査について愚見
上記締め切りの初期設定(1ヶ月先)を利用案内する必要が
あると思います。締め切り設定にこまごまと書くのも利用者には
わずらわしく、現行のままとします。

あんQworldが、ウェブ界で認知されると短期間に多数の投票が
予想されます。通常アンケートの信頼性は、ほぼ社会的に同一
条件下の回答ほど高くなります。その意味では、利用者の勤務、
生活形態を考慮して休日をはさむ2週間程度を初期値とすること
がより信頼度を高めるかもしれません。

その場合は以下のとおりです。
-----------------------------------
#$mday=21;#締切日が月を跨ぐテスト用 
$tmpday = ($mday + 14);#仮締切日
if ($tmpday>30){#30日を越す場合の処理
 $month=($mon+2);
 $mday=$tmpday-30;
 }
 else {
    $mday=$tmpday;
    }#月内は14日の加算処理のみ
------------------------------------
貴サイトがリサーチを目的とするアンケートサービスを
提供する場合に、あんQの運用例などをもとに利用者と
ともに開発することになると思われますが、その時締め
切りの設定もテーマに応じて適切な資料があれば、ユー
ザフレンドリになるものと愚考します。

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

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