หลังจากที่ Codeigniter 2 ออกมา ก็มาพร้อมกับบั๊กตามเคย ปัญหานี้คือการรับค่า input จาก textarea เข้าไปแล้วเกิดการซ้ำซ้อนของการขึ้นบรรทัดใหม่ (\n หรือ new line)
อ่านแล้วอาจงง จะยกตัวอย่างให้ดูกัน...สมมุติว่าเรากรอก
line1
line 2
ซึ่ง เป็นข้อมูล 2 บรรทัดเท่านั้น เมื่อรับค่าด้วย $this->input->post("textarea_input", true); โดยใส่ ,true เพื่อกรอง XSS จะได้ผลกลับมาเป็น
line1
line2
กลาย เป็นขึ้นบรรทัดใหม่ 2 ครั้ง เป็น 3 บรรทัดทันที. กรณีนี้จะเป็นปัญหาอย่างมากเมื่อมีการ insert แล้วทำการ update ทุกครั้ง จำนวนบรรทัดก็เพิ่มขึ้นเรื่อยๆ x2 ทุกครั้ง
วิธีการแก้ ให้สร้างไฟล์ MY_Input.php ไว้ใน application/core แล้วก๊อปโค้ดต่อไปนี้ใส่ลงไป
class MY_Input extends CI_Input
{
public function __construct()
{
parent::__construct();
}// __construct
// --------------------------------------------------------------------
/**
* Clean Input Data
*
* This is a helper function. It escapes data and
* standardizes newline characters to \n
*
* @access private
* @param string
* @return string
*/
public function _clean_input_data($str)
{
if (is_array($str)) {
$new_array = array();
foreach ($str as $key => $val) {
$new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
}
return $new_array;
}
// We strip slashes if magic quotes is on to keep things consistent
if (function_exists('get_magic_quotes_gpc') AND get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
// Clean UTF-8 if supported
if (UTF8_ENABLED === TRUE) {
$str = $this->uni->clean_string($str);
}
// Should we filter the input data?
if ($this->_enable_xss === TRUE) {
$str = $this->security->xss_clean($str);
}
// Standardize newlines if needed
if ($this->_standardize_newlines == TRUE) {
if (strpos($str, "\r") !== FALSE) {
$str = str_replace(array("\r\n", "\r"), "\n", $str);
}
}
return $str;
}
}
/* end of file */
โค้ด ข้างบนจะทำการเปลี่ยน $str = str_replace(array("\r\n", "\r"), PHP_EOL, $str);
เป็น $str = str_replace(array("\r\n", "\r"), "\n", $str);
ซึ่งจะทำให้แก้ปัญหาขึ้นบรรทัดใหม่ซ้ำซ้อนหายไป