วันนี้นั่งลองเขียน php เพื่อลอง XMLHttpRequest โดยทำตามตัวอย่างเพื่อค้นหาข้อมูลในทันทีที่ผู้ใช้กรอกข้อมูล ที่นิยมทำกันในปัจจุบันโดยเฉพาะโปรแกรมดิกชันนารี เนื่องจากสามารถตอบสนองผู้ใช้ได้รวดเร็วกว่า ผู้ใช้ทราบได้ทันทีในขณะที่พิมพ์ว่ามีข้อมูลนี้อยู่หรือไม่ เว็บนี้ประกอบด้วยหลายส่วนคือ
- index.html ซึ่งเป็นส่วนติดต่อกับผู้ใช้
- ajax.js ซึ่งเป็น Javascript เพื่อติดต่อกับ server
- ajax.php เป็น php ส่วนติดต่อกับ database โดยส่วนนี้จะติดต่อกับ ajax.js เพื่อส่งผลลัพท์ไปแสดงผลใน index.html
ส่วนแรก index.html ก็เหมือนกับ html/php ทั่วๆไป คือเป็น form รับข้อมูลจากผู้ใช้
<html> <head> <title>Test Ajax</title> <script language="javascript" src="ajax.js"></script> </head> <body> <form action="search.php" method="post"> <strong>Book name:</strong> <input type="text" name="bkname" autocomplete="off" id="bkname" onKeyUp="preSearch()" /> <br /> </form> <div id="filling"> </div> <div id="result"> </div> </body> </html>
ส่วนที่สองคือ ajax.js ซึ่งทำหน้าที่ติดต่อกับ ajax.php เพื่อแสดงผลการค้นหา โดยจะถูกเรียกมาทำงานตามฟังก์ชัน preSearch() ซึ่งกำหนดไว้ที่ onKeyUp ซึ่งเป็น event ที่จะเกิดขึ้นทุกครั้งที่ผู้ใช้กรอกข้อมูลเข้าไปหนึ่งตัวอักษร เพราะต้องการให้เว็บแสดงผลลัพธ์ทันทีในขณะที่กำลังกรอกข้อมูล
var xmlhttp = false;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
xmlhttp.overrideMimeType('text/xml');
}
else if (window.ActiveXObject) {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
function preSearch() {
var bkName = document.getElementById('bkname').value;
if (bkName != "") {
document.getElementById('filling').innerHTML = "Searching... ";
var url = 'ajax.php?q='+bkName;
xmlhttp.open('GET',url,true);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readystate == 4 && xmlhttp.status == 200) {
document.getElementById('result').innerHTML = xmlhttp.responseText;
document.getElementById('filling').innerHTML = " ";
}
else {
document.getElementById('result').innerHTML = "Error....";
document.getElementById('filling').innerHTML = " ";
}
};
xmlhttp.send(null);
}
}
จากโปรแกรมข้างบน จะมีการเรียกใช้ XMLHttpRequest ซึ่งเป็น object จึงต้อง initialize ก่อน แต่ Internet Explorer กับ Gecko-based browser มีวิธีการเรียกใช้ XMLHttpRequest ไม่เหมือนกัน จึงต้องใช้วิธีข้างต้น ในการกำหนดค่าเริ่มต้น จากนั้น preSearch() จะเรียกข้อมูลที่ผู้ใช้กรอกไว้ โดยใช้ document.getElementById() ซึ่งฟังก์ชันนี้จัดว่าเป็นฟังก์ชันสำคัญฟังก์ชันหนึ่ง เพราะทำให้สามารถเข้าไปแก้ไขโครงสร้างส่วนต่างๆ ของเว็บได้ จากนั้นจะใช้ XMLHttpRequest เพื่อติดต่อไปยัง ajax.php และส่งข้อมูลที่ต้องการค้นหาไปให้ แล้วก็รอผลลัพธ์จาก ajax.php เพื่อนำมาแสดงผลใน id ที่ชื่อว่า result
ส่วนสุดท้ายคือ ajax.php ก็เป็นสคริปต์ php ทั่วๆ ไป ซึ่งจะรับ request แล้วก็จะไปค้นหาข้อมูลในฐานข้อมูล จัดรูปแบบให้เรียบร้อย เพื่อใช้เป็นผลลัพธ์
<?php
if (empty($_GET['q'])) {
echo ' ';
}
else {
$search = trim($_GET['q']);
$link = mysql_connect('localhost', 'user', 'password')
or die('Could not connect: '.mysql_error());
mysql_select_db('bookstore')
or die('Could not select database:'.mysql_error());
$query = "SELECT bkname,bkauthor FROM book WHERE bkname LIKE
'$search%'";
$result = mysql_query($query)
or die('Query failed:'.mysql_error());
?>
<table border="1"><tr><th>Title</th><th>Author</th></tr>
<?php
while($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
echo('<tr>');
foreach($line as $col) {
echo("<td>$col</td>");
}
echo('</tr>');
}
?>
</table>
<?php
mysql_free_result($result);
mysql_close($link);
}
?>
สรุป จะเห็นว่าส่วนที่เพิ่มเติมของเทคนิค AJAX ก็คือ การใช้ XMLHttpRequest เพื่อร้องขอข้อมูลเพิ่มเติม และการเข้าถึง DOM โดยใช้ document.getElementById เพื่อให้สามารถแก้ไข หรือเพิ่มเติมโครงสร้างของเว็บได้ ช่วยให้เว็บมีการตอบสนองผู้ใช้ได้ดียิ่งขึ้น จากเดิมที่ต้องแสดงผลใหม่ทั้งหน้า เป็นแสดงผลเฉพาะส่วน ตัวอย่างนี้แค่แสดงลักษณะง่ายๆ ของ AJAX แต่การนำไปใช้งานจริง คงจะมีสิ่งที่ต้องคำนึงถึงมากกว่านี้ ทั้งในเรื่องการจัดการส่วนการแสดงผลให้เหมาะสม
No comments:
Post a Comment