ตอนแรกคิดว่าอาจจะได้เขียนบทความนี้ก็ตอนปีใหม่นู้น...ละ แต่คิดไปคิดมา ฮึม..! มันน่าจะมีบทความส่งท้ายบีเก่าสัก 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; } }
ขอบพระคุณในความรู้ดีๆครับ
ตอบลบ