台灣最大程式設計社群網站
線上人數
2434
 
會員總數:246226
討論主題:189787
歡迎您免費加入會員
討論區列表 >> 其他語言 >> 複選checkbox我該怎麼寫呢?
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
複選checkbox我該怎麼寫呢?
價值 : 500 QP  點閱數:5088 回應數:35
樓主

dfgrhth
門外漢
0 4
236 13
發送站內信

做.cgi的,我想弄出一個checkbox可以複選例如:
蘋果.香蕉.魚翅
如果我選了蘋果和香蕉之後可以用
prin"";  顯示出你所選的項目名稱
我現在就差checkbox的複選搞不出來,我該怎麼弄這個checkbox複選的語法呢?

現在我選兩個例如香蕉和蘋果,在prin"";中只有出現其中一個那怎麼變出現兩個呢?
感謝

本篇文章發表於2012-01-25 18:25
16樓
作者回應

dfgrhth
檢舉此回應
我把複選的加入到我要弄得程式內
它一開始是出現1.[您都沒有選取] 後來我又改改看 之後按 確定紐2.沒有跳到sub bb{}那頁網站 (按了之後就像重新整理)。

如果我用http://127.0.0.1/01.cgi它會出現500的錯誤伺服器

怎麼辦...
本篇文章回覆於2012-01-29 01:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
17樓
回應

香帥
檢舉此回應
您有下載我的http://ap.a168a.com/test/00.zip下載跑看看嗎?
不必再改您的ㄚ,不然您下載01.zip 有含時鐘的,那就不會蓋掉您的00.cgi

本篇文章回覆於2012-01-29 02:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
18樓
回應

香帥
檢舉此回應
您的情形好像是流覽器還記億舊的,我也試過,當您軟體改過後,您的名稱還是00.cgi,就有可能產生您說的
它一開始是出現1.[您都沒有選取] 後來我又改改看 之後按 確定紐2.沒有跳到sub bb{}那頁網站
尤其是用代理主機,您試著將檔名改一下為0a.cgi,內容action="0a.cgi"這樣再試試.
或者直街下載我的01.zip解壓縮,去試試
本篇文章回覆於2012-01-29 02:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
19樓
回應

香帥
檢舉此回應
還有您說
它一開始是出現1.[您都沒有選取] 後來我又改改看 之後按 確定紐2.沒有跳到sub bb
這是不對的
因為
出現 您都沒有選取 這段話是在 sub bb 之內執行的喔
因此它確實是記億您舊有的 隱藏欄位 bb 才會判斷去執行 sub bb
也因此都還沒選取,才會執行 sub bb 內的那句 您都沒有選取
本篇文章回覆於2012-01-29 02:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
20樓
作者回應

dfgrhth
檢舉此回應
可能是因為我的程式碼中有跑&htm;所以選項會中斷吧,
有辦法讓我所選擇的名稱在
print <<"EOM";
<FONT SIZE=3>
<B>您所選取的有$item[$b]</B><BR>
<hr size=0></font>
EOM
中顯示嗎?

以下是我將複選的程式碼附加在我要使用的程式碼上面,無論選什麼或不選會發現案確定後它只有出現
〔您所選取的有蘋果〕。
我是用AppServ讓電腦跑CGI的,現在只要將我的12356.zip解壓縮後放在www資料夾
即可用http://127.0.0.1/00.cgi來瀏覽網站,而現在的問題就是我上面所說的問題


http://cgi.educities.edu.tw/tre841l3/12356.zip 我的程式碼
本篇文章回覆於2012-01-29 12:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
21樓
回應

香帥
檢舉此回應
我跟您分析一下您的程式是錯在那:
$j=0;
foreach (@checkboxvalue) {
$j++;
if ($j<2) { print "您所選取的有:"; }
($a,$b)=split(/=/);
print $item[$b]."*";
}

if ($j < 1 ) {
print "您都沒有選取";
}

&htm;

print <<"EOM";
<FONT SIZE=3>
<B>您所選取的有$item[$b]</B><BR>
<hr size=0></font>
EOM

exit;

}

您所選取的有重復兩次,第一次是我寫的程式如下,有迴圈,當然沒有問題
$j=0;
foreach (@checkboxvalue) {
$j++;
if ($j<2) { print "您所選取的有:"; }
($a,$b)=split(/=/);
print $item[$b]."*";
}

會出現多選當然沒問題
可是您可能沒注意多加一個
&htm;
print <<"EOM";
<FONT SIZE=3>
<B>您所選取的有$item[$b]</B><BR>
<hr size=0></font>
EOM

是不在迴圈裡,當然會蓋掉之前的畫面只顯示一個選項
您將&htm以下程式加到回圈內就可以了,但回圈內只能有一個
print $item[$b]."*";
或用您的
print <<"EOM";
<FONT SIZE=3>
<B>您所選取的有$item[$b]</B><BR>
<hr size=0></font>
EOM
這樣才不會又重復
本篇文章回覆於2012-01-29 17:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
22樓
回應

香帥
檢舉此回應
補充還有您不選的時後
if ($j < 1 ) {
print "您都沒有選取";
}

&htm;

print <<"EOM";
<FONT SIZE=3>
<B>您所選取的有$item[$b]</B><BR>
<hr size=0></font>
EOM
後面的這錯誤增加還是會蓋掉前面的
"您都沒有選取";
趕快將後面這段改到回圈內吧
本篇文章回覆於2012-01-29 17:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
23樓
回應

香帥
檢舉此回應
還有我的版本是perl 5.14.xxx
大都相符
只在EOM的時後,不能出現兩個,若出現兩個就要用 { }
那是我後來跟您加的
不過您還沒回答有沒先照我的00.cgi去測
因我後來看您原先版本與後來增加的1.pl是用sub vv自己再抓變數
是放到@pair,不是 @checkboxvalue 喔
因此請一併改過去.
也請告訴我一下00.cgi全部不改放到您那可以執行嗎(因為我的都ok,不知您的版本可以嗎)
本篇文章回覆於2012-01-29 18:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
24樓
作者回應

dfgrhth
檢舉此回應
我是用AppServ v2.5.9版本
如果將你的直接解壓縮放到我的www
會出現500的錯誤畫面。

那我現在的要怎麼改
http://cgi.educities.edu.tw/tre841l3/12356.zip ←
這之
本篇文章回覆於2012-01-29 21:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
25樓
回應

香帥
檢舉此回應
因為您的 &htm 那好像也不完全對稱,
還有很多bug,不一定是server問題
等我安裝appserv 及 perl 到我另一台電腦再幫您試
我的檔案及您的檔案
本篇文章回覆於2012-01-29 22:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
26樓
回應

香帥
檢舉此回應
我已經幫您試了,我已下載appserv來試
請在我的00.cgi第一行
#!/usr/bin/perl
加上以下這一行
print "Content-type:text/html\n\n";
這樣就不會產生500 server錯誤
因我的server不是appserv所以若多那一行,流覽器就會多Content-type:text/html這些字,因此我拿掉
但另一台電腦我灌了appserv後發現appserv一定要加上,不然會出問題誠如您所說500的Internal Server Error 錯誤訊息
因此請加入那一行後,執行我的00.cgi一下,再告訴我結果好嗎,謝謝
本篇文章回覆於2012-01-29 23:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
27樓
回應

香帥
檢舉此回應
您的12356.zip也幫您改好了,用您那種抓參數方法,不能說不對,但最重要是您後來我的參數您沒跟著改
且要多一個判斷,若不加此判段,當都沒有選項時或有選項時,都會多一個蘋果,因為mode=bb那bb被當成陣列所引來使用會當成是0,因此不論有沒有選都會多一個蘋果喔,原來我的是@checkboxvalue已處裡掉mode這字串,現為配合您,用您改用您的@pairs部份程式碼如下
foreach (@pairs) {
($a,$b)=split(/=/);
if ($a=~/mode/){
}
else {
...
...
...
}
整個專案您的12356.zip已改正確並在appserv測試ok,專案下載在http://ap.a168a.com/test/00ok.zip
本篇文章回覆於2012-01-30 01:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
28樓
回應

香帥
檢舉此回應
還有我發現結束的EOM只能靠最左邊,不能為了漂亮程式碼,移到 IF 或其他有縮排地方,那會產生錯誤
為了好抓您的bug,我有移動縮排,讓{}比較容易對稱容易讀,結果因此錯誤抓得更久,在此特別提醒您.
本篇文章回覆於2012-01-30 01:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
29樓
作者回應

dfgrhth
檢舉此回應
已經可以順利跑了^^感謝

對了 我能問一下
($item[$j],$itemsay[$j]) = split(/<>/);
這段代表什麼意思嗎,它有[$j]如果沒有的話會怎麼樣呢?$item[$j]一定要用$開頭嗎如果用@呢?

還有這段
foreach (@pairs) {
($a,$b)=split(/=/);
if ($a=~/mode/){
}
@pairs是開啟哪邊的資料來迴圈呢,為什麼@pairs要迴圈呢?它的$a,$b在那位子那$a代表什麼值?
$a=~/mode/ 為什麼要判斷這段呢?
還有
<B>$item[$b]</B> 為什麼要用[$b]而不用$[a]
和為什麼$item[$b]的$item要用($item[$j],$itemsay[$j]) = split(/<>/);
的$item而不是用$itemsay,變成<B>$itemsay[$b]</B>  呢

感謝你^^


本篇文章回覆於2012-01-30 02:30
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
30樓
回應

香帥
檢舉此回應
($item[$j],$itemsay[$j]) = split(/<>/);
這段代表什麼意思嗎,它有[$j]如果沒有的話會怎麼樣呢?$item[$j]一定要用$開頭嗎如果用@呢?
ans:這是您的123.cgi內檔案
蘋果<>補充C維生素....
是對稱的因此$item[$j]代表蘋果...,$itemsay[$j]) 代表是它的說明補充C維生素...
您也可以用@陣列,那是一開始就要用的,只不過是偶數索引是蘋果,奇數索引是說明
因為您是成對,用這種方式是配合您寫的檔案.

還有這段
foreach (@pairs) {
($a,$b)=split(/=/);
if ($a=~/mode/){
}
@pairs是開啟哪邊的資料來迴圈呢,為什麼@pairs要迴圈呢?它的$a,$b在那位子那$a代表什麼值?
$a=~/mode/ 為什麼要判斷這段呢?
ans:這是您的sub vv內讀取client端送來的
是您自己寫的如下:
sub vv {

if ($ENV{'REQUEST_METHOD'} eq "POST") {
if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("負重"); }
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else { $buffer = $ENV{'QUERY_STRING'}; }
@pairs = split(/&/, $buffer);
foreach (@pairs) {
($name,$value) = split(/=/, $_);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;


$value =~ s/</&lt;/g;
$value =~ s/>/&gt;/g;
$value =~ s/\"/&quot;/g;


$value =~ s/\r//g;
$value =~ s/\n//g;

$in{$name} = $value;
}

$mode = $in{'mode'};

}

我原先給您的可沒這麼寫,可能是您抄來的15行,我只是配合您,我只有四行就ok如下:
$length = $ENV{'CONTENT_LENGTH'};
read(STDIN,$checkbox,$length);
($checkdata,$mode) =split(/mode=/,$checkbox);
@checkboxvalue=split(/&/,$checkdata);
您明知道您程式那是post,為何還要寫判斷是get或post,我都弄不懂
且傳來的值一定是類似下列這樣(您名子取名是item,值是0-4,mode是故定bb)
item=0&item=1&mode=bb
都弄不懂您在那邊替換$value =~ s/</&lt;/g;倒斜線換程&lt指令不知要做甚麼(因為跟本不會傳回那種值,我也懶得跟您改回來,因不影響程式執行
配合您的@pairs
因為$buffer值是item=0&item=1&mode=bb
程式@pairs = split(/&/, $buffer); 因此pairs陣列會變成{"item=0","item=1","mode=bb"}
因此
foreach (@pairs) {
($a,$b)=split(/=/);
if ($a=~/mode/){
}
就是說會有三次,第1次取的是a$="item",$b="0"
第2次取的是a$="item",$b="1"
第3次取的是a$="mode",$b="bb"
因此還要再判段a$是否mode若是的話,那是隱藏欄位要跳過(因不是選項)

還有
<B>$item[$b]</B> 為什麼要用[$b]而不用$[a]
和為什麼$item[$b]的$item要用($item[$j],$itemsay[$j]) = split(/<>/);
的$item而不是用$itemsay,變成<B>$itemsay[$b]</B>  呢
ans:如上面a$="item"當然不能當索引,b$="0"到"3"當然要用$item[$b}
要用$item不用$itemsay,是因為讀取的有選項(例蘋果)及說明,當然要用選項呀.

本篇文章回覆於2012-01-30 12:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.