ASP.NET: QueryString กับ อัขรพิเศษ

จาก Wiki Opensource

ปัญหาที่พบจากการปฏิบัติงาน

  • ในหน้าเว็บ Default.aspx มี TextBox ชื่อ txtSearch สำหรับรับค่าที่ใช้ในการค้นหาในฐานข้อมูลที่เป็นSQL Server ซึ่ง SQL สำหรับการค้นหาครั้งนี้เปรียบเทียบด้วย LIKE
    เช่น
    Select *
    FROM Student
    WHERE StudentName LIKE @StudentName
  • การใช้้ LIKE บน SQL Server พร้อมกับ พารามิเตอร์ (ที่นำหน้าด้วยเครื่องหมาย @) ไม่รอบรับเครื่องหมายแทนความหมายใดๆ (%) ร่วมด้วยได้ จึงต้องผ่านเครื่องหมายนี้มาจากการนำเข้าข้อมูล นั่นคือ เมื่อ User พิมพ์คำที่ต้องการค้นหาใน TextBox  และกดปุ่มค้นหา โปรแกรมจะเข้าสู่คำสั่ง Button_Click() แล้วประกบเครื่องหมาย % ก่อนส่งออกเป็น QueryString
    เช่น
    string query = "search=%" + txtSearch.Text + "%";
    Response.Redirect("Default.aspx?" + query);

  • จากตัวอย่างส่วนหนึ่งของ Code หากข้อมูลที่ป้อนใน txtSearch เป็นข้อความ การทำงานจะถูกต้อง ยกเว้นเมื่อส่วนต้นของข้อมูลที่นำเข้าเป็นตัวเลข (ในที่นี่ชื่อคนอาจไม่เป็นตัวเลข ให้ลองจินตนาการ) เช่น
    txtSearch.Text = 41e        ส่งผลให้
    query = "search=%41e%"     คุณจะเห็น QueryString ที่ Browser เป็น http://<site>/Default.aspx?search=%41e%
  • เมื่อ Default.aspx ถูกเรียกอีกครั้งพร้อม QueryString
    ASP.NET จะเห็นค่า Request.QueryString["search"] เป็น Ae% เนื่องจากมีการตีความ %41 เป็นตัว A นั่นเอง
    ทำให้การค้นหาครั้งนี้ผิดพลาดในระดับโปรแกรม

วิธีการแก้ไข

  • ปรับแก้รหัสคำสั่งส่วนจัดการ QueryString ใหม่ด้วยการแปลงอักขระพิเศษ % ด้วยคำสั่ง Server.URLEncode(string s) ดังนี้
    string query = "search=" + Server.UrlEncode("%") + txtSearch.Text + Server.UrlEncode("%");
    Response.Redirect("Default.aspx?" + query);
  • เมื่อ Default.aspx ถูกเรียกอีกครั้งพร้อม QueryString ครั้งนี้ QueryString ที่ Browser เป็น http://<site>/Default.aspx?search=%2541e%25
    เมื่อ ASP.NET พบ %25 ก็จะเข้าใจว่าคือเครื่องหมาย % ทำในการส่งผ่าน QueryString ไปยัง DataBase เป็นไปอย่างถูกต้องยิ่งขึ้น