การรับค่าผ่าน url

ปรับปรุง : 2548-02-12 ()

บทเรียน ONLINE : การเขียนภาษา PERL
[ การรับค่าผ่าน url ]

  1. ข้อควรทราบ
  2. สั่งประมวลผล perl พร้อมส่งค่า
  3. รับค่าเดียว
  4. รับค่าหลายค่า
  5. รับค่าพร้อมชื่อตัวแปร
  6. รับค่าพร้อมชื่อตัวแปร แยกตัวแปรหลายแบบ
  7. แบบฝึกหัด
ข้อควรทราบ
  1. บทนี้ท่านจะรู้สึกไม่ยากเท่าใด เพราะตั้งใจให้รู้จักการเขียน perl ให้ดีขึ้นจากบทก่อน
  2. ในบทก่อนเมื่อเขียน perl เสร็จแล้ว ก็สั่งประมวลผลทาง location หรือ address ของ browser ก็จะเห็นผลทันที ในบทนี้ก็ให้ใช้วิธีการเดิม
  3. การส่งค่าให้ perl ในแบบ url จะใช้เครื่องหมาย ? ตามหลังชื่อโปรแกรม perl และตามด้วยค่าที่ต้องการส่งทันที ซึ่งจะอธิบายไว้พอเข้าใจถึงวิธีการเขียน และวิธีสั่งให้ perl ทำงานในแบบนี้

สั่งประมวลผล perl พร้อมส่งค่า
การสั่งประมวลผล perl ใน homepage นั้นง่ายมาก เพียงแต่พิมพ์ชื่อแฟ้มในช่อง location ก็เป็นอันเรียบร้อย
แต่เครื่องที่เก็บชื่อแฟ้มจะต้องมี perl compiler ด้วยนะครับ ไม่งั้นจะ แสดง source code โดยไม่ประมวลผล
เช่น
http://127.0.0.1/cgi/lct.pl
http://www.thaiall.com/perl/lct.pl
http://www.thaiall.com/perl/plbas01.pl
http://www.thaiall.com/perl/plurl01.pl?test
http://www.thaiall.com/perl/plurl02.pl?test&jonny
http://www.thaiall.com/perl/plurl03.pl?t1=test&t2=jonny
ไม่ส่งค่า
ไม่ส่งค่า
ไม่ส่งค่า
ส่งค่า test
ส่งค่า test&jonny
ส่งค่า t1=test&t2=jonny

ตัวอย่างแสดงจุด ที่ให้พิมพ์ชื่อโปรแกรม perl ใน browser
Netscape

Internet Explorer

รับค่าเดียว
สั่ง perl ประมวลผล เช่น
http://www.thaiall.com/perl/plurl01.pl?test
http://www.thaiall.com/perl/plurl01.pl?enthusiasm
ตัวอย่างคำสั่ง อธิบายคำสั่ง
#!/usr/local/bin/perl
$buffer = $ENV{"QUERY_STRING"};
$buffer =~ tr/+/ /;
$buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$buffer =~ s/~!/~!/g;
print "Content-type: text/html\n\n";
print $buffer;
ตัวอย่างนี้แสดงค่าอย่างง่าย ๆ
แต่จะเห็นหลายบรรทัดยุ่งเหยิง
นั่นคือการแปลงค่าที่รับเข้ามาให้ถูกต้อง
บรรทัดที่ 2 คือรับค่าที่อยู่หลังเครื่องหมาย ?
บรรทัดที่ 3 - 5 ทำหน้าที่แปลงค่าให้ถูกต้อง ผลของโปรแกรมนี้จะพิมพ์ test คำเดียว
Click ทดสอบโปรแกรม
รับหลายค่า
สั่ง perl ประมวลผล เช่น
http://www.thaiall.com/perl/plurl02.pl?test&jonny
http://www.thaiall.com/perl/plurl02.pl?dog&cat
ตัวอย่างคำสั่ง อธิบายคำสั่ง
#!/usr/local/bin/perl
$buffer = $ENV{"QUERY_STRING"};
$buffer =~ tr/+/ /;
$buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$buffer =~ s/~!/~!/g;
print "Content-type: text/html\n\n";
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   print $pair,"<br>";
}
ตัวอย่างนี้แสดงการค่าที่รับเข้ามา แต่แบ่งด้วยเครื่องหมาย &
ผลที่ได้จากตัวอย่างคือ
test
jonny
คำสั่ง split เป็นการแยกหลายค่าออกจากกัน
หากตัวรับขึ้นต้นด้วย @ จะเป็นการใช้ array มารับ
หากตัวรับขึ้นต้นด้วย $ จะเป็นการนับจำนวน ว่ามีกี่ตัว
Click ทดสอบโปรแกรม
รับค่าพร้อมชื่อตัวแปร
สั่ง perl ประมวลผล เช่น
http://www.thaiall.com/perl/plurl03.pl?t1=test&t2=jonny
http://www.thaiall.com/perl/plurl03.pl?name=tom&surname=nataree
ตัวอย่างคำสั่ง อธิบายคำสั่ง
#!/usr/local/bin/perl
$buffer = $ENV{"QUERY_STRING"};
$buffer =~ tr/+/ /;
$buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$buffer =~ s/~!/~!/g;
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
  ($name, $value) = split(/=/, $pair);
  $FORM{$name} = $value;
}
print "Content-type: text/html\n\n";
print 't1 =' , $FORM{'t1'},'<br>';
print 't2 =' , $FORM{'t2'};
จากตัวอย่างนี้ทำให้เข้าใจว่า การส่งค่าผ่าน url
อาศัยชื่อของตัวแปรเป็นหลัก ไม่ได้ใช้ตำแหน่งของตัวแปร
จึงมีความยืดหยุ่นเป็นอย่างมาก
ตัวอย่างนี้แสดงผล 2 บรรทัด คือ
t1 = test
t2 = jonny
คำสั่ง foreach ในตัวอย่างนี้ฉลาดมาก
เพราะจะนำค่าจาก array @pairs ทีละตัวส่งให้ $pair
แล้วจึงนำ $pair ไปแยกว่าตัวใดเป็นค่า ตัวใดเป็นชื่อ
แล้วส่งให้ $FORM{} จดจำ เพื่อเรียกใช้อย่างสะดวกภายหลัง
Click ทดสอบโปรแกรม
รับค่าพร้อมชื่อตัวแปร แยกตัวแปรหลายแบบ
สั่ง perl ประมวลผล เช่น
http://www.thaiall.com/perl/plurl04.pl?t1=สมปอง&t2=นานาลีลา
http://www.thaiall.com/perl/plurl04.pl?name=แหว&surname=นิก้า
ตัวอย่างคำสั่ง อธิบายคำสั่ง
#!/usr/local/bin/perl
$buffer = $ENV{"QUERY_STRING"};
print "Content-type: text/html\n\n";
print $buffer;
print "<hr>";
@keep04 = split '&',$buffer;
print $keep04[0],"<br>";
print $keep04[1],"<br>";
print "<hr>";
@keephaha = split '=',$keep04[0];
print $keephaha[1],"<br>";
@keephaha = split '=',$keep04[1];
print $keephaha[1],"<br>";
print "<hr>";
($name, $value) = split(/=/, $keep04[0]);
print $value,"<br>";
($name, $value) = split(/=/, $keep04[1]);
print $value,"<br>";
ถ้าสังเกตุให้ดี ตัวอย่างนี้ไม่มีคำสั่งแปลงค่า
ซึ่งประกอบด้วย 3 บรรทัดแปลก ๆ เพราะไม่จำเป็น
เนื่องจากการส่งค่า ส่งกันตรง ๆ ไม่จำเป็นต้องแปลงกลับ
นั่นหมายความว่า ตัวอย่างใน บทนี้ไม่จำเป็นต้องแปลงค่าใด
แต่ที่เขียนไป เพื่อให้เรียนรู้ก่อนจำเป็นต้องใช้ในบทอื่น
ตัวอย่างนี้แสดงการใช้ split แยก buffer 2 จังหวะ สังเกตุดูนะครับ


ตัวอย่างนี้แสดงผล 7 บรรทัด กับเส้น hr 3 เส้น คือ
t1=สมปอง&t2=นานาลีลา

t1=สมปอง
t2=นานาลีลา

สมปอง
นานาลีลา

สมปอง
นานาลีลา
Click ทดสอบโปรแกรม
แบบฝึกหัด
    ให้ทำตามโจทย์ต่อไปนี้
  1. ส่งค่า 1 ค่าแล้วนำมาพิมพ์
  2. ส่งอย่างน้อย 3 ค่าแล้วนำมาพิมพ์
  3. ส่งค่าอย่างน้อย 3 ค่าพร้อมชื่อตัวแปร แล้วนำมาพิมพ์
ผู้สนับสนุน + ผู้สนับสนุน
+ รับผู้สนับสนุน

แนะนำเว็บใหม่ : ผลการจัดอันดับ
รักลำปาง : thcity.com : korattown.com : topsiam.com : มหาวิทยาลัยโยนก
ศูนย์สอบ : รวมบทความ : ไอทีในชีวิตประจำวัน : ดาวน์โหลด : yourname@thaiall.com
ติดต่อ ทีมงาน ชาวลำปาง มีฝันเพื่อการศึกษา Tel.08-1992-7223