ภาคจบโปรเจ็ค การใช้งาน codeigniter และการกำหนด URL รองรับ SEO

เขียนเมื่อ 9 ปีก่อน โดย Ninenik Narkdee
codeigniter codeigniter 3 seo url

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ codeigniter codeigniter 3 seo url

ดูแล้ว 7,228 ครั้ง


เนื้อหาตอนต่อไปนี้ จะขอถือเป็นตอนสุดท้ายของโปรเจ็คการเรียนรู้ และใช้งาน codeigniter
อย่างไรก็ตาม เนื้อหาเกี่ยวกับ codeigniter ก็จะยังมีเพิ่มเติม รวมถึงบางส่วนของ
library หรือส่วนประกอบอื่นๆ ที่ยังไม่ได้กล่าวถึง โดยจะนำมาอธิบาย หรือแนะนำ
แยกออกจากโปรเจ็คที่เราศึกษามาแต่ต้น
 
การจบส่วนของโปรเจ็คนี้ หากใครกดติดตามบทความ ตั้งแต่ต้น จนถึงตอนนี้ จะสามารถดาวน์
โหลดโปรเจ็ค ที่ใช้งาน codeigniter 3.0.1 ไปต่อยอดหรือปรับแต่งใช้งานเพิ่มเติมได้
 
ส่วนของเนื้อหาที่เราเหลืออยู่ก็คือ หน้า home , aboutus และ service
โดยหน้า home เราจะปล่อยเป็นหน้าว่าง นั่นก็คือ เราจะใส่ข้อมูลอะไรก็ได้ ประยุกต์เพิ่มเติมเอา
ส่วนหน้า aboutus อันนี้จะเป็นแค่การดึงข้อมูลมาแสดง อ้างอิงจากบทความ
 
การใช้งาน CKEditor CDN ร่วมกับ codeigniter อย่างง่าย 
 
และหน้า service ก็จะเป็นการดึงข้อมูลมาแสดงเช่นกัน แต่หน้านี้จะพิเศษขึ้นมาหน่อย คือ
เราจะมาดูในเรื่องของการกำหนด url ให้รองรับ seo เช่น url เป็นภาษาไทย
 

การแสดงข้อมูลหน้า Aboutus

 
ให้เปิดไฟล์ aboutus.php ในโฟลเดอร์ apps > views > pages 
แล้วกำหนดโค้ดประมาณนี้  
 
<div class="container">  

<div class="container-fluid">
<?php
$query = $this->db->get_where("tbl_aboutus",array("aboutus_id"=>1));
$row = $query->row_array();  //คิวรี่ข้อมูลมาแสดงแค่รายการเดียว  
if(isset($row))  // ถ้ามีข้อมูล   
{  
?>

<h1><?=$row['aboutus_title']?></h1>  
<p>
    <?=$row['aboutus_detail']?>
</p> 
   
<?php } ?>  
</div>

</div> 
 

การแสดงข้อมูลหน้า Service และการกำหนด URL ให้รองรับ SEO

 
สำหรับรายละเอียดการดึงข้อมูลในหน้า Service มาแสดงและแบ่งหน้า นั้นจะคล้ายๆ กับในส่วน
ของตอนที่เกี่ยวกับการจัดการ Service ของ admin ดึงนั้นจะไม่ลงรายละเอียดอธิบายซ้ำ
 
ก่อนอื่นเรามาดูรูปแบบ URL ของหน้า service ของเว็บไซต์โปรเจ็คของเราก่อน
รูปแบบ URL จะเป็น
 
http://localhost/learnci/service  
// หน้าปกติ
http://localhost/learnci/service/page/2   
// มีการแบ่งหน้า
http://localhost/learnci/service/view/1 
// แสดงข้อมูล อ้างอิง id ข้อมูลเท่ากับ 1
http://localhost/learnci/service/view/หัวข้อของบริการ_ที่_1
// แสดงแบบรองรับ SEO 
 
เริ่มต้นให้เราสร้างไฟล์ชื่อ Service_model.php ไว้ในโฟลเดอร์ apps > models 
 
<?php
class Service_model extends CI_Model {

    public function __construct()
    {
        parent::__construct();
        $this->load->library('user_agent');
        $this->load->library('pagination');
    }
    
    public function getlist($id,$query_str=null){
        
        $config['base_url'] = base_url('service/page/'); // url  เพจข้อมูลของเรา      
        $config['per_page'] = 5;  // จำนวนแสดงต่อหน้า
        $config['num_links'] = 2; // จำนวนเลขซ้ายขวา เช่น 1 2 3 4 5 คือหน้า 2 หลัง 2
        $config['use_page_numbers'] = TRUE;  // แสดงเลขหน้าตามจริง เช่นหน้า 1 ก็เป็นเลข 1
        // ส่วนของการกำหนดหน้าตาของ การแบ่งหน้า เนื่องจากเราใช้ bootstrap css จึงสามารถนำมาใช้ได้เลย
        $config['full_tag_open'] = '<nav><ul class="pagination">'; // เปิดแท็กทั้งหมด
        $config['full_tag_close'] = '</ul><nav>'; // ปิดแท็กทั้งหมดด้วย
        $config['first_link'] = 'First'; // ข้อความแสดงหน้าแรก
        $config['first_tag_open'] = '<li>'; // แท็กเปิดข้อความหน้าแรก
        $config['first_tag_close'] = '</li>'; // แท็กปิดข้อความหน้าแรก
        $config['first_url'] = '';  //url หน้าแรก
        $config['last_link'] = 'Last'; // ข้อความสแดงหน้าสุดท้าย
        $config['last_tag_open'] = '<li>';  // แท็กเปิดข้อความหน้าสุดท้าย
        $config['last_tag_close'] = '</li>'; // แท็กปิดข้อความหน้าสุดท้าย
        $config['next_link'] = '&gt;';  // ข้อความหน้าก่อนหน้า ในที่นี้ใช้สัญลักษณ์ <
        $config['next_tag_open'] = '<li>';  // แท็กเปิดข้อความแสดงหน้าก่อนหน้า
        $config['next_tag_close'] = '</li>'; // แท็กปิดข้อความแสดงหน้าก่อนหน้า
        $config['prev_link'] = '&lt;';  // ข้อความหน้าถัดไป ในที่นี้ใช้สัญลักษณ์ >
        $config['prev_tag_open'] = '<li>'; // แท็กเปิดข้อความหน้าถัดไป
        $config['prev_tag_close'] = '</li>';  // แท็กปิดข้อความหน้าถัดไป
        $config['cur_tag_open'] = '<li class="active"><a href="javascript:void();">'; // แท็กหน้าเลขเพจปัจจุบัน
        $config['cur_tag_close'] = '</a></li>'; // แท้กปิดหน้าเพจปัจจุบัน
        $config['num_tag_open'] = '<li>'; // แท็กเปิดหน้าเพจเลขต่างๆ
        $config['num_tag_close'] = '</li>';  // แท็ปิดหน้าเพจเลขต่างๆ
        $config['reuse_query_string'] = TRUE;
        

        $config['total_rows'] =  $this->db->count_all_results('tbl_service',FALSE);
        $this->pagination->initialize($config);  // ตั้งค่าการกำหนด การแบ่งหน้า        
        
        $begin=(isset($id) && $id>1)?($id-1)*$config['per_page']:0;
        $this->db->limit($config['per_page'], $begin);
        $query = $this->db->get();
        return $query->result_array();
    }     

    public function view($id){  // มี $id เป็น parameter ไว้กำหนดเงื่อนไข
        if(intval($id)>0){
            $query = $this->db->get_where('tbl_service',array('service_id'=>$id));
        }else{
            $arr_where=array(
                'service_title'=>preg_replace('/_/',' ',$id)
            );
            $query = $this->db->get_where('tbl_service',$arr_where);
        }
        return $query->row_array(); // ส่งข้อมูลผลัพธ์กลับเป็น array แถวข้อมูล
    }        

}
 
จากโค้ดด้านบน เราจะขอพูดเฉพาะในส่วนของ ฟังก์ชั่น view($id)
จะเห็นว่า เราจะมีการกำหนดเงื่อนไข โดยการตรวจสอบค่าจากตัวแปร $id
 
if(intval($id)>0){  // ถ้าแปลค่าตัวแปร $id  แล้วมีค่ามาก 0 แสดง่ว่าข้อมูลที่ส่งมา
เป็นลักษณะของตัวเลข เช่นเราเรียก URL 
 
http://localhost/learnci/service/view/1 
 
ถ้าเรากำหนด URL ในลักษณะข้างต้น เลข 1 ก็คือค่าในฟิลด์ service_id ของตาราง tbl_service
 
การคิวรี่ข้อมูลจึงเป็นการเทียบกับค่าของ service_id
 
$query = $this->db->get_where('tbl_service',array('service_id'=>$id));
 
หากเป็นกรณีอื่น เช่น เมื่อแปลงค่าเป็นตัวเลขแล้วมีค่าน้อยกว่าหรือท่ากับ 0
แสดงว่าค่าของตัวเปร $id เป็นในลักษณะของข้อความตัวอักษร โดยรูปแบบนี้
เราจะใช้ประโยชน์สำหรับ SEO สำหรับใช้กับ URL ตัวอย่าง
 
http://localhost/learnci/service/view/หัวข้อของบริการ_ที่_1
 
จากตัวอย่าง ค่า $id ก็คือ หัวข้อของบริการ_ที่_1 ซึ่งได้มาจากข้อความ
ของฟิลด์ service_tile มีค่าเป็น "หัวข้อของบริการ ที่ 1"
เราจะเห็นว่า หัวข้อจริงๆ แล้วจะมีช่องว่าง แต่สำหรับกำหนดให้ URL รองรับ SEO
จึงได้ทำการแปลงจากช่องว่างให้เป็นเครื่องหมาย _ (underscore) แทนด้วยฟังก์ชั่น
 
$service_title_url=preg_replace('/[[:space:]]+/', '_', trim($row['service_title']));  
// อยู่ในไฟล์ service.php
 
ดังนั้นเมื่อค่าที่ส่งมามีเครื่องหมาย _ เวลาเอาไปใช้ จึงต้องแปลงกลับ
ด้วยคำสั่ง
 
preg_replace('/_/',' ',$id)
 
การเปรียบเทียบค่า WHERE ก็จะได้เป็น service_title='หัวข้อของบริการ ที่ 1' 
 
$arr_where=array(
    'service_title'=>preg_replace('/_/',' ',$id)
);
$query = $this->db->get_where('tbl_service',$arr_where);
 
การกำหนดในลักษณะนี้ จะทำให้สามารถรองรับการใช้งานทั้งแบบค่า id และค่าที่เป็นข้อความ
เพื่อรองรับ SEO
 
ต่อไปเรามาดูที่ไฟล์ service.php ในโฟลเดอร์ apps > views > pages 
โค้ดสำเร็จจะได้เป็นดังนี้
 
<div class="container">


<?php if($action==null  || $action=='page'){?>
<h1><?=$title_h1?></h1>
<?php
$query_str = $this->input->get();    
$keyword = $this->input->get('keyword');    
$result = $this->service_model->getlist($id,$query_str);
?>
<?php
$i_num=0;
if(!isset($id)){
    $id=1;  
}
if(count($result)>0){
    foreach($result as $row){
        $i_num++;
        $service_title_url=preg_replace('/[[:space:]]+/', '_', trim($row['service_title']));  
?>
  <div class="container-fluid">
  <img src="<?=base_url('upload/'.$row['service_img'])?>" 
  class="img-responsive" style="width:150px;" alt="">
  <br>
<!--    <a href="<?=base_url('service/view/'.$row['service_id'])?>"><?=$row['service_title']?></a>-->
    <a href="<?=base_url('service/view/'.$service_title_url)?>"><?=$row['service_title']?></a>
    <p>
        <?=mb_substr(strip_tags($row['service_detail']),0,30)?>
<!--        <a href="<?=base_url('service/view/'.$row['service_id'])?>">อ่านเพิ่ม..</a>-->
        <a href="<?=base_url('service/view/'.$service_title_url)?>">อ่านเพิ่ม..</a>
    </p>
    
   <br>
    </div>      
<?php } ?>
<?php } ?>

<?php
echo $this->pagination->create_links();
?>

<?php } ?>

<?php if($action=='view'){?>
<?php
$previous_url = $this->agent->referrer();        
// เรียกใช้ฟังก์ชั่น view() ดึงข้อมูลมาแสดงก่อนแก้ไข    
$row = $this->service_model->view($id);                                     
?>
<div class="container-fluid">

<h1><?=$row['service_title']?></h1>    
<p>
<img src="<?=base_url('upload/'.$row['service_img'])?>" class="img-responsive" alt="">
<br><br>
 <?=$row['service_detail']?>   
</p>
<br>
<a href="<?=$previous_url?>" class="btn btn-warning btn-sm">< Back</a>
<br><br>
</div>

<?php } ?>

</div>
 
ดูในส่วนแรกกัน คือส่วนของ $action เท่ากับ null หรือ $action เท่ากับ page
ซึ่งก็คือหน้าที่เราเปิดเข้ามา และก็หน้าที่การแบ่งหน้า หรือเลือกหน้าของข้อมูล
 
<?php if($action==null  || $action=='page'){?>
<h1><?=$title_h1?></h1>
<?php
$query_str = $this->input->get();    
$keyword = $this->input->get('keyword');    
$result = $this->service_model->getlist($id,$query_str);
?>
<?php
$i_num=0;
if(!isset($id)){
    $id=1;  
}
if(count($result)>0){
    foreach($result as $row){
        $i_num++;
        // แปลงหัวข้อให้รองรับ URL สำหรับ SEO คือเปลี่ยนช่องว่างเป็น _
        $service_title_url=preg_replace('/[[:space:]]+/', '_', trim($row['service_title']));  
?>
  <div class="container-fluid">
  <img src="<?=base_url('upload/'.$row['service_img'])?>" 
  class="img-responsive" style="width:150px;" alt="">
  <br>
<!--    <a href="<?=base_url('service/view/'.$row['service_id'])?>"><?=$row['service_title']?></a>-->
    <a href="<?=base_url('service/view/'.$service_title_url)?>"><?=$row['service_title']?></a>
    <p>
        <?=mb_substr(strip_tags($row['service_detail']),0,30)?>
<!--        <a href="<?=base_url('service/view/'.$row['service_id'])?>">อ่านเพิ่ม..</a>-->
        <a href="<?=base_url('service/view/'.$service_title_url)?>">อ่านเพิ่ม..</a>
    </p>
    
   <br>
    </div>      
<?php } ?>
<?php } ?>

<?php
/// ส่วนของการแบ่งหน้า                                            
echo $this->pagination->create_links();
?>

<?php } ?>
 
โค้ดในส่วนนี้ไม่มีอะไร คล้ายเนื้อหาที่เราเคยศึกษามาแล้ว แต่ให้สังเกตตรงฟังก์ชั่น 
 
        // แปลงหัวข้อให้รองรับ URL สำหรับ SEO คือเปลี่ยนช่องว่างเป็น _
        $service_title_url=preg_replace('/[[:space:]]+/', '_', trim($row['service_title']));  
 
ส่วนนี้ จะเป็นส่วนที่เราจะแปลงหัวข้อมูลให้รอบรับ URL สำหรับ SEO คือเปลี่ยนช่องว่างเป็น _
เพื่อส่งเข้าไปในหน้าลิ้งค์แสดงข้อมูล คือจากหัวข้อ "หัวข้อของบริการ ที่ 1" ก็แปลงเป็น
"หัวข้อของบริการ_ที่_1" ส่งไปกับ URL ให้รองรับ SEO
 
ในโค้ดเรายังมีลิ้งค์ที่เรากำหนดการส่งแบบค่า service_id เข้าไป แต่เราไม่ได้ใช้ คอมเม้นท์ปิดไว้
ให้ดูเป็นแนวทาง เลือกว่าจะใช้แบบไหน ซึ่งฟังก์ชั่นที่เราเขียนไว้รองรับทั้งสองแบบอยู่แล้ว
 
ต่อมาเรามาดูในส่วนของการแสดงข้อมูล เมื่อคลิกลิ้งค์หัวข้อของบริการ
 
<?php if($action=='view'){?>
<?php
$previous_url = $this->agent->referrer();        
// เรียกใช้ฟังก์ชั่น view() ดึงข้อมูลมาแสดงก่อนแก้ไข    
$row = $this->service_model->view($id);                                     
?>
<div class="container-fluid">

<h1><?=$row['service_title']?></h1>    
<p>
<img src="<?=base_url('upload/'.$row['service_img'])?>" class="img-responsive" alt="">
<br><br>
 <?=$row['service_detail']?>   
</p>
<br>
<a href="<?=$previous_url?>" class="btn btn-warning btn-sm">< Back</a>
<br><br>
</div>

<?php } ?>
 
ในหน้านี้จะเห็นว่าเรามีการส่ง $id ในที่นี้ก็คือหัวข้อที่จัดรูปแบบให้รองรับ SEO แล้ว
เข้าไปทำการคิวรี่ข้อมูลผ่านฟังก์ชั่น view() ใน model ถ้าหัวข้อที่ส่งไปกับ URL
ตรงกับหัวข้อในฐานข้อมูลฟิลด์ service_title ก็จะทำการดึงข้อมูลรายละเอียด
และข้อมูลอื่นๆ ของ service มาแสดง  
 
 
สำหรับโปรเจ็ค การเรียนรู้การใช้งาน codeigniter ของเราก็ขอจบเพียงเท่านี้ 
ใครที่กดติดตาม เนื้อหาหมวด codeigniter ตั้งแต่ต้นจนถึงตอนนี้ ก็รอโหลด
ไฟล์โปรเจ็คจากเมนูสมาชิกด้านขวา เร็วๆ นี้ ได้เลย
ส่วนใครที่อยากได้โค้ดส่วนนี้ ก็ไล่กดติดตามเนื้อหาให้ครบตามเงื่อนไข ก็จะสามารถ
ดาวน์โหลดได้
 
ปล. เนื้อหาเกี่ยวกับ codeigniter จะยังมีเพิ่มเติมตามความเหมาะสม
 


   เพิ่มเติมเนื้อหา ครั้งที่ 1 วันที่ 20-03-2017


สำหรับไฟล์ project codeigniter สามารถเข้าไปทำการดาวน์โหลดได้ที่

ดาวน์โหลดโปรเจ็คตัวอย่าง Codeigniter คลิกที่นี่


สำหรับใครที่จะนำโค้ดตัวอย่างไปใช้งานบน server สิ่งที่ต้องทำเพิ่มเติม รวมถึง
การตรวจสอบกรณีปัญหาที่อาจจะเจอมีดังนี้
 
1. เมื่ออัพโหลดไฟล์ และสร้างตารางฐานข้อมูลตัวอย่าง และเชื่อมต่อเรียบร้อยแล้ว
สิ่งที่ต้องทำเพิ่มคือการกำหนด เกี่ยวกับการจัดเก็บ session 
โดยเลือกได้ว่าจะไว้เป็นแบบไฟล์ในโฟลเดอร์หรือในฐานข้อมูล สามารถทำได้ดังนี้
 
ในไฟล์ config.php  ในโฟลเดอร์ apps > config เกี่ยวกับ
 
แบบที่ 1 ในกรณีเก็บบันทึกแบบ Files ไฟล์ในโฟลเดอร์ ให้แก้ไขบรรทัด
 
$config['sess_driver'] = 'files';  // ถ้าเป็นค่า files อยู่แล้ว ก็ไม่ต้องแก้
 
ให้กำหนดค่าเป็น files
 
ต่อมาให้สร้างโฟลเดอร์ชื่อ 'sessions' ไว้ในโฟลเดอร์  apps 
แล้วกำหนด permission เป็น 700 
กรณีใช้คำสั่งผ่าน shell หรือ command สามารถกำหนดด้วยคำสั่ง chmod ดังนี้
 
chmod 0700 /apps/sessions/
 
จากนั้นให้กำหนดค่าเป็นดังนี้
 
$config['sess_save_path'] = FCPATH . 'apps/sessions/';
 
รูปแบบการกำหนดในส่วนของ session ทั้งหมด
กรณีใช้การบันทึก session เป็นไฟล์ไว้ในโฟลเดอร์
 
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session_myweb';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = FCPATH . 'apps/sessions/';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
 
ในกรณีแบบแรกนี้ ถ้าเราใช้งาน server ที่เป็นระบบ UNIX เชน พวก LINUX 
นอกจากเราจะกำหนด permisstion เป็น 777 แล้ว
เราต้องทำการกำหนด directory owner ด้วยคำสั่ง chown ผ่าน command ดังนี้
 
chown www-data /apps/sessions/
 
ทั้งนี้ก็เพื่อในกรณีที่ script นั้นรันจากตัวระบบ หรือ system user 
ให้สามารถทำงานได้ ไม่เช่นนั้น script จะสามารถรันได้เฉพาะ user ที่สร้างโฟลเดอร์เท่านั้น
ซึ่งอาจจะมีปัญหาตามมาได้ ซึ่งถ้าเราไม่สามารถจัดการตรงนี้เองได้ สามารถให้ทาง
hosting ที่เราใช้บริการ จัดการตรงนี้ให้ได้
 
 
แบบที่ 2 ในกรณีเก็บบันทึกแบบ database บันทึก session ลงฐานข้อมูล
ให้แก้ไขบรรทัด
 
$config['sess_driver'] = 'database';
 
ให้กำหนดค่าเป็น database
 
ต่อมาให้เราทำการสร้างตาราง ci_sessions ในฐานข้อมูลด้วยคำสั่ง SQL ดังนี้
 
CREATE TABLE IF NOT EXISTS `ci_sessions` (
        `id` varchar(40) NOT NULL,
        `ip_address` varchar(45) NOT NULL,
        `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
        `data` blob NOT NULL,
        PRIMARY KEY (id),
        KEY `ci_sessions_timestamp` (`timestamp`)
);
 
แล้วกำหนด $config['sess_save_path']  ในไฟล์ config.php ดังนี้
 
$config['sess_save_path'] = 'ci_sessions'; // กำหนดเป็นชื่อตารางที่เราสร้างเพื่อเก็บ session
 
รูปแบบการกำหนดในส่วนของ session ทั้งหมด
กรณีใช้การบันทึกลงในตารางฐานข้อมูล 
 
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session_myweb';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
 
 
 
2. ถ้าอัพขึ้น server แล้วขึ้นแจ้ง

no input file specified

 
ให้ทำการแก้ไขไฟล์ .htaccess โดยเปลี่ยนบรรทัด 
 
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
 
เป็น
 
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
 
 
3. ให้แก้ไขไฟล์ routes.php ในโฟลเดอร์ apps > config บรรทัด
 
if(isset($_SERVER['PATH_INFO'])){
    $rpath = trim($_SERVER['PATH_INFO'],'/');
 
ให้เปลี่ยนเป็น

if(isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO']!=""){
	$rpath = trim($_SERVER['PATH_INFO'],'/');
}else{
	$rpath = preg_replace('(^/)','',trim($_SERVER['REQUEST_URI']));
}
if(isset($rpath)){


 
 


   เพิ่มเติมเนื้อหา ครั้งที่ 2 วันที่ 26-08-2019 ( เนื้อหา [เพิ่มเติมเนื้อหา ครั้งที่ 2] นี้ไม่อัพเดท ไม่เหมาะนำไปใช้งานแล้ว)

กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ











URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ