Archive

Archive for the ‘Codeigniter’ Category

แก้ Function Character Limiter ใน Codeigniter ให้รองรับภาษาไทย

May 20, 2014 Leave a comment
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;
               }
           }
     }
}

Code: http://pastebin.com/AzWwswpt

วิธีแก้ URL ให้รองรับภาษาไทยและ SEO Url

July 1, 2013 1 comment

แก้ใน 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);

Categories: Codeigniter

Random Row เรื่องเล็กๆ ที่สามารถสร้างปัญหาใหญ่ๆ

February 25, 2013 Leave a comment

หลังจากที่มีข้อมูลใน 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

January 3, 2013 Leave a comment

$this->db->where(“(user_name LIKE ‘%$search%’ OR firstname LIKE ‘%$search%’ OR lastname LIKE ‘%$search%’ OR email LIKE ‘%$search%’)”);

Categories: Codeigniter

Fire Log Spark – Codeigniter log viewer

January 13, 2012 Leave a comment

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

June 7, 2011 Leave a comment
        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

June 7, 2011 Leave a comment
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);
}
Categories: Codeigniter Tags: , ,

การ Group By วันที่ ใน Format ต่าง ๆ

May 28, 2011 Leave a comment

จะขอยกตัวอย่างใน 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

April 20, 2011 Leave a comment
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L] 
</IfModule>
Categories: Codeigniter Tags: ,