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

วันเสาร์ที่ 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;
    }
    
    
}

1 ความคิดเห็น:

© Bookneo, AllRightsReserved.

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