ปัญหาและการวิเคราะห์
วันนี้เจอ bug แปลก ๆ นั่นคือการใช้งานคำสั่ง MetabaseSetSelectedRowRange
ที่อยู่ใน Metabase library เพื่อจำกัดจำนวนของข้อมูลที่ต้องการ
แต่ดูเหมือนว่าจะใช้ไม่ได้ เพราะ query นานมาก นานเหมือน query มาทั้งหมด
จน timeout
โดยใน code นั้นก็เรียก MetabaseSetSelectedRowRange ตามปรกติ คือ
MetabaseSetSelectedRowRange($database, 0, $n);
โดย $n รับค่ามาจาก $_REQUEST ธรรมดา ๆ นี่แหล่ะ
$n = $_REQUEST['n'];
และไอ้ที่ทำให้มีปัญหาก็คือไอ้ $_REQUEST ธรรมดานี่แหล่ะ - -"
(เพราะ PHP จะถือว่าค่าใน $_REQUEST เป็นข้อมูลชนิด string)
เนื่องจากใน function MetabaseSetSelectedRowRange
มีการตรวจสอบชนิดของข้อมูลก่อนทำงานด้วย
และถ้าชนิดของ parameter ที่ใส่เข้าไปไม่ใช่ Integer มันจะไม่ทำงาน
จึงทำให้เสมือนว่าเราต้อง query ทั้งหมด script จึง run จน timeout ครับ
วิธีการแก้ไข
ก็คือทำให้ $n เป็น integer ซึ่งทำได้ 2 วิธี
1. แปลงชนิดข้อมูลตั้งแต่ assign ให้ $n
$n = intval($_REQUEST['n']);
2. แปลงชนิดข้อมูลตอนจะใช้งาน
MetabaseSetSelectedRowRange($database, 0, intval($n));
เป็นอันเสร็จครับผม
หมายเหตุ จริง ๆ แล้ว Metabase เป็น Library ที่ค่อนข้างเก่าแล้ว อาจจะไม่มีคนใช้แล้วก็ได้ - -"
แต่ที่เขียนเก็บไว้ก็เพราะว่า อยากให้เห็นแนวทางการวิเคราะห์สาเหตุ และแก้ปัญหาครับผม