แก้ Function Character Limiter ใน Codeigniter ให้รองรับภาษาไทย
if ( ! function_exists('character_limiter')) { function character_limiter($str, $n = 500, $end_char = '…') { if (mb_strlen($str, "UTF-8") < $n) { return $str; } $str = preg_replace("/\s+/u", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str)); if (mb_strlen($str, "UTF-8") <= $n) { return $str; } $out = ""; foreach (explode(' ', trim($str)) as $val) { $out .= $val.' '; if (mb_strlen($out, "UTF-8") >= $n) { $out = trim($out); return (mb_strlen($out, "UTF-8") == mb_strlen($str, "UTF-8")) ? $out : $out.$end_char; } } } }
วิธีแก้ URL ให้รองรับภาษาไทยและ SEO Url
แก้ใน config/config.php
$config[‘permitted_uri_chars’] = ‘a-zก-๙0-9~%!?=&.:;#_\-‘;
—————-
แก้ไฟล์ system/core/URI.php
ใน _filter_uri
if ( ! preg_match(“|^[“.str_replace(array(‘\\-‘, ‘\-‘), ‘-‘, preg_quote($this->config->item(‘permitted_uri_chars’), ‘-‘)).”]+$|iu”, $str))
—————-
แก้ไฟล์ url_helper.php
ใน url_title
$trans = array(
‘&.+?;’ => ”,
‘[^a-z0-9ก-๙_-]’ => ”,
‘\s+’ => $separator,
‘(‘.$q_separator.’)+’ => $separator
);
$str = preg_replace(“#”.$key.”#iu”, $val, $str);
Random Row เรื่องเล็กๆ ที่สามารถสร้างปัญหาใหญ่ๆ
หลังจากที่มีข้อมูลใน Database MySQL เยอะขึ้นแล้ว สิ่งที่มองข้ามในหลาย ๆ จุดก็เริ่มแสดงผลขึ้น
เรื่องง่ายอย่างเช่นการสุ่มแสดงผลโดยใช้ RAND() ใน Mysql กลับใช้ทรัพยากรอย่างมากในการสุ่มแต่ละครั้ง
ทำให้ Server เริ่มเกิดอาการโหลดหนัก เนื่องจากมีการสุ่มข้อมูลเพื่อนำไปใช้ตลอด
(กว่าจะเจอต้นตอของความช้าก็ไล่ Benchmark Code แต่ละส่วนนานอยู่)
สำหรับเว็บที่มีแถวข้อมูลเป็นจำนวนมาก การใช้ RAND() นั้นไม่เหมาะแน่ ข้างล่างคือ Code เจ้าปัญหา
[Codeigniter]
$query = $this->db->limit(1)->order_by(‘unique_id’, ‘random’)->get(‘product’);
ผลลัพธ์ที่ออกมาได้หลังจาก Benchmark คือ 0.0693 วินาที อาจดูไม่มาก
แต่ด้วยจำนวน Req กับการที่ MySQL มันซด CPU ไปเยอะ แทบจะโดน VPS Provider เตะออก
คราวนี้มาแก้ไขกัน
ทั่วไปเค้าจะให้นำตัวเลขที่เป็น ID [auto increasement] มาหาค่า MAX แล้วสร้าง Random ตัวเลขเปล่าขึ้นมา
หลังจากนั้นก็นำตัวเลขนั้นไป Query Where ตรง ๆ แต่ในกรณีของผม ตัวตาราง DB ของสคริปนั้นไม่ได้มี AI Number
จึงเปลี่ยนมาใช้การตั้ง Limit Offset แทน ตัวอย่างโค๊ด ด้านล่าง
$count = $this->db->count_all_results(‘product’);
$query = $this->db->limit(1, rand(1, $count))->get(‘product’);
ผลลัพธ์ที่ได้คือ 0.0079 วินาที ไวกว่าเกือบ 10 เท่า และไม่ต้องกังวลเมื่อมี Product เพิ่มมากขึ้น
หลังจากที่ได้นำวิธีนี้ไปลองใช้ สามารถลดการใช้ CPU ไปได้อีกเยอะ
Like Group
$this->db->where(“(user_name LIKE ‘%$search%’ OR firstname LIKE ‘%$search%’ OR lastname LIKE ‘%$search%’ OR email LIKE ‘%$search%’)”);
Fire Log Spark – Codeigniter log viewer
Download/Screenshot :: Fire Log Spark
วิธีติดตั้งโดยไม่ใช้ Spark
1. ดาวน์โหลดและนำไฟล์ทุกไฟล์ไปวางตามตำแหน่ง Folder ยกเว้นไฟล์ config/autoload.php
2. สร้าง Class ใหม่ขึ้นมาในโฟลเดอร์ controlelr ยกตัวอย่างเช่น log.php (Class log)
3. ใน __construct ให้ทำการสั่งโหลดไฟล์ของ Fire Log Spark ตัวอย่าง Class ด้านล่าง
<?php
if (!defined(‘BASEPATH’))exit(‘No direct script access allowed’);
Class Log extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->helper(‘spark_url’);
$this->load->helper(‘fire_log’);
$this->load->config(‘fire_log’);
$this->load->language(‘fire_log’);
$this->load->library(‘fire_log’);}
function index(){
}
}
?>
4. ตรวจสอบ config/config.php ตรงค่า $config[‘log_threshold’] ปรับเอาตามต้องการ ถ้าค่าตรงนี้เท่ากับ 0 จะไม่มีการเขียน Log ครับ
5. เช็คโฟลเดอร์ application/logs ว่า chmod 777 ไว้หรือไม่ ถ้ายัง chmod 777 ด้วย
6. หลังจากนั้นให้เข้า URL ของ Class และ Function index ตัวอย่างเช่น http://www.domain.com/index.php/log/index
*** ตรง function index สร้างไว้เปล่าๆ ตามตัวอย่างก็พอครับ เข้าตามลิ้งค์ตัวอย่างด้านบน library Fire Log จะทำงานของมันเองจ้าาาา
Time Dropdown helper
function buildDayDropdown($name='',$value='',$atr='') { $days=''; while ( $days <= '31'){ $day[]=$days;$days++; } return form_dropdown($name, $day, $value,$atr); } function buildYearDropdown($name='',$value='',$atr='') { $years=10; while ( $years <= '31'+date('y')){ $year['20'.$years]='20'.$years;$years++; } return form_dropdown($name, $year, $value,$atr); } function buildMonthDropdown($name='',$value='',$atr='') { $month=array( '01'=>'January', '02'=>'February', '03'=>'March', '04'=>'April', '05'=>'May', '06'=>'June', '07'=>'July', '08'=>'August', '09'=>'September', '10'=>'October', '11'=>'November', '12'=>'December'); return form_dropdown($name, $month, $value,$atr); } function buildHourDropdown($name='',$value='',$atr='') { for($x=00;$x <= 23; $x++){ $hour[sprintf("%02d", $x)] = sprintf("%02d", $x); } return form_dropdown($name, $hour, $value,$atr); } function buildMinDropdown($name='',$value='',$atr='') { for($x=00;$x <= 59; $x++){ $min[sprintf("%02d", $x)] = sprintf("%02d", $x); } return form_dropdown($name, $min, $value,$atr); }
Form Helper
function countryDropdown($name='',$value='',$atr='') { $CI =& get_instance(); $query = $CI->db->get('country'); $data[''] = '-- เลือกประเทศ --'; if ($query->num_rows() > 0){ foreach ($query->result_array() as $row){ $data[$row['country_code']] = $row['country_name']; } } return form_dropdown($name, $data, $value,$atr); }
การ Group By วันที่ ใน Format ต่าง ๆ
จะขอยกตัวอย่างใน codeigniter นะครับ ซึ่งถ้าใช้ Query String ก็ใช้แบบเดียวกัน
การ Group By เวลาของ Unix time
(Unix time จะเป็นตัวเลข 10 หลัก ซึ่งถ้าไม่ใช้ Function ของ MySQL ลำบากแน่ครับ)
$this->db->group_by(“FROM_UNIXTIME(ชื่อฟิลด์ที่ต้องการกรุ๊ป, ”%Y-%m-%d”)”);
จะเป็นการ Group ตามวันเรียง ๆ กันไป เราสามารถใช้อีกเงื่อนไข
เพื่อทำการนับได้ว่าตามวันนั้น ๆ ที่ List เรียงจาก MySQL มีจำนวนเท่าไหร่
$this->db->select(‘Count(“ชื่อฟิลด์ที่ต้องการกรุ๊ป“) as number,ชื่อฟิลด์ที่ต้องการกรุ๊ป ‘);
เช่น
2011-05-28 มี 5 แถว
2011-05-29 มี 3 แถว
ค่าฟิลด์ number ของวันที่ 2011-05-28 ตาม Unix time ก็จะเท่ากับ 5
ส่วน 2011-05-29 ก็จะเท่ากับ 3 ในเวลาที่เรา foreach ผลลัพท์ออกมาทีละแถว
คราวนี้มาดู วิธี Group Datetime ของ MySQL กันบ้าง
ถ้าเรามีฟิลด์ Datetime อยู่ แล้วอยากให้ Group กัน แค่วันที่เพื่อนับว่าวันนึงมีสถิติผู้ใช้เท่าไหร่ ให้ใช้คำสั่งนี้
$this->db->group_by(“DATE(ชื่อฟิลด์ที่ต้องการกรุ๊ป)”);
หลังจากนั้นถ้าต้องการนับผลลัพท์จำนวนแถวทั้งหมด (จำนวนแถวจริง ไม่ใช่แนวหลัง Group นะครับ) ก็ให้ใช้คำสั่งแบบเดิม
คือการ Count ชื่อฟิลด์ที่กรุ๊ปแบบเดียวกับด้านบน เท่านี้ก็เขียนวิธีนับแถวตามวันได้แบบง่าย ๆ แล้ว
ปล. สำหรับ Codeigniter ถ้ามีปัญหาให้ลอง ใช้คำสั่งนี้วาง บนและล่างของบรรทัดที่ใช้ MySQL Function เช่น
$this->_protect_identifiers = FALSE;
$this->db->group_by(“DATE(regis_datetime)”);
$this->db->select(‘Count(“regis_datetime”) as number,DATE(regis_datetime) as day’);
$this->_protect_identifiers = TRUE;
Codeigniter best .htaccess rewrite
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L] </IfModule>