วันพฤหัสบดีที่ 28 มีนาคม พ.ศ. 2556

การใช้ javascript สร้างฟอร์มอัตโนมัติ แล้วส่งค่าไปยัง PHP

ถ้าต้องการคลิกปุ่ม แล้วให้เกิดฟอร์มรับค่าโดยอัตโนมัติ (on the fly) เพื่อส่งค่าไปยัง PHP จะทำอย่างไร

หลักการ
ใช้สร้างปุ่มที่มีลักษณะเป็น Button และเมื่อคลิกปุ่ม ให้ไปเรียกใช้งานฟังก์ชันที่ใช้ javascript สร้างแบบฟอร์ม และส่งข้อมูลไปยังไฟล์ PHP

วิธีการ

สร้างไฟล์ html ดังนี้

(ไฟล์ jsFormDemo.html)

<HTML>
 <HEAD>
 <meta http-equiv="Content-Type" content="text/html; charset=tis-620">
<script language="javascript" type="text/javascript">
function displayForm(){
 var d=document;
 var test_div = document.getElementById('pwdForm');
 document.getElementById('pwdForm').innerHTML="รหัสเข้าใช้งาน";
 var f = test_div.appendChild(d.createElement('form'));
 var i=d.createElement('input');
 var i2=i.cloneNode(false);
 var br=d.createElement('br');
 f.action='adminPage.php';
 f.method='POST';
 f.name='f';
 i.type='text';
 i.name='myText';
 i.value='';
 i2.type='submit';
 i2.value=' ส่ง ';
 f.appendChild(i);
 f.appendChild(br);
 f.appendChild(i2);
 document.getElementsByName("adminBtn")[0].disabled = true;
}
</script>
 </HEAD>
 <BODY>
 กดปุ่มเพื่อเข้าใช้งาน<br>
  <input type=button name="adminBtn" value="Admin" onclick="displayForm()">
 <div id="pwdForm"></div>
 </BODY>
</HTML>

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

ไฟล์ adminPage.php

<?php
$thisPwd = $_POST["myText"];
echo "รหัสที่ท่านพิมพ์คือ : $thisPwd <br>";
?>


การแสดงผล
  1. เมื่อเรียกไฟล์ jsFormDemo.html จะแสดงผล ดังนี้
    
  2. เมื่อกดปุ่ม จะเกิดฟอร์มให้เติมรหัส
  3. กรอกรหัส
  4. เมื่อกดปุ่ม "ส่ง"   ไฟล์ adminPage.php จะนำค่ามาแสดง ดังนี้


ที่มา:
http://bytes.com/topic/javascript/answers/147290-can-i-create-form-fly

การส่งค่า Array ผ่านแบบฟอร์มของ PHP

โจทย์:

ต้องการส่งรายชื่อบุคคลซึ่งเก็บอยู่ในตัวแปร Array ของ PHP โดยส่งผ่านฟอร์ม จะทำอย่างไร
ตัวแปรที่มีรายชื่อบุคคลคือ  $nameArray = array("ประสงค์","ประสิทธิ์","ประสาท");

หลักการ
นำค่าที่อยู่ใน Array ไปใส่ในลง form element โดยให้อยู่ในรูปของ PHP Array แล้วส่งออกไปยังไฟล์ PHP ที่รับค่า

วิธีการ

ไฟล์แบบฟอร์ม
(ไฟล์ myform.php)

<html><body>
<form method="POST" action="showarray.php">
<?php
$nameArray = array("ประสงค์","ประสิทธิ์","ประสาท");
foreach($nameArray as $names){ //นำค่าไปใส่ form element
  echo '<input type="hidden" name="members[]" value="'. $names. '">';
}
?>
คลิกเพื่อส่งข้อมูล<br>
<input type="submit" value=" ส่ง ">
</body></html>

แสดงผล


 
ในกรณีที่เราสร้างแบบฟอร์มสำหรับกรอกข้อมูล ก็สามารถรับค่าเข้ามาเป็น Array และส่งออกได้ทันที เช่น
(ไฟล์ myform.html)

<HTML><BODY>
<form method="POST" action="showarray.php">
สมาชิกคนที่ 1:<input type="text" name="members[]"/><br/>
สมาชิกคนที่ 2:<input type="text" name="members[]"/><br/>
สมาชิกคนที่ 3:<input type="text" name="members[]"/><br/><br>
คลิกปุ่มเพื่อส่งรายชื่อ<br><br>
<input type="submit" name="sendNames" value=" ส่ง ">
</form>
</BODY></HTML>

แสดงผล




ไฟล์ที่รับค่า
(ไฟล์ showarray.php)

<?php
//$memberNames รับค่าเข้ามาและมีสถานะเป็น Array
$memberNames=$_POST['members'];
//นับจำนวนสมาชิกที่ส่งมา
$numOfPeople = sizeof($memberNames);
echo $numOfPeople . "<br>"; //3
//แสดงชื่อสมาชิก คนที่ 2
$secondPerson=$memberNames[1];
echo $memberNames[1]; //ประสิทธิ์ (ส่งมาจาก myform.php)
?>

แสดงผล




การประยุกต์ใช้งาน

ตัวอย่างการส่งเฉลยคำตอบจากข้อสอบ และนำไปตรวจด้วย PHP

ไฟล์ข้อสอบ (myTest.php)

<?php
$subjectName = "ข้อสอบออนไลน์";
$correctAns=array("ข","ก");  //เฉลยข้อที่ถูก -- ไม่จำกัดจำนวนข้อ
?>
<HTML><BODY>
<form method="POST" action="checkAns.php">  
1) อำเภอบางแพ อยู่ในจังหวัดอะไร<br>
<input type="radio" value="ก" name="question1">ก) กรุงเทพ<br>
<input type="radio" value="ข" name="question1">ข)  ราชบุรี<br>
<br>
2) แม่น้ำอะไรไหลผ่านกรุงเทพ<br>
<input type="radio" value="ก" name="question2">ก) เจ้าพระยา<br>
<input type="radio" value="ข" name="question2">ข) แม่กลอง<br>
<?php
foreach($correctAns as $value){
  echo '<input type="hidden" name="correct[]" value="'. $value. '">';
}
echo "<input type = hidden name = \"subjName\" value='$subjectName'>";
?>
<BR><BR>
   <input type="submit" value="ส่งข้อมูล" name="ok">
   <INPUT TYPE="RESET" VALUE="ยกเลิก">
   </FORM>
   </BODY></HTML>
แสดงผล



ไฟล์ตรวจคำตอบ (checkAns.php)

<?php
$subjName = $_POST["subjName"];
$correctAns = $_POST["correct"];  // $correctAns เป็น Array ประกอบด้วย คำตอบที่ถูก ที่ส่งมาจากตัวข้อสอบ
$numOfQstns = sizeof($correctAns);
$score = 0;
// รับคำตอบ และเก็บไว้ในตัวแปร Array ชื่อ $stAns
for ($i=1; $i<=$numOfQstns; $i++)
   {
      $stAns[$i-1] = trim($_POST["question" . $i]);  
   }
// ตรวจคำตอบ
for ($i=0; $i<=($numOfQstns-1); $i++)
   {
        $correct = $correctAns[$i];
        $stAnswer = $stAns[$i];
  if($stAnswer == $correct) {
  $score++;
  };
   };
echo "ท่านทำข้อสอบวิชา$subjName ถูก จำนวน $score ข้อ";
?>

แสดงผล

ข้อดีของวิธีการนี้คือ ไฟล์ตรวจคำตอบใช้ไฟล์เดียว แต่สามารถตรวจข้อสอบได้หลายฉบับ แต่ละฉบับสามารถมีความยาวได้ไม่เท่ากัน และไม่จำกัดจำนวนข้อ


วันอาทิตย์ที่ 24 มีนาคม พ.ศ. 2556

ชื่อตัวแปรของ PHP ที่ประกอบด้วย ข้อความและตัวแปร

ชื่อตัวแปรใน PHP สามารถกำหนดให้มีตัวแปร ร่วมกับข้อความได้ ทำให้มีความยืดหยุ่น และนำไปประยุกต์ใช้ได้ในหลายกรณี ทำให้การเขียนโค้ดสั้นเข้า และมีประสิทธิภาพมากขึ้น

รูปแบบที่ใช้คือ 

${"ข้อความ" . $ชื่อตัวแปร}

ตัวอย่าง  ${"stAns" . $i}

แนวทางการใช้งาน

โค้ดต่อไปนี้ ให้พิมพ์ค่าตัวแปรที่กำหนด


ผลที่ได้คือ

คำตอบข้อที่ 1 คือ 20
คำตอบข้อที่ 2 คือ 10
คำตอบข้อที่ 3 คือ 30
คำตอบข้อที่ 4 คือ 10
คำตอบข้อที่ 5 คือ 50


โค้ดต่อไปนี้ รับข้อมูลจากแบบทดสอบ และนำมาตรวจกับเฉลย พร้อมแสดงคะแนน










วันอาทิตย์ที่ 17 มีนาคม พ.ศ. 2556

การเรียงข้อมูลหลายแผ่นงานพร้อมกัน

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

การเรียงข้อมูลหลายแผ่นงานพร้อมกัน ต้องใช้ VBA หรือ แมโคร ช่วย

วิธีการเรียกใช้งาน แมโคร ให้ดูเรื่อง การคัดลอกข้อมูลจากหลายแผ่นงาน ของ Excel

ข้อควรระวัง
เมื่อเรียงข้อมูลแล้ว จะย้อนกลับเดิมไม่ได้ ดังนั้นก่อนเรียงข้อมูลควรคัดลอกข้อมูลเดิมไว้ก่อน หรือคัดลอกข้อมูลไปที่อื่น แล้วจึงทำการใช้แมโครนี้

Sub SortAllSheets()

'ปรับแก้ตามข้อมูลของท่าน
Const firstColToSort = "A" ' คอลัมน์แรก
Const lastColToSort = "C"   ' คอลัมน์สุดท้าย
Const keyCol = "A" ' คอลัมน์ที่จะให้เรียงข้อมูล

' คอลัมน์ที่มีข้อมูลทุกแถว
'อาจจะใช้ keyCol ก็ได้ แต่ไม่จำเป็น
Const testCol = "C"

' แถวเริ่มต้นข้อมูล (หัวตาราง)
Const startFrom = 1

Dim anyWS As Worksheet
Dim sortRange As Range
Dim sortKey As Range
'next improves performance
Application.ScreenUpdating = False
For Each anyWS In ThisWorkbook.Worksheets
Set sortRange = anyWS.Range(firstColToSort & startFrom  & ":" _
& lastColToSort & _
anyWS.Range(testCol & Rows.Count).End(xlUp).Row)
Set sortKey = anyWS.Range(keyCol & 2)
sortRange.Sort Key1:=sortKey, Order1:=xlAscending, _
Header:=xlYes, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom
Next

Set sortRange = Nothing
Set sortKey = Nothing
Set anyWS = Nothing

End Sub

การปรับใช้งาน

ถ้าข้อมูลเริ่มที่ A1 โดยเป็นหัวตาราง และข้อมูลจริงเริ่มที่ A2 จะสามารถใช้ได้เลย โดยไม่ต้องปรับเปลี่ยน

แต่ถ้าข้อมูลเริ่มต้นในตำแหน่งอื่น ต้องปรับตำแหน่งที่ระบุใน แมโคร ให้ถูกต้องด้วย เช่น ข้อมูลเริ่มต้นที่เซลล์ A3



ให้เปลี่ยนตำแหน่งเริ่มต้น ดังนี้

' แถวเริ่มต้นข้อมูล
startFrom = 3

เป็นต้น





ที่มา
www.excelbanter.com/showthread.php?t=259638

วันเสาร์ที่ 16 มีนาคม พ.ศ. 2556

การคัดลอกข้อมูลจากหลายแผ่นงาน ของ Excel

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

เช่น ในกรณีที่ใช้ Excel เก็บข้อมูลการใช้จ่ายเงินงบประมาณโครงการหลายโครงการ ( แผ่นงาน Excel คุมงบประมาณโครงการ หลายโครงการ)  แยกเป็นโครงการละ Sheet ต่อมาต้องการนำข้อมูลทั้งหมดมารวมกัน และเรียงข้อมูลตามวันที่ จะทำอย่างไร

สมมติว่า ต้องการรวมข้อมูลจาก 2 แผ่นงาน ข้างล่างนี้ ไว้ด้วยกันเป็นแผ่นงานเดียว

ข้อมูลแผ่นงานที่ 1



ข้อมูลแผ่นงานที่ 2



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

Sub Combine()
    Dim J As Integer
    On Error Resume Next
    Sheets(1).Select
    Worksheets.Add ' เพิ่ม Sheet เพื่อยังคงรักษาข้อมูลเดิมไว้ทั้งหมด
    Sheets(1).Name = "รวมข้อมูลทั้งหมด"
    ' คัดลอกส่วนหัวตารางส่วนบน ถ้าข้อมูลอยู่ในตำแหน่งอื่น ให้เปลี่ยนตามข้อมูลที่มี
    Sheets(2).Activate  
    Range("A1").EntireRow.Select
    Selection.Copy Destination:=Sheets(1).Range("A1")
    ' สำรวจว่ามีทั้งหมดกี่แผ่นงาน และเลือกทั้งหมด
    For J = 2 To Sheets.Count ' จากแผ่นงานที่ 2 ถึงสุดท้าย
        Sheets(J).Activate ' เลือกแผ่นงานทั้งหมด
        Range("A1").Select
        Selection.CurrentRegion.Select 
        ' เลือกทั้งหมด ยกเว้นส่วนหัว
        Selection.Offset(1, 0).Resize(Selection.Rows.Count - 1).Select
        ' คัดลอกข้อมูลจากทุกแผ่นงานมาต่อกันที่แผ่นงาน รวมข้อมูลทั้งหมด
        Selection.Copy Destination:=Sheets(1).Range("A65536").End(xlUp)(2)
    Next
   
    Sheets(1).Activate
End Sub

วิธีใช้งาน
  1. ลากดำและคัดลอกฟังก์ชั่นข้างบน
  2. เปิดไฟล์ Excel ที่มีข้อมูลที่ต้องการเรียง แล้วกดปุ่ม Alt+F11 เพื่อเปิดหน้าต่าง VBA
  3. คลิกเลือก สมุดงานนี้
  4. คลิกบริเวณที่จะวางโค้ด แล้่ววางข้อมูล โดยกด Ctrl + V
  5. ปิดหน้าจอ VBA
  6. ไปที่แถบ มุมมอง  >  แมโคร > แสดงแมโคร
  7. เลือกแโคร แล้วจดปุ่ม เรียกใช้
  8. ข้อมูลทุกแผ่นงานจะมารวมกันที่แผ่นงานใหม่
  9. จากนั้นก็สามารถจะเรียงข้อมูล หรือกรองข้อมูลต่าง ๆ ได้ ตามต้องการ โดยเฉพาะ ถ้ามีข้อมูลเป็นร้อย ๆ แผ่นงาน ก็สามารถทำได้โดยง่าย


แหล่งที่มา

Allen Wyatt, http://excel.tips.net/T003005_Condensing_Multiple_Worksheets_Into_One.html


  


วันพุธที่ 13 มีนาคม พ.ศ. 2556

สูตรสำหรับเริ่มนับใหม่ เมื่อขึ้นรายการใหม่ ของ Excel

ในกรณีที่มีรายการหลายรายการ และต้องการเริ่มต้น 1 ใหม่ ในทุก ๆ รายการ จะทำอย่างไร

จากตัวอย่างข้างล่าง ต้องการเขียนสูตรให้เริ่มต้นที่ 1 ที่รายการ ดินสอ ปากกา และสมุด



หลักการ

ใช้การเปรียบเทียบว่า ถ้าเซลล์ปัจจุบัน เหมือนกับเซลล์ก่อนหน้านั้น ให้เอา 1 บวกกับเลขลำดับก่อนหน้านั้น แต่ถ้าไม่เหมือน ก็ให้เริ่ม 1 ใหม่

วิธีการ

  1. ที่เซลล์ A2 ให้พิมพ์สูตร ดังนี้

    =IF(B2=B1,A1+1,1)

  2. กด Ctrl + Enter (เพื่อให้ประมวลผลและยังคงเลือกอยู่ที่เซลล์ A2 เหมือนเดิม)
  3. ดับเบิ้ลคลิกที่ปุ่มเติมข้อมูล (Fill Handle)

  4. จะได้รายการดังภาพ

สูตรนี้มีประโยชน์ ในกรณีที่มีหลาย ๆ รายการ เพิ่มขึ้นเรื่อย ๆ ให้เรียงข้อมูลก่อน แล้วจึงจัดลำดับ จะได้รายการชนิดเดียวกัน อยู่ด้วยกัน และมีหมายเลขกำกับ

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

หรือ ถ้าต้องการดูเฉพาะ รายการที่ 1-3 ก็สามารถใช้การกรอง กรองข้อมูลได้ ก็จะทำให้ดูข้อมูลง่ายขึ้น