วันจันทร์ที่ 21 กรกฎาคม พ.ศ. 2557

การ เช็คค่าของ Browser ว่าเป็น IE6-11 หรือไม่

นับว่าเป็นปัญหามาก สำหรับ webmaster และผู้ที่เขียนเว็บเองที่นำ Ajax มาใช้งานในระบบเว็บของตนเองเพื่อให้เกิด ประสิทธิภาพที่ดียิ่งขึ้น แต่การเขียน Code ไป coding เป็น แบบ Windows-874 (แทนที่จะเป็น แบบ UTF-8)จะทำให้ Script ของ Ajax เองไม่ทำงาน หรือ บางคนต้องการเขียน Script ที่ต้องการให้ผู้ใช้งานใช้ ใช้งานแต่ Browser ที่เป็น IE (Internet Explorer) มาดูของเดิม กัน

แต่ก่อนผมจะใช้

ตัวอย่าง Code
<?php
$iec = stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE');
$iever = substr($iec, 0,8);
if($iever=="MSIE 7.0" || $iever=="MSIE 8.0" || $iever=="MSIE 9.0"|| $iever=="MSIE 10.")
{
echo "This IE.";
}else{
echo "Other Broser.";
}
?>
*** คำอธิบาย
คือ ขั้นแรก ผมจะตัด ข้อความที่อยู่ใน ตัวแปร $_SERVER['HTTP_USER_AGENT'] ออกมาเก็บไว้ที่ตัวแปร $iec โดยการเริ่มตัดตั้งแต่คำที่ว่า MSIE เป็นต้นไป  หลังจากนั้นผมก็นำตัวแปรที่ชื่อ $iec มาตัดข้อความอีกรอบ โดยเริ่มตัดที่ตัวอักษรที่ 0 ถึงตัวอักษรที่ 8 (รวมช่องว่าง หรือ Space bar ด้วย) ไปเก็บไว้ในตัวแปร ที่ชื่อ $iever แล้วนำมาเทียบกับ if ว่ามีค่าหรือคำว่า "MSIE" ของเวอร์ชั่นใดบ้างตามตัวอย่าง ตาม Code ตัวอย่าง แต่ปัญหาของ Code ตัวอย่างด้านบน เมื่อ IE ออกเวอร์ชั่นใหม่คือ IE11(Windows 2008,Windows7,8,8.1 ขึ้นไป) ค่าที่เก็บในตัวแปร $_SERVER['HTTP_USER_AGENT'] จะไม่เหมือนกับ เวอร์ชั่น 6 -10 ดั่งตัวอย่าง เพราะฉะนั้นจึงทำให้เกิดปัญหาเกี่ยวกับการทำงานของ ระบบที่เราพัฒนา(ผมเองก็โดน เลยต้องหาวิธีแก้ไข) จาก google บ้าง และ http://stackoverflow.com/ ส่วนมาจะเป็นชาวต่างชาติเค้าแนะนำวิธีการต่างๆ นานา ผมก็เลยนำมาประยุกต์เอาแบบง่าย สุดเข้าใจได้ดี ตามตัวอย่าง(ตามประสาผมเองที่คิดได้เพียงเท่านี้)เลยครับ

*** คำอธิบาย
มีสอง Function ของ php ที่ผมนำมาใช้งานร่วมกันคือ
1.คือ Function "preg_match" คือ เปรียบเทีบคำในสตริงกับรูปแบบที่เรามี
2.คือ Function "strpos"  คือ ค้นหาตำแหน่งแรกของคำในสตริง

ตัวอย่าง Code

<?php
$AA = preg_match('~MSIE|Internet Explorer~i', $_SERVER['HTTP_USER_AGENT']);
echo "AA=".$AA;
echo "<br>";
echo "HTTP_USER_AGENT = ".$_SERVER['HTTP_USER_AGENT'];
echo "<br>";
$BB = strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0; rv:11.0');
echo "BB=".$BB;
echo "<br>";
echo "HTTP_USER_AGENT = ".$_SERVER['HTTP_USER_AGENT'];
?>

เมื่อ รันผ่าน IE จะได้ดังภาพ









และเมื่อรันผ่าน Chrome จะได้ดังภาพ








จะเห็นได้ว่าถ้ารันบน IE11 ค่าของ
$AA = preg_match('~MSIE|Internet Explorer~i', $_SERVER['HTTP_USER_AGENT']);จะมีค่าเท่ากับ = 0 เพราะว่า IE11 ไม่ได้เก็บรายละเอียดข้อมูล Browser แบบเดิม

และ
$BB = strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0; rv:11.0');จะมีค่าเท่ากับ = 36 เพราะว่า IE11 ไม่ได้เก็บรายละเอียดข้อมูล Browser แบบเดิมแต่จะมี "Trident/7.0; rv:11.0" เข้ามาแทน(ตามเพื่อนๆชาวต่างชาติบอกมา จาก http://stackoverflow.com/)

ส่วนถ้าเป็น Chrome จะมีค่า $AA = 0 และ $BB = ค่าว่าง
ดังนั้นผมเลยนำทั้งสอง Function มาทำการเปรียบเทียบ แบบ Boolean ตามตัวอย่าง

ตัวอย่าง Code
<?php
if (preg_match('~MSIE|Internet Explorer~i', $_SERVER['HTTP_USER_AGENT']) || (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0; rv:11.0') !== false)) {
echo "IE Browser";
}else{
echo "Other Browser";
}
?>
*** คำอธิบายการเทียบค่าของ สอง Function เป็นแบบ Boolean คือมี true กับ false ตามตัวอย่างผม ขั้น ทั้งสอง Function ด้วย || (หรือ) นั่นคือหากการเทียบค่าในวง(preg_match) แรก และ (strpos)ที่สอง หรือ อันใดอันหนึ่ง ไม่เท่ากับค่าว่างแสดงว่าเป็น IE แค่นี้ก็เอาอยู่แล้ว ครับสำหรับการเทียบค่าว่า ใช้ Browser IE หรือไม่ คราวหน้าผมจะมาอธิบายการ แปลงค่า หาก Coding จาก Encode Windows874 ไปเป็น UTF-8 เพื่อรองรับการทำงานของ Ajax

หวังว่าคงเป็นประโยชน์บ้างนะครับ สุพจน์ บัวเลิง