สยามเว็บโฮส โฮสติ้งดี ราคาถูก

วัตถุประสงค์การก่อตั้งฯ
ห้องพระ-ชำระจิตใจ
เรื่องสั้น-บทความ
บทกลอน-บทกวี
เกมส์ออนไลน์
ตำหนักเพลงไทยเดิม
เซียมซีเสี่ยงโชค
กระดานสนทนา
ข่าวฝากประชาสัมพันธ์
กระดานซื้อ-ขายสินค้า
ฟรีอีเมล์เนื้อที่ 5 MB
ติดต่อ นายทะเบียน
Add to Favorites

ทั่วโลก www
ชมรมเว็บเพจไทย

Power by Google!
สนับสนุนพื้นที่ Hosting

สยามเว็บโฮสดอทคอม

 
Updated: 16/10/2545


บทความเรื่อง เริ่มเขียนสคริปต์ด้วยภาษา Perl โดย webmaster@thaitop.com

4. ฟอร์มขั้นสูงและการใช้ Sub

คุณจะได้เรียนรู้

  1. การใช้และการจัดการข้อมูลที่ได้จากแบบฟอร์ม
  2. การใช้ sub หรืองานย่อยในโปรแกรม

เมื่อเรารับข้อมูลจากแบบฟอร์มมาแล้วปรากฎว่าคนกรอกส่งแบบฟอร์มว่างๆ มาให้เราคงหัวเสียน่าดู ในบทนี้ผมจะสอนวิธี ตรวจสอบและบังคับให้ผู้กรอกข้อมูลต้องกรอกแบบฟอร์ม ตามที่เราต้องการ ถึงจะทำอย่างอื่นต่อไปได้ โดยก็ยังใช้พื้นฐาน ความรู้เดิมคือการ ใช้คำสั่งพื้นฐาน if-else บวกกับเงื่อนไขต่างๆ เรามาดูกันเลยนะครับ

if ($input{'name'} eq "") { #ในนี้กำหนดว่าถ้าไม่กรอกชื่อในแบบฟอร์มให้แจ้งเตือนผู้กรอก
print "<h2>Error!</h2>\n";
print "กลับไปกรอกชื่อซะดีๆ";
}

ถ้ามีต้องการตรวจสอบหลายๆอย่างให้ทำแบบนี้ครับ

if ($input{'name'} eq "" || $input{'email'} eq "" || $input{'age'} eq "") { #ใช้เครื่องหมาย || แทนหรือ
print "<h2>Error!</h2>\n";
print "ยังไม่ได้กรอกช่องใหนรีบกลับไปกรอกเลยนะ";
}

จะเห็นว่าการตรวจสอบดังตัวอย่างด้านบนผู้กรอกจะต้องย้อนกลับไปกรอกแบบฟอร์มใหม่ เรามาทำใหม่โดยใช้คำสั่ง sub ซึ่ง เป็นคำสั่งของ perl ซึ่งจะทำให้ผู้ใช้ไม่ต้องย้อยกลับไปกรอกอีก การใช้ sub จะเหมือนกับการแทรก โปรแกรมหรือหน้าย่อย ใส่ไว้ในโปรแกรมหลัก มาดูกันเลยครับ ทั้งวิธีการตั้ง sub และการเรียกใช้

validate.pl

&FormInput (*input); #เปิดการเรียก sub ชื่อ FormInput เพื่ออ่านข้อมูลเข้าโปรแกรม
&NeedForm unless $input{'form'}; # ถ้าไม่มี form ให้โปรแกรมวิ่งไปแปลคำสั่งใน sub ชื่อ NeedForm
&NeedName unless $input{'name'}; # ถ้าไม่มี name ให้โปรแกรมวิ่งไปแปลคำสั่งใน sub ชื่อ NeedName
&NeedEmail unless $input{'email'}; # ถ้าไม่มี email ให้โปรแกรมวิ่งไปแปลคำสั่งใน sub ชื่อ NeedEmail


#===================== ถ้าเรียกใช้ครั้งแรกให้แสดงหน้าที่อยู่ใน sub นี้
sub NeedForm {
print "Content-type:text/html\n\n";
print <<Form;
<HTML>
<HEAD>
<TITLE>กรอกข้อมูลให้ด้วยครับ</TITLE>
</HEAD>
<body>
กรอกข้อมูลให้ด้วยครับ<br>
<form action=\"/cgi-bin/validate.pl\" method=\"POST\">
ชื่อ: <input type=\"text\" name=\"name\"><br>
อีเมล์: <input type=\"text\" name=\"email\"><br><br>
<input type=\"HIDDEN\" name=\"form\" value=\"form\">
<input type=\"SUBMIT\" value=\" ส่ง \">
</form>
</body></html>
Form
exit; #คำสั่งนี้จะทำให้โปรแกรมไม่สนใจสิ่งที่อยู่ด้านล่างนี้ ง่ายๆคือไม่แปลโปรแกรมต่อ
}

#===================== ถ้าไม่กรอกชื่อให้แสดงหน้าที่อยู่ใน sub นี้
sub NeedName {
print "Content-type:text/html\n\n";
print <<Name;
<HTML>
<HEAD>
<TITLE>ใส่ชื่อด้วยครับ</TITLE>
</HEAD>
<body>
ใส่ชื่อด้วยครับ<br>
<form action=\"/cgi-bin/validate.pl\" method=\"POST\">
ชื่อ: <input type=\"text\" name=\"name\"><br>
อีเมล์: <input type=\"text\" name=\"email\" value=\"$input{'email'}\"><br><br>
<input type=\"HIDDEN\" name=\"form\" value=\"form\">
<input type=\"SUBMIT\" value=\" ส่ง \">
</form>
</body></html>
Name
exit;
}

#===================== ถ้าไม่กรอกอีเมล์ให้แสดงหน้าที่อยู่ใน sub นี้
sub NeedEmail {
print "Content-type:text/html\n\n";
print <<Email;
<HTML>
<HEAD>
<TITLE>ใส่อีเมล์ด้วยครับ</TITLE>
</HEAD>
<body>
ใส่อีเมล์ด้วยครับ<br>
<form action=\"/cgi-bin/validate.pl\" method=\"POST\">
ชื่อ: <input type=\"text\" name=\"name\" value=\"$input{'name'}\"><br>
อีเมล์: <input type=\"text\" name=\"email\" value=\"$input{'email'}\"><br><br>
<input type=\"HIDDEN\" name=\"form\" value=\"form\">
<input type=\"SUBMIT\" value=\" ส่ง \">
</form>
</body></html>
Email
exit;
}

#===================== ถ้ากรอกครบตามที่ต้องการให้แสดงหน้าต่อไปนี้
print "Content-type:text/html\n\n";
print "<html><body>";
$whoami = $input{'name'};
print "ขอบคุณที่กรอกครบทุกช่องในฟอร์ม<br>";
print "ชื่อ - $whoami<br>";
print "อีเมล์ - $input{'email'}<br>";
print "<hr>";
print "</body></html>";
exit;

#===================== อ่านข้อมูลจากฟอร์มหรือ querystring จากลิ้งค์
sub FormInput {
local (*qs) = @_ if @_;
if ($ENV{'REQUEST_METHOD'} eq "GET")
{
$qs = $ENV{'QUERY_STRING'};
}
elsif ($ENV{'REQUEST_METHOD'} eq "POST")
{
read(STDIN,$qs,$ENV{'CONTENT_LENGTH'});
}

@qs = split(/&/,$qs);

foreach $i (0 .. $#qs)
{
$qs[$i] =~ s/\+/ /g;
$qs[$i] =~ s/%(..)/pack("c",hex($1))/ge;

($name,$value) = split(/=/,$qs[$i],2);

if($qs{$name} ne "")
{
$qs{$name} = "$qs{$name}:$value";
}
else
{
$qs{$name} = $value;
}
}
}

หมายเหตุ ใน code ของไฟล์ นี้ผมจะใส่ sub ที่แสดงวันและเวลาลงไปด้วย ที่ไม่ใส่ให้ดูในนี้เนื่องจากมันจะยาวเกินไป ลองดูเองนะครับ

ถ้าคุณดูแล้วก็ต้องเข้าใจแน่ๆผมเชื่ออย่างนั้นถ้าจะให้ดีก็ต้องลองแก้ลองใส่อย่างอื่นเพิ่มเติมลงไป การใช้ sub ไม่ได้ยากเย็นอะไร ถ้าคุณถูกใจ sub อันใหนคุณก็เพียงนำไปวางให้ถูกที่ถูกทางหน่อย เดี๋ยวก็ใช้ได้เอง อย่างเช่น sub ที่แสดงวันและเวลา ถ้าคุณชอบ ก็สามารถ copy ไปแปะในโปรแกรมของคุณได้เลย ส่วนการเรียกก็ดูได้จากตัวอย่างที่ผมทำไว้ให้ดู


ถ้าในแบบฟอร์มของคุณใช้ checkbox ด้วยคุณสามารถถอดค่าที่ผู้ใช้เลือกออกมาได้ด้วย code ตัวอย่างนี้

<input type="checkbox" name="red" value=1> Red<br>
<input type="checkbox" name="green" value=1> Green<br>
<input type="checkbox" name="blue" value=1> Blue<br>
<input type="checkbox" name="gold" value=1> Gold<br>


@colors = ("red","green","blue","gold");
foreach $x (@colors) {
if ($FORM{$x} == 1) {
print "คุณเลือกสี $x.\n";
}
}


เช่นเดียวกันถ้าใช้ radio คุณสามารถลองถอดออกมาได้ด้วย code นี้

<input type="radio" name="color" value="red"> Red<br>
<input type="radio" name="color" value="green"> Green<br>
<input type="radio" name="color" value="blue"> Blue<br>
<input type="radio" name="color" value="gold"> Gold<br>

print "คุณเลือกสี: $input{'color'}<br>\n";

หรือจะประยุกต์เล่นให้เป็นแบบนี้ก็ได้ จะทำให้สามารถเปลี่ยนสีพื้นหลังของหน้าเว็บเพจได้

%colors = ("red","ff0000", "green","00ff00", "blue","0000ff", "gold","ffcc00");
print "<html><head><title>เปลี่ยนสีได้ด้วย</title></head>\n";
print "<body bgcolor=$colors{$input{'color'}}>\n";
print "<h2>คุณเลือกสี: $FORM{'color'}</h2><br>\n";
print "</body></html>";

ผมขอบอกไว้ก่อนนะครับว่าในตัวอย่างที่ผมเขียนขึ้นนี้ไม่ใช่ตัวอย่างที่ดีที่สุด หรือเป็นวิธีที่ดีที่สุด คุณยังมีวิธีทางเลือกอื่นๆ ในการ ทำงานแบบเดียวกันนี้เช่นการใช้ Javascript ในการตรวจฟอร์มก่อนส่งหรือเขียนโปรแกรมใหม่ให้ใช้ code น้อยลงโดยการใช้ คำสั่ง foreach เพื่อที่จะได้ไม่ต้องตั้ง sub มากมายแบบนี้ ที่ผมทำไว้ให้ดูเพียงให้คุณดูว่า จะตั้ง sub และเรียก sub อย่างไรก็ เท่านั้นเอง

ต่อไปเป็น บทที่ 5 เรื่องการนำข้อมูลเขียนลงไฟล์และการอ่านไฟล์


ชมรมเว็บเพจไทย ตั้งใจมุ่งมั่น สร้างสรรค์เพื่อมวลสมาชิก



เริ่มนับ 20 พฤศจิกายน 2547 เวลา 24.00 น.
เว็บไซต์แห่งนี้ออกแบบสำหรับจอภาพที่มีความละเอียด 800x600 Pixel และ เปิดชมด้วย IE4.0 ขึ้นไป

ชมรมเว็บเพจไทย เป็นเว็บไซต์ที่จัดทำขึ้นเพื่อเผยแพร่ข่าวสารและสาระความรู้เกี่ยวกับการสร้างเว็บไซต์ ให้แด่สมาชิกและผู้สนใจทั่วไป
โดยไม่หวังผลประโยชน์ทางธุระกิจ [Non Profit Organization] ก่อตั้งเมื่อวันที่ 16 ตุลาคม พ.ศ. 2540
ข้อมูลข่าวสาร บทความ และภาพประกอบ ที่ไม่อ้างถึงเจ้าของลิขสิทธิ์ สามารถนำไปใช้ได้โดยไม่ต้องขออนุญาต [Non Copyright]