Long Live The King
ข้าพเจ้าไม่ได้มีพรสวรรค์พิเศษอะไร ข้าพเจ้าเพียงแต่มีความกระหายใคร่รู้อยู่เสมอ ทุ่มเทให้กับสิ่งที่อยากรู้ พากเพียรอย่างทรหด และสำรวจวิจารณ์ความรู้ของตัวเองเป็นประจำ ปัจจัยเหล่านี้คือที่มาของแนวคิดต่างๆ ของข้าพเจ้า .... อัลเบิร์ต ไอน์สไตน์

วันศุกร์ที่ 22 พฤศจิกายน พ.ศ. 2556

สวัสดี ชาวโลก กับ Codeigniter



ในบทความนี้เดี๋ยวผมจะแนะนำให้ท่านรู้จักกับ ชาวโลก แอ๊ะ! ยังไง... ไม่ใช่ เดี๋ยวเรามาสร้างเพจแรกกันด้วยการ แสดงคำว่า "Hello World" คำๆนี้สำหรับคนเรียนเขียนโปรแกรมจะต้องรู้จักเป็นอย่างดี ผมเองก็สงสัยว่าคำๆนี้มีที่มา อย่างไร ทำไมตอนเริ่มหัดเขียนโปรแกรมจะต้อง "Hello World" ตลอดเลย มาถึงตอนนี้ท่านอาจจะบ่นว่า "จะอะไรกันนักกันหนากับคำๆนี้" ผมก็ว่างั้น อิอิ.... ok เดี๋ยวเราไป Hello World กันดีกว่าครับ...

เริ่ม
ต่อไปนี้คือพาธของคำที่กล่าวถึง

models      คือ application/models/
controllers คือ application/controller/
views       คือ application/views/

ให้ท่านสร้างไฟล์ที่ controllers ตั้งชื่อว่า home.php ในไฟล์นี้เราจะเขียน class ขึ้นมาหนึ่ง class ชื่อว่า Home
ตามรูปแบบของ Codeigniter ดังนี้
class Home extends CI_Controller{
    
   // do someting....
    
}
ท่านอย่าลืมนะครับว่าชื่อ class กับชื่อไฟล์ต้องเหมือนกัน จากนั้นผมก็จะสร้าง method หรือ function ขึ้นมาแบบนี้
class Home extends CI_Controller{
    
    public function index()
    {
        echo "Hello World";
    }
    
}
ก่อนที่จะรันดูผลงานก็ให้ท่านเข้าไปที่ application/config/routes.php
ให้ปรับแก้บรรทัดนี้ 
$route['default_controller'] = "home";
ด้วยการเปลี่ยนจาก welcome มาเป็น home จากนั้นท่านก็ลองรันดู ถ้าไม่มีปัญหาอะไรท่านก็จะเห็นคำว่า Hello World

แต่หลักการแบบ MVC นั้น echo "Hello World"; จะต้องไปเก็บไว้ที่ views ถึงจะถูกต้องตามเจตนารมณ์ของ
Codeigniter ดังนั้นเราก็ต้องไปสร้างไฟล์ที่ views ชื่อว่า home_v.php ในไฟล์นี้ผมก็จะเขียนแบบนี้ 
<!DOCTYPE html">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <h3>Hello World</h3>
        <?php
        echo "Hello World";
        ?>        
    </body>
</html>
จากนั้นเราก็ไปกำหนดให้ controllers เรียก views ขึ้นมาแสดงด้วยโค้ดนี้
$this->load->view('...ชื่อไฟล์ที่ต้องการเรียก...');
class Home extends CI_Controller{
    
    public function index()
    {
        $this->load->view('home_v');
    }
    
}
มาถึงตอนนี้ท่านก็สามารถที่จะใช้ controller เรียกไฟล์จาก views มาแสดงได้แล้ว

ส่งข้อมูลจาก controllers ไปให้ views ทำอย่างไร
เราจะสร้างตัวแปรขึ้นมา เก็บค่าคำว่า I Iove Codeigniter.แบบนี้
$data['mydata'] = "I Love Codeigniter.";
แล้วเราก็จะส่งไปแสดงที่ views แบบนี้
$this->load->view('home_v', $data);
ตัวอย่าง
class Home extends CI_Controller{
    
    public function index()
    {
        $data['mydata'] = "I Love Codeigniter.";
        $this->load->view('home_v', $data);
    }
    
}
จากนั้นเราก็ไป echo ตัวแปรที่เราสร้างขึ้นที่ views แบบนี้
<html>
    <head>
        <title></title>
    </head>
    <body>

        <?php
        echo $mydata;
        ?>

    </body>
</html>
ในกรณีที่ตัวแปรเก็บค่าแบบ Array แบบนี้ 
$data['mydata'] = array(
    'name' => 'bookneo',
    'password' => '123',
    'email' => 'bookneo@bookneo.com'
);
เราก็ยังคงส่งค่าไปแสดงที่ views แบบเดิม
$this->load->view('home_v', $data);
ตัวอย่าง
class Home extends CI_Controller{
    
    public function index()
    {
        
        $data['mydata'] = array(
        'name' => 'bookneo',
        'password' => '123',
        'email' => 'bookneo@bookneo.com'
        );
        
        $this->load->view('home_v', $data);
    }
    
}
แล้วเราก็ไปวนลูปแสดงที่ views ด้วย foreach แบบนี้
<!DOCTYPE html">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <h3>Hello World</h3>
        <ul>
        <?php
           foreach($mydata as $item){
               echo '<li>'.$item.'</li>';
           }
        ?>        
        </ul>
    </body>
</html>
มาถึงตอนนี้เราก็สามารถส่งค่าต่างๆไปให้กับ view พร้อมทั้งใช้ controller เรียก view ขึ้นมาแสดงด้วย
สำหรับบทความนี้ก็ขอจบเพียงเท่านี้ครับ....



Read More

วันพฤหัสบดีที่ 14 พฤศจิกายน พ.ศ. 2556

CodeIgniter เฟรมเวิร์คสำหรับพัฒนาเว็บแอปพลิเคชั่น



CodeIgniter เป็นเฟรมเวิร์คสำหรับพัฒนาแอปพลิเคชั่น - เครื่องมือ - สำหรับคนที่ต้องการสร้างเว็บไซค์โดยใช้ PHP , จุดประสงค์หลักของ Codeigniter ก็คือทำให้คุณพัฒนาโครงการ เร็วกว่าที่คุยเคยเขียนมา โดยเฉพาะอย่างยิ่งถ้าคุณเคยเขียนโค้ดด้วยความยากลำบาก โดยมีไลบรารี่ต่างๆจัดเตรียมไว้สำหรับงานทั่วๆไปที่ ต้องการ และยังเข้าใช้ไลบรารี่เหล่านี้ได้อย่างง่ายดาย ยังไม่พอ CodeIgniter ยังทำให้คุณสามารถมุ่งเน้นไปที่ความ คิดสร้างสรรค์กับโครงงานของคุณ โดยลดจำนวนโค้ดที่ต้องการลง สำหรับงานทุกชิ้น....

เหตผลอย่างเดียวที่ผมเลือกเขียนบทความเกี่ยวกับ Codeigniter คือ คู่มือเพียบ พร้อมที่จะให้เราเรียนรู้ได้อย่างง่ายดาย..
ก่อนอื่นท่านก็ต้องไปดาวน์โหลดเฟรมเวิร์คตัวนี้มาก่อน http://codeigniter.com/user_guide/installation/downloads.html
สำหรับบทความนี้ผมขอใช้เวอร์ชั่น CodeIgniter V 2.1 ครับ

สร้าง folder ชื่อว่า ci ไว้เว็บ root ของท่าน
จากนั้นก็แตกซิบไฟล์ที่ดาวน์โหลดออกมาเอาเฉพาะ application, system, index.php ไปใส่ไว้ในโฟล์เดอร์ ci



แล้วทดลองรันดู http://localhost/ci/index.php ถ้าไม่ติดปัญหาอะไรท่านก็จะเห็นรูปนี้



ทีนี้ผมต้องการตัด  index.php ออกให้เหลือเฉพาะ http://localhost/ci ผมก็จะเพิ่มไฟล์อีกไฟล์หนึ่งชื่อ
.htaccess ในไฟล์นี้ก็จะมีโค้ดแบบนี้ 
RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA] 
เริ่มกำหนดค่าที่จำเป็นต่างๆ ให้ท่านเปิดเข้าไปที่โฟล์เดอร์ application/config/config.php
แก้ค่าต่างตามนี้
$config['base_url'] = 'http://localhost/ci';
$config['index_page'] = '';
$config['encryption_key'] = 'my_key';
เพียงเท่านี้ท่านก็สามารถเข้าเว็บได้ด้วย http://localhost/ci โดยไม่ต้องมี index.php อีกต่อไป

ให้ท่านเข้าไปที่ application/config/autoload.php เพื่อสั่งโหลด database, session แบบอัตโนมัติ
แก้ค่าต่างตามนี้
$autoload['libraries'] = array('database', 'session');
จากนั้นให้ท่านเข้าไปที่ application/config/database.php
กำหนดค่า database ของท่านลงไป
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '123';
$db['default']['database'] = 'ci';
สำหรับการตั้งค่าก็เพียงเท่านี้ก่อน ส่วนที่เหลือไว้ถึงตอนที่บทความเข้าไปเกี่ยวข้องก็ค่อยว่ากันไปตามนั้น
มีโฟล์เดอร์ด้วยกัน 3 โฟล์เดอร์ที่เราต้องทำความเข้าใจก่อนคือ  models, views, controllers
ซึ่งเป็นรูปแบบของสถาปัตยกรรมซอฟแวร์(software architecture) ที่มีการแบ่งแยกระบบออกเป็น 3 ส่วนหลักๆ
ได้แก่ data model, user interface, and control logic เรียกสั้นๆว่า MVC

M = Model,
V = View,
C = Controller

การทำงานร่วมกันของ MVC
Model เป็นส่วนของการติดต่อกับ database คอยจัดการกับข้อมูลเข้า-ออก ด้วยคำสั่งการประมวลผลภาษา SQL
View เป็นส่วนของการแสดงผลออกทาง web browser ซึ่งอยู่ในรูปแบบของภาษา HTML
Controller เป็นส่วนของการประสานงานระหว่าง user, model, view

เมื่อ User ร้องขอข้อมูลเข้ามา Controller ก็จะส่งคำร้องไปประมวลผลที่ Model แล้วส่งค่ากลับเพื่อให้ View นำไปแสดงต่อ User

ความเข้าใจแบบง่ายๆ คือ
เมื่อท่านนึกถึงฐานข้อมูล ก็ให้เขียนโค้ดที่ models
เมื่อท่านต้องการแสดงข้อมูลทาง web browser ก็ให้เขียนโค้ดที่ views
เมื่อท่านต้องการให้รับคำสั่งจาก user ก็ให้เขียนโค้ดที่ controllers

แต่(หมายเหตุ) การเชื่อมต่อกับฐานข้อมูลนั้นสามารถยืดหยุ่นกันได้ในทุกๆส่วนของการเขียนโปรแกรม....

สำหรับบทความนี้ก็ขอจบเพียงเท่านี้ก่อน ไว้เจอกันในบทความต่อไปครับ......

Read More

วันศุกร์ที่ 25 ตุลาคม พ.ศ. 2556

สมัครสมาชิก และ Login แบบ OOP PHP



จากบทความก่อนผมก็จบทิ้งท้ายไว้ด้วยประโยคว่า "เอาไว้เจอกันในบทควาามหน้าครับ วิธีการ Login แบบ OOP PHP" ทีนี้ผมก็มาคิดว่าทำ Login อย่างเดียวมันน้อยไปหรือเปล่า ก็เลยขอเพิ่มวิธีลงทะเบียนสมัครสมาชิกด้วยก็แล้วกัน เพราะว่าผมคงจะขอจบบทความ ที่เกี่ยวกับ OOP PHP ไว้เพียงแค่บทนี้ คิดว่านะครับผม.. บทความนี้เป็นเพียงวิธีการอย่างง่ายเท่านั้นนะครับ เพราะผมก็ทำอย่างยากไม่เป็นเสียด้วยซิ อิอิ... LET'S GO->

SQL สำหรับทดสอบ
CREATE TABLE `members` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL DEFAULT '',
  `password` varchar(255) NOT NULL DEFAULT '',
  `emailaddress` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`user_id`)
);
ไฟล์ที่ต้องมี database.php, MySqlConn.php, ซึ่งเป็นไฟล์ที่ยกมาจากบทความก่อนหน้านี้ที่เกี่ยวกับ OOP
ก่อนที่จะเริ่มผมก็ต้องขอ อัพเดท function where(); ก่อนถามว่าทำไม ก็เพราะว่าฟังก์ชั่นเดิมไม่สามารถใช้
Logical Operators ได้คือ and กับ or  ดังนั้นผมก็จะอัพเดทเสียใหม่ดังนี้

ไฟล์ MySqlConn.php
public function where($data, $opera='')
    {
        if(!empty($data)){
            $keys = array_keys($data);
            $where = "WHERE ";
            for($i = 0; $i < count($data); $i++)  
           {  
                if(is_string($data[$keys[$i]])){  
                    $where .= $keys[$i]."='".$data[$keys[$i]]."'";  
                    if($i != count($data)-1){ $where .= " $opera ";}  
                }                
               
            }
            
            $this->_where = $where;
        }
    }
จากโค้ดด้านบน จะรับ parameter มาสองตัว ตัวแรกเป็นแบบ array ส่วนตัวที่สองเป็น Operators พอตอนใช้งานเราก็
เรียกแบบนี้
$data = array(
'username' => $_POST['username'],
'password' => $_POST['password'],
);

$Db->where($data, 'or');
ok ครับเรามาเริ่มวิธีสมัครสมาชิกแบบ OOP ได้แล้วซึ่งขอบอกว่าไม่ยากเลยครับ

เราจะสร้าง form กันก่อนแแบบนี้
<div id="signup">
<form name="form1" method="post" action="index.php">
    name: <input type="text" name="username"/><br/>
    pass: <input type="password" name="password"/><br/>
    pass confirm: <input type="password" name="conpassword"/><br/>
    email: <input type="text" name="email"/><br/>
    <input type="submit" name="signup" value="Submit"/>
</form>
</div>  
หลังจากนั้นเราก็จะรับค่า username กับ email ไปเช็คกับฐานข้อมูล ว่า email หรือ username นี้มีการใช้งานไปแล้วหรือยัง
แบบนี้
เริ่มด้วยการนำเข้าไฟล์ MySqlConn.php
include_once('MySqlConn.php');
ตามด้วยการสร้างอ็อบเจกต์
$Db = new MySqlConn;

if (isset($_POST['signup'])) {

$data = array(
    'username' => $_POST['username'],
    'emailaddress' => $_POST['email'],
);

$Db->where($data, 'or');
$num = $Db->num_rows('members');
if ($num > 0) {
   echo '<font color="red">Sorry Username หรือ Email นี้ได้ถูกใช้งานไปแล้ว</font>';
}
else{
   $data = array(
   'username' => $_POST['username'],
   'password' => $_POST['password'],
   'emailaddress' => $_POST['email'],
   );

   $Db->insert('members', $data);

}

}
จากโค้ดด้านบนเราส่ง username กับ email ไปเช็คว่ามีการใช้งานแล้วหรือยังด้วยฟังก์ชั่นสองฟังก์ชั่นคือ
$Db->where($data, 'or');
$num = $Db->num_rows('members');//นับแถว
ถ้า $num มากกว่า 0 ก็คือ 1 ขึ้นไปแสดงว่าถูกใช้งานแล้ว แต่ถ้าเป็น 0 ก็ให้ insert ข้อมูลที่ต้องการด้วยฟังก์ชั่น
$Db->insert('members', $data);
เพียงแค่นี้เราก็ได้ระบบการสมัครสมาชิกแล้ว ที่เหลือเราก็เพิ่มเติมการ validate ในรูปแบบต่างตามต้องการ ตัวอย่าง

ไฟ register.php
<h1>Signup Here</h1>
<?php
include_once('MySqlConn.php');
$Db = new MySqlConn;

if (isset($_POST['signup'])) {

$data = array(
    'username' => $_POST['username'],
    'emailaddress' => $_POST['email'],
);
$Db->where($data, 'or');
$num = $Db->num_rows('members');
if ($num > 0) {
    echo '<font color="red">Sorry Username หรือ Email นี้ได้ถูกใช้งานไปแล้ว</font>';
}
else {
    $data = array(
        'username' => $_POST['username'],
        'password' => $_POST['password'],
        'emailaddress' => $_POST['email'],
    );
    if(!empty($data['username']) && !empty($data['password'])
     && !empty($data['emailaddress'])  ){

    if($_POST['password'] == $_POST['conpassword']){    
    $Db->insert('members', $data);
    echo "<font color='blue'>Success ขอบคุณที่ท่านได้สมัครสมาชิกกับเรา</font>";
    }
    else{
        echo '<font color="red">การยืนยัน Password ไม่ตรงกัน</font>';
    }

    }
    else{
        echo '<font color="red">กรุณากรอกข้อมูลให้ครบ</font>';
    }
}
}
?>
เสร็จแล้วสำหรับการสมัครสมาชิก ต่อไปก็ Login ต่อเลยครับ อันนี้ง่ายมากๆเลยครับ เพราะเราก็อปเอาโค้ดวิธีสมัครสมาชิก
มาใช้นั่นเอง แต่คราวนี้เราใช้ operator เป็น and แบบนี้ $Db->where($data, 'and');
สร้าง form กันก่อน

ไฟ login.php
<h1>Login Here</h1>
<div id="login">
<form name="form1" method="post" action="index.php">
    name: <input type="text" name="username"/><br/>
    pass: <input type="password" name="password"/><br/>
    <input type="submit" name="login" value="Submit"/>
</form>
</div>  
จากนั้นสร้างอ็อบเจ็กต์
<?php
$DbLogin = new MySqlConn;
if (isset($_POST['login'])) {

$data = array(
    'username' => $_POST['username'],
    'password' => $_POST['password'],
);

$DbLogin->where($data, 'and');
$num = $DbLogin->num_rows('members');
if ($num > 0) {
    echo '<font color="blue">ไชโย Login สำเร็จแล้ว....</font>';
}
else {
    echo 'อ้าว!.. Username หรือ Password ไม่ถูกต้องนะ';
}

}
?>
เพียงเท่านี้เราก็ได้วิธีการ Signup และ Login แบบ OOP ไว้ใช้งานแล้ว ที่เหลือท่านก็ลองไปปรับปรุง พัฒนากัน
ต่อไปดูนะครับ แล้วอย่าลืมนำมา บอกเล่าเก้าสิบ เฮ้ย!... บอกเล่าสู่กันฟังบ้างนะครับ

สำหรับบทความที่เกี่ยวกับ OOP PHP Object-oriented programming ก็คงจะจบไว้ก่อนเพียงเท่านี้....
ผิดพลาดอย่างไรก็ต้องขอ อภัย ด้วยครับ......



Read More

วันอาทิตย์ที่ 13 ตุลาคม พ.ศ. 2556

วิธี Insert Update Delete (OOP PHP Part3)



บทความนี้เกี่ยวข้องกับการ insert, delete, update ข้อมูลแบบ OOP PHP เป็นความต่อเนื่องจากบทความก่อน ซึ่งเราต้องใช้งาน property, function บางตัวของบทความก่อนด้วย......

ไฟล์ที่ต้องมี index.php, database.php, MySqlConn.php ซึ่งเป็นไฟล์ที่ยกมาจากบทความก่อนหน้านี้
ฟังก์ชั่น insert()
เริ่ม
ผมจะสร้าง function เพิ่มที่ไฟล์ MySqlConn.php สำหรับ insert ข้อมูลลง database แแบบนี้
function insert($tableName, $data)
{
//บันทึกลงฐานข้อมูล....
}
function นี้รับ parameter มา 2 ค่าคือ ตารางฐานข้อมูล กับ ฟิลด์และข้อมูลที่ส่งมาแบบ Array
ดังนั้นเราก็ต้องมาแยก Array ออกเป็น 2ชุด ชุดแรกเป็น keys ชุดที่2เป็น value ด้วยฟังก์ชั่น  2ฟังก์ชั่นคือ
$keys = array_keys($data); //เก็บ keys ของ Array

$value = array_values($data); //เก็บ values ของ Array

แล้วเราก็นำมาวนลูปด้วย froeach() เพิ่มเครื่องหมาย ',' เข้าไปด้วย แบบนี้
foreach( $keys AS $key => $k ) {$sql .= $k;
if ( $key !== count($keys)-1 ) $sql.= ', ';}

foreach( $value AS $val => $v ) {$sql .= "'".$v."'";
if ( $val !== count($value)-1 ) $sql.= ', ';}
จากนั้นก็นำมาใส่ในฟังก์ชั่น insert() ก็จะออกมาในรูปแบบนี้
ไฟล์ MySqlConn.php
public function insert($tableName, $data)
    {
        if(!empty($data)){
            
        $keys = array_keys($data);   
        $value = array_values($data);       
        
        $sql = "INSERT INTO $tableName ";
        $sql .= "(";
        foreach( $keys AS $key => $k ) {$sql .= $k;
        if ( $key !== count($keys)-1 ) $sql.= ', ';}
        $sql .= ")";
        $sql .= "VALUES ";
        $sql .= "(";
        foreach( $value AS $val => $v ) {$sql .= "'".$v."'";
        if ( $val !== count($value)-1 ) $sql.= ', ';}
        $sql .= ")";
        if($sql){          
        $this->_mysql->query($sql);
        }
        }
    }
พอตอนเรียกใช้งานเราก็แค่ส่งชื่อ ตารางฐานข้อมูล พร้อมกับค่าแบบ Array แบบนี้
ไฟล์ index.php
$data = array(
'test' => 'test insert',
); 

$Db = new MySqlConn; 
$Db->insert('test', $data);
จากโค้ดด้านบน
มีความหมายว่า insert into test (title) values ('test insert')
เพียงแค่นี้ เราก็สามารถ insert ข้อมูลลงฐานข้อมูลได้แล้ว แล้วก็เป็นการ insert ข้อมูลแบบ Array ง่ายๆ
สบายๆ

ฟังก์ชั่น update()
เริ่ม
ผมก็จะเริ่มสร้างฟังก์ชั่น update() แบบนี้
function update($tableName, $data)
{
//อัพเดทลงฐานข้อมูล....
}
ดูเพียงแค่นี้ท่านก็คงร้อง อ๋อ! ครับผมเหมือนกันกับ function insert() เพียงแต่คราวนี้ผมใช้ for ในการวนลูป
พร้อมกับเพิ่ม $this->where เข้าไปด้วย ซึ่ง property ตัวนี้เราได้สร้างไว้แล้วในบทความก่อนเพียงแต่หยิบมันมาใช้ก็เท่านั้น
public function update($tableName, $data)
    {
        if(!empty($data)){
        $keys = array_keys($data);
        
       $sql = "UPDATE $tableName SET ";
            for($i = 0; $i < count($data); $i++)  
           {  
                if(is_string($data[$keys[$i]])){  
                    $sql .= $keys[$i]."='".$data[$keys[$i]]."'";  
                    if($i != count($data)-1){$sql .= ',';}     
                }   
            }
            
            $sql .= $this->_where;
            
        if($sql){ 
        $this->_mysql->query($sql);
        }
        }
    }
เพียงเท่านี้เราก็ได้ function update() ไว้ใช้งานแล้ว พอตอนเรียกใช้งาน เราก็ส่งชื่อ ตารางฐานข้อมูล พร้อมกับค่าแบบ Array แบบนี้
ไฟล์ index.php
$data = array(
'test' => 'test update',
); 

$Db = new MySqlConn; 
$Db->where('id_update', 'id');
$Db->update('test', $data);
จากโค้ดด้านบน
มีความหมายว่า update test  set 'test' = 'test update' where id_update = 'id'

ฟังก์ชั่น delete()
เริ่ม
สร้างฟังก์ชั่น delete() แบบนี้
public function delete($tableName)
{
    if(!empty($tableName)){
    $sql = "delete from $tableName $this->_where";
    $this->_mysql->query($sql);
    }
}
ฟังก์ชั่น delete() ของเราก็มีแค่นี้ รับ parameter มา 1ค่าคือตารางฐานข้อมูล พอตอน delete เราก็เรียกใช้
property $this->where แค่นี้ พอตอนเรียกใช้
$Db = new MySqlConn; 
$Db->where('id_test', 'id');
$Db->delete('test');
จากโค้ดด้านบน
มีความหมายว่า delete from test where id_test = 'id'
เพียงแค่นี้เราก็มีโค้ดสำหรับไว้ลบแถวในฐานข้อมูลได้แบบง่ายๆ สบายๆอีกแล้ว...

เดี๋ยวผมขอเพิ่มเติมฟังก์ชั่นอีกสัก 1ฟังก์ชั่น คือ num_rows() เอาไว้นับแถวในฐานข้อมูล
รูปแบบ
public function num_rows($tableName)
{
    $this->_tableName = $tableName;
    $sql = 'SELECT * FROM';
    $query = $this->_mysql->query("$sql $this->_tableName $this->_where");
    $results = mysqli_num_rows($query);

    return $results;
}
ฟังก์ชั่นนี้ไม่มีอะไรมากครับ แค่รับตารางฐานข้อมูลเข้ามาแล้วก็ นับแถวจากนั้นก็ return ค่าออกไป โดยที่เราสามารถที่จะใช้
where ได้ พอตอนใช้งาน
$Db = new MySqlConn; 
$Db->where('username', 'bookneo');
$Db->num_rows('test');
จากโค้ดด้านบน มีความหมายว่า
$sql = select * from test where username = 'bookneo'
mysql_num_rows($sql)

สำหรับการสร้าง ฟังก์ชั่นก็มีเพียงเท่านี้ที่เหลือท่านก็ลองปรับปรุงเปลี่ยนแปลง เอาไปใช้ได้ตามใจชอบ และท้ายที่สุดท่านก็อาจจะมี framework เล็กๆเป็นของตัวเองในที่สุด....

บทความนี้ก็จบลงเพียงเท่านี้ คงจะเหลืออีกสัก 1 บทความที่เกี่ยวกับ OOP คือตัวอย่างการนำไปใช้ เอาไว้เจอกันในบทควาามหน้าครับ วิธีการ Login แบบ OOP PHP .....




Read More

วันเสาร์ที่ 5 ตุลาคม พ.ศ. 2556

วิธีดึงข้อมูลจาก Database มาแสดงแบบ OOP PHP Part2



ตอนแรกคิดว่าอาจจะได้เขียนบทความนี้ก็ตอนปีใหม่นู้น...ละ แต่คิดไปคิดมา ฮึม..! มันน่าจะมีบทความส่งท้ายบีเก่าสัก 1 บทความนะ ก็เลยเลือกเอาวันนี้แหละ วันที่ 29 ธันวาคม 2554 จบบทความนี้ก็ไว้เจอกันอีกทีปีหน้าแล้วกันครับ... สำหรับบทความนี้ก็ยังคงเป็นเรื่องของการ ดึงข้อมูลจาก Database มาแสดงเหมือนเดิม เพียงแต่เป็นการเชื่อมต่อฐานข้อมูลแบบ OOP ชนิดเต็มรูปแบบ แล้วก็แบบง่ายๆเสียด้วย ผมรู้สึกรักการเขียน php แบบ Object-oriented programming ขึ้นมาเสียแล้วซิ ไปดูกันครับ....

ก่อนเริ่มท่านคงจะจำได้ ว่าบทความก่อนๆ หน้านี้ที่ผมพูดถึงฟังก์ชั่น 2 ฟังก์ชั่น คือ setName กับ getName ซึ่งเราจะได้เห็น
ลักษณะการใช้งาน ที่เหมือนกับ 2 ฟังก์ชั่นนี้ เพียงแต่เปลี่ยนชื่อไปเท่านั้นเองครับ...

เริ่ม
ผมจะสร้างไฟล์ขึ้นมา 3 ไฟล์ คือ index.php, database.php, MySqlConn.php
index.php เอาไว้ส่ง parameter และแสดงข้อมูล
database.php เอาไว้เก็บข้อมูล database
MySqlConn.php เป็น Class เก็บฟังก์ชั่นต่างๆ

เราจะเริ่มกันที่ไฟล์ database.php ก่อนดังนี้
define("host", "localhost");
define("username", "root");
define("password", "123");
define("db", "oop");
define คือ function ที่ใช้สำหรับการประกาศค่าตัวแปรคงที่ เมื่อเราประกาศค่าตัวแปรด้วยฟังก์ชั่นนี้  ตัวแปรจะถูกเก็บไว้ที่หน่วยความจำ
ทำให้เราสามารถเรียกใช้ค่าตัวแปรนี้ได้ทั้งภายในและภายนอกของ Class หรือ Function ตลอดเวลา

จากนั้นผมก็ไปนำเข้าไฟล์นี้ที่ไฟล์ MySqlConn.php ดังนี้

ไฟล์ MySqlConn.php
require_once('database.php');
ตามด้วยการสร้าง Class, function และ property 1ตัวกำหนดให้เป็น protected เอาไว้ใช้งานภายใน Class
และ SubClass เท่านั้น

ไฟล์ MySqlConn.php
require_once('database.php');

class MySqlConn
{ 

protected $_mysql;

public function __construct()
{

}

public function query()
{

}

}
หวังว่าท่านคงจะจำ __construct() ได้ ซึ่งเราจะเขียนโค้ดการเชื่อมต่อฐานข้อมูลไว้ใน function นี้เพื่อเรียกให้มันทำงาน
ทันทีที่มีการสร้างอ็อบเจกต์ เราจะเชื่อมต่อฐานข้อมูลแบบนี้ และกำหนดค่าให้กับ protected $_mysql เพื่อการเรียก
ใช้ภายหลัง
public function __construct()
    {
       $this->_mysql = new mysqli(host, username, password, db)
                       or die('not connect to sql');
    }
เสร็จแล้วเราก็ไปเรียกใช้งาน __construct() ที่ไฟล์ index.php ดังนี้
<!DOCTYPE html">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>oop php</title>
    </head>
    <body>
        <?php
        require_once('MySqlConn.php');
        $Db = new MySqlConn; 
        ?>        
        </div>
    </body>
</html>
แค่นี้การเชื่อมต่อฐานข้อมูลของเราก็เรียบร้อยแล้ว พร้อมที่จะให้เราใช้งานได้ทุกเมื่อ

แล้วผมก็ไปทำงานต่อที่ไฟล์ ไฟล์ MySqlConn.php ที่ function query()
public function query($sql)
    {   
        $query = $this->_mysql->query($sql);

        while ($row = $query->fetch_array()){       
           $results[] = $row;
        }
        return $results;
    }
รับค่า parameter มาหนึ่งค่าคือ $sql แล้วนำมา query จากนั้นก็วนลูปนำข้อมูลมาเข้า Array() แล้วก็ return ค่าออกไป
ไปต่อที่ไฟล์ index.php เพื่อส่งค่า parameter ไปให้กับ function query() แล้วก็รับค่าที่ return กลับมา
วนลูปออกมาแสดงด้วยฟังก์ชั่น foreach();

ไฟล์ index.php
require_once('MySqlConn.php');
$Db = new MySqlConn; 
$sql = $Db->query("select * from article");

forech($sql as $row){
    echo $row['title'].'<br/>';
}
เพียงแค่นี้เราก็สามารถดึงข้อมูลจากฐานข้อมูลมาแสดง แบบ oop php เต็มรูปแบบได้แล้ว

จากโค้ดนี้
$sql = $Db->query("select * from article");
ผมอยากให้มันส่งค่า parameter ไปแบบ สามารถเลือก field ได้ หรือส่งเฉพาะชื่อตารางฐานข้อมูล แล้วออโต้ query ออกมาเลย

ก็เปลี่ยนวิธีส่งเสียใหม่ให้มี 2 parameter  แบบนี้
$sql = $Db->query("select title from", "article");
ก็ได้ หรือ ปล่อยให้ parameter แรกเป็นค่าว่างก็ได้
$sql = $Db->query("", "article");

parameter แรกคือการเลือก field ของตารางฐานข้อมูล
parameter ที่สองคือการเลือกตารางฐานข้อมูล

แล้วเราก็ไปแก้ไข function query() ดังนี้

ไฟล์ MySqlConn.php
public function query($sql='', $tableName='')
    {   

        if(!empty($sql)){
            $sql = $sql;
        }
        else{
            $sql = 'SELECT * FROM';
        }

        $this->_tableName = $tableName;
        $query = $this->_mysql->query($sql $this->_tableName);

        while ($row = $query->fetch_array()){       
           $results[] = $row;
        }
        return $results;
    }
รับ parameter มาสองค่า ใช้ if, else กำหนด parameter แรกว่า
ถ้า $sql ไม่ใช่ค่าว่าง ก็ให้ $sql = $sql; ถ้าเป็นอย่างอื่น ก็ให้ $sql = 'SELECT * FROM';
จากนั้นสร้าง property ขึ้นมาหนึ่งค่าเพื่อรับ parameter ตัวที่สองโดยกำหนดให้เป็น protected
protected $_tableName;
กำหนดค่าให้เท่ากับ patameter ตัวที่สอง
$this->_tableName = $tableName; แล้วก็เพิ่มเข้าไป query ด้วยแบบนี้
$query = $this->_mysql->query($sql $this->_tableName);
เพียงแค่นี้เราก็สามารถส่งค่า parameter แบบใหนก็ได้ตามด้านล่างนี้ แต่เราก็ต้องใส่ค่า parameter 2ค่าทุกครั้ง
โดยจะปล่อยให้ค่าใด ค่าหนึ่งว่างก็ได้ ที่ไฟล์ index.php
แบบนี้
$sql = $Db->query("select title from", "article");
หรือ
$sql = $Db->query("select title from article where article_id = '1'", "");
หรือ
$sql = $Db->query("", "article");//ค่าพื้นฐานของ parameter แรกคือ select * from
แต่ผมก็ยังคิดอีกว่า ถ้าเราใช้ where แบบโค้ดด้านบนมันจะยาวไปมั๊ย อยากให้มันส่งค่า where ไปต่างหากแบบนี้
$Db->where('article_id', '1');
จากโค้ด ความหมายก็คือ where article_id = '1' นี้มีการส่งค่า parameter ไปสองค่า ให้กับฟังก์ชั่น where();
เราก็ต้องไปสร้างฟังก์ชั่นเพื่อรับค่าสองค่านี้

ไฟล์ MySqlConn.php
protected $_where;

public function where($prop, $value)
{
if(!empty($prop)){
$this->_where = "WHERE $prop = '$value'";
}
}
จากโค้ดด้านบนเราจะเพิ่ม property อีกหนึ่งตัว แล้วกำหนดให้มีค่าเท่ากับ "WHERE $prop = '$value'
แล้วก็นำไป query แบบนี้
$query = $this->_mysql->query($sql $this->_tableName  $this->_where);
นอกจากนี้ยังมีการกำหนด order by ... desc แล้วก็ limit ซึ่งก็ใช้วิธีการเดียวกัน ดังที่ท่านจะได้เห็นตัวอย่างจากไฟล์สำเร็จแล้วแบบนี้
$query = $this->_mysql->query("$sql $this->_tableName $this->_where
         $this->_order $this->_limit");

แค่นี้เราก็ได้ปรับปรุงโค้ดของเราให้สามารถใช้งานได้ ด้วยการเขียนโค้ดสั้นๆ เพื่อ query ข้อมูลจาก database ขึ้นมาแสดงแบบนี้ 

ไฟล์ index.php
require_once('MySqlConn.php');
$Db = new MySqlConn;
$Db->where('language', 'php'); 
$sql = $Db->query("", "article"); 
โดยที่ท่านจะเรียกใช้งานกี่ครั้งก็ได้ในเพจเดียวเพียงแค่สร้าง อ็อบเจกต์ขึ้นมาใหม่ แบบนี้
$Db = new MySqlConn;
$Db->where('language', 'php'); 
$Db->order('article_id', 'desc');
$Db->limit('10');
$sql = $Db->query("select title from", "article");
  
$Db2 = new MySqlConn;
$Db2->limit('10');
$sql = $Db2->query("", "article");

สำหรับบทความนี้ก็ขอจบลงเพียงเท่านี้ ผิดพลาดยังไง ก็ขออภัยด้วยนะครับ....

ไฟล์ index.php
<!DOCTYPE html">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <?php
        require_once('MySqlConn.php');
        $Db = new MySqlConn;
        $Db->order('id_article', 'desc');
        $Db->where('language', 'php');
        $Db->limit('10');
        $sql = $Db->query('', 'myarticles');
        
        foreach($sql as $row){
            echo $row['title'].'<br/>';
        } 
        
        ?>        
        </div>
    </body>
</html>
ไฟล์ database.php
define("host", "localhost");
define("username", "root");
define("password", "123");
define("db", "oop");
ไฟล์ MySqlConn.php
require_once('database.php');

class MySqlConn
{     
    protected $_mysql;
    protected $_tableName;   
    protected $_where;
    protected $_order;
    protected $_limit;
    
    public function __construct()
    {
       $this->_mysql = new mysqli(host, username, password, db)
                       or die('not connect to sql');
    }

    public function where($prop, $value)
    {
        if(!empty($prop) && !empty($value)){
            $this->_where = "WHERE $prop = '$value'";
        }
    }
    
    public function order($order, $sort)
    {
        if(!empty($order)){
            $this->_order = "order by $order $sort";
        }
        
    }
    
    public function limit($value)
    {
        if(!empty($value)){
        $this->_limit = "LIMIT $value";
        }
    }
    
    public function query($sql='', $tableName='')
    {   
        if(!empty($sql)){
            $sql = $sql;
        }
        else{
            $sql = 'SELECT * FROM';
        }
        $this->_tableName = $tableName;
        $query = $this->_mysql->query('SET NAMES UTF8');
        $query = $this->_mysql->query("$sql $this->_tableName $this->_where
                 $this->_order $this->_limit");

        while ($row = $query->fetch_array()){       
           $results[] = $row;
        }
        return $results;
    }
    
    
}
Read More

วันอังคารที่ 17 กันยายน พ.ศ. 2556

วิธีดึงข้อมูลจาก Database มาแสดงแบบ OOP PHP



บทความนี้เกี่ยวข้องกับการสร้างฟังชั่น เพื่อเชื่อมต่อฐานข้อมูล และดึงข้อมูลขึ้นมาแสดง ยังไม่เต็มรูปแบบของ OOP เนื่องจากยังไม่มีการสร้าง Object ภายนอก เพียงแต่มีรูปแบบการเชื่อมต่อฐานข้อมูลแบบ OOP และสามารถนำไปใช้ได้จริง เรียกว่า สร้างจินตนาการ อุ่นเครื่องกันก่อน.....

เริ่ม
ผมจะสร้างไฟล์ขึ้นมา 2 ไฟล์ คือ index.php กับ MySqlConnect.php
ที่ไฟล์ MySqlConnect.php ผมจะสร้าง function เพื่อเชื่อมต่อฐานข้อมูลก่อน ดังนี้

ไฟล์ MySqlConnect.php
function connect()
 {
    $conn = new mysqli('host', 'username', 'password', 'database')
                         or die('not connect to sql');
    return $conn;
 }
โค้ดที่ท่านเห็นด้านบน นี้คือการเชื่อมต่อฐานข้อมูลแบบ OOP ในฟังก์ชั่นนี้มีการสร้างอ็อบเจ็กต์ คือ
$conn = new mysqli(); เป็นรูปแบบการเชื่อมต่อกับฐานข้อมูล MySQL แบบใหม่ซึ่ง สามารถใช้งานได้ ใน MySQL 4.1 ขึ้นไป
ส่วนที่ไฟล์ index.php ผมก็จะนำเข้าไฟล์ MySqlConnect.php และสร้างตัวแปรขึ้นมาเพื่อเรียกใช้ function connect();

ไฟล์ index.php
<!DOCTYPE html">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <?php
        require_once('MySqlConnect.php');
        $conn = connect();        
        ?>
    </body>
</html>
มาถึงตอนนี้เราก็ทำการเชื่อมต่อฐานข้อมูลเรียบร้อยแล้ว เหลือแต่ select ตารางฐานข้อมูลและ query ออกมา
เท่านั้นเอง ไปต่อกันเลยครับ...
ที่ไฟล์ MySqlConnect.php ผมจะสร้างฟังก์ชั่นอีกคือ getSql();
function getSql($conn='', $sql='')
{
    $query = $conn->query($sql);
    $rows = array();

    while ($row = $query->fetch_array()) {        
        $rows[] = $row;
    }
    return $rows;
}
ฟังก์ชั่นนี้รับค่า parameter มาสองค่า คือ $conn, $sql ก็คือตัวแปรที่เราได้สร้างเอาไว้ที่ไฟล์ index.php
แล้วผมก็ query ออกมา เก็บข้อมูลในรูปแบบ Array แล้วก็ return ค่าออกไป

จากนั้นที่ไฟล์ index.php ก็ไปสร้างตัวแปรเพื่อส่งค่า parameter ไปให้กับ function getSql()
พร้อมทั้งวนลูป ค่าที่ได้รับการคืนค่ากลับออกมา

ไฟล์ index.php
$sql = 'select * from article';
$results = getSql($conn, $sql);
        foreach($results as $row){
        echo "<div style='width:400px;margin-left:200px;'>";    
        echo "<h3>".$row['title']."</h3>";
        echo $row['article'];
        echo "</div>";
เพียงเท่านี้เราก็จะได้ฟังก์ชั่นการเชื่อมต่อฐานข้อมูล พร้อมทั้ง query ข้อมูลออกมาแสดง แบบง่ายๆ

บทความนี้ก็ขอจบเพียงเท่านี้ครับ ผิดพลาดยังไงก็ขออภัยด้วยครับ.....

ไฟล์ index.php
<!DOCTYPE html>
<html lang="th">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <?php
        require_once('MySqlConnect.php');
        $conn = connect();
        $sql = 'select * from article';

        $results = getSql($conn, $sql);
        foreach($results as $row){
        echo "<div style='width:500px;margin-left:100px;'>";    
        echo "<h3>".$row['title']."</h3>";
        echo $row['article'];
        echo "</div>";
        }
        ?>
    </body>
</html>

ไฟล์ MySqlConnect.php
<?php
function connect()
{
    $conn = new mysqli('localhost', 'root', '', 'bookneo')
                       or die('not connect to sql');
    return $conn;
}

 
function getSql($conn, $sql)
{
    $query = $conn->query("SET NAMES UTF8");
    $query = $conn->query($sql);
 
    $rows = array();
 
    while ($row = $query->fetch_array()){        
        $rows[] = $row;
    }
    return $rows;
}
?>


Read More

วันพุธที่ 4 กันยายน พ.ศ. 2556

Inheritance การสืบทอดคุณสมบัติ ของClass OOP PHP



ได้ยินกันบ่อยๆ inheritance เป็นถ่ายทอดคุณสมบัติของแม่แบบ หรือ Class หลักที่กำหนดให้มีคุณสมบัติต่างๆ ที่จำเป็นต้องมี ด้วยการสืบทอดของ Class ลูก(Sub-Class)จึงทำให้ Classลูก สามารถมีคุณสมบัติเฉพาะที่เหมือนกับ Classหลัก และสามารถเพิ่มคุณสมบัติอื่นเข้าไปได้อีกในคลาสนี้....

สมมุติว่า มีพ่อแม่คู่หนึ่ง ชื่อ a กับ b และสมมุติให้ a,b เป็น Class ParentClass
- a กับ b มีลูกด้วยกัน 3คน ชื่อ c, d, f และสมมุติให้ c,d,f เป็น Class ChildClass
- a กับ b มีคุณสมบัติเฉพาะดังนี้  ชื่อ ความสูง น้ำหนัก เพศ มีพฤติกรรมดังนี้ วิ่งสองขา นอนหลับ การกิน
คุณสมบัติและพฤติกรรมเหล่านี้จะถูกถ่ายทอดไปสู่ลูกๆ ทั้ง 3 ด้วย

แล้วทำอย่างไรให้ ParentClass รู้ว่า ChildClass เป็น Class ลูก(Sub-Class) ของตัวเอง
ก็ต้องประกาศให้เป็นที่รู้กันด้วย keyword ที่ชื่อ extends
รูปแบบ
class ChildClass extends ParentClass
{
//doSometing....
}
เพียงแค่นี้ ClidClass ก็สามารถเรียกใช้คุณสมบัติจาก ParentClass ได้แล้วครับ

ok. เดี๋ยวมาทำให้มันเห็นภาพแบบ ง่ายๆ สั้นๆกันครับ
ผมจะเริ่มด้วยการสร้างไฟล์ขึ้นมา 3 ไฟล์ คือ index.php, Parentclass.php, Childclass.php
ผมจะเริ่มที่ไฟล์ Parentclass.php ก่อน

ไฟล์ Parentclass.php
class ParentClass
{
    public function __construct()
    {
        echo 'ฉันสามารถวิ่ง 2 ขาได้';
    }
}
ท่านคงจะจำ method __construct() ได้ ถ้าไม่ได้ก็ให้ไปอ่านบทความก่อนหน้านี้ครับ
จากนั้นผมก็จะเรียก method __construct() ด้วยการสร้างอ็อบเจ็ค ที่ไฟล์ index.php ดังนี้

ไฟล์ index.php
ไฟล์ index.php
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type"
        content="text/html; charset=UTF-8">
        <title></title>
    </head>
  <body>
<?php
require_once('Parentclass.php');
$ab = new ParentClass();
?>
  </body>
</html>

OUTPUT: ฉันสามารถวิ่ง 2 ขาได้



จากนั้นผมก็สร้าง classลูกขึ้นมา ชื่อว่า ChildClass
แล้วผมก็นำเข้าไฟล์ Parentclass.php ด้วยการ require_once()
require_once('Parentclass.php');

ไฟล์ Childclass.php
class ChildClass extends ParentClass
{
   
}
ไฟล์ Childclass.php มีแค่นี้ไม่มีอะไรเลย แต่สามารถ output ได้เหมือนกับ PrentClass ได้ทุกประการ

การนำเข้าไฟล์ Parentclass.php ท่านจะนำเข้าตรงไฟล์ Childclass.php ก็ได้ หรือที่ไฟล์ index.php
ก็ได้ แต่ถ้าท่านนำเข้าที่ไฟล์ Childclass.php ก็ไม่ต้องไปนำเข้าที่ไฟล์ index.php อีก เดี๋ยวผมขอเอาไปนำ
เข้าที่ไฟล์ index.php ก็แล้วกัน จากนั้นผมก็ output ที่ไฟล์ index.php
ไฟล์ index.php
require_once('Parentclass.php');
require_once('Childclass.php');

$cdf = new ChildClass();

OUTPUT: ฉันสามารถวิ่ง 2 ขาได้



ที่นี้เดี๋ยวผมจะเปลี่ยนวิธีเรียก function __contruct ของ ParentClass ใหม่ด้วยการใช้ คำว่า parent แล้วตามด้วยเครื่องหมาย ::
รูปแบบ
ไฟล์ Childclass.php
class ChildClass extends ParentClass
{
   function __construct()
    {
        parent::__construct();
    }
}

OUTPUT: ฉันสามารถวิ่ง 2 ขาได้


ทุกอย่างยังสืบทอดได้เหมือนเดิม

แล้วถ้าผมมี mathod เพิ่มขึ้นมา 2 mathod  ที่ไฟล์ Parentclass.php ดังนี้
class ParentClass
{
    public function __construct()
    {
        echo 'ฉันสามารถวิ่ง 2 ขาได้';
    }

    public function doSometing()
    {
        return 'call me doSometing';
    }
}
จากนั้นผมก็ เรียก method doSometing() ที่ไฟล์ Childclass.php ดังนี้
ไฟล์ Childclass.php
class ChildClass extends ParentClass
{
    public function __construct() 
    {
        parent::__construct();
        echo $this->doSometing();
    }
}

OUTPUT: ฉันสามารถวิ่ง 2 ขาได้ call me doSometing



ในบทความนี้ท่านก็ได้เห็น วิธีการสืบทอดคุณสมบัติ จาก Class(แม่แบบ) ของ Classลูก(Sub-Class)
พร้อมทั้งวิธีการเรียกใช้งาน ผิดพลาดยังไงก็ขออภัยด้วยครับ สำหรับบทความนี้ผมก็ขอจบเพียงเท่านี้.....

Read More

© Bookneo, AllRightsReserved.

ขับเคลื่อนโดย Blogger Designed by Nikhorn Thongchuay