มาใช้ PHP Data Object (PDO) กันเถอะ

คิดว่าหลายๆคนที่เขียนโปรแกรมภาษา PHP เมื่อต้องการเชื่อมต่อกับ MySQL ก็จะใช้ชุดคำสั่งของ php_mysql extension กันจนเป็นเรื่องปกติ แต่ตอนนี้ PHP ก็ได้ประกาศให้ function ที่มากับ extension ตัวนี้มีสถานะเป็น deprecated ไปเรียบร้อยแล้วตั้งแต่ PHP 5.5 เป็นต้นมา นั่นแปลว่าในอณาคต function ตัวนี้อาจจะถูกถอดออกไปเมื่อไหร่ก็ได้ ดังนั้นเราจึงจะมาใช้ PDO ซึ่งเป็น extension หนึ่งในสองตัวที่ PHP แนะนำให้ใช้แทนกันครับ (สำหรับ extension อีกตัวที่ php แนะนำให้ใช้คือ mysqli)

code ในการเชื่อมต่อแบบ php_mysql

$mysql = mysql_connect($host, $user, $pass);
mysql_select_db($dbname);

code ในการเชื่อมต่อแบบ PDO

$pdo = new PDO("mysql:dbname={$dbname};host={$host}", $user, $pass);

สำหรับ code ในการ query ข้อมูลแบบ php_mysql

$result = mysql_query("SELECT col1, col2, col3 FROM table_name");
while($row = mysql_fetch_assoc($result)) {
   //Process each row here
}

ส่วน PDO จะเป็น

$sth = $pdo->prepare("SELECT col1, col2, col3 FROM table_name");
$sth->execute();
while($row = $sth->fetch(PDO::FETCH_ASSOC)) {
   //Process each row here
}

คราวนี้เราจะมาดูข้อดีของ extension PDO ที่สำคัญและควรฝึกให้ชิน นั่นคือการ bind parameter

การ bind parameter คือการแทนที่ตัวแปรใน statement เพื่อประมวลผลต่างๆ ตัวอย่างเช่น ในระบบ login เรามักจะเขียน code ในรูปแบบ

$sql = "SELECT * FROM user WHERE username = '{$_POST['user']}'";

ซึ่งแน่นอนว่าหากผู้ใช้งานพิมพ์ชื่อ username บางอย่างลงไป อาจก่อให้เกิด sql injection เอาได้ง่ายๆ
ดังเช่น

$_POST['user'] = "x'; drop table user;--";

ผลลัพธ์ที่ได้คือ

SELECT * FROM USER WHERE username = 'x'; DROP TABLE USER;--'

แต่ถ้าหากเราใช้วิธีการ bind param แล้ว มั่นใจได้เลยว่าจะไม่มีทางเกิด SQL Injection ขึ้นแน่นอน

$sql = "SELECT * FROM user WHERE username = :user";
$sth = $pdo->prepare($sql);
$sth->execute(  Array(':user' => $_POST['user'])     );

ที่เป็นแบบนี้เพราะว่าการ bind param จะแทนที่ :user ด้วยค่า $_POST[‘user’] ที่ผ่านการ escape string มาเรียบร้อยแล้ว

เรามาดูตัวอย่างของการ Insert ข้อมูลกันบ้างดีกว่า

$sql = 'INSERT INTO user(`user`, `pass`, `email`) VALUES (:user, :pass, :email)';
$sth = $pdo->prepare($sql);
$sth->execute(
      Array(
             ':user' => $_POST['user'],
             ':pass' => $_POST['pass'],
             ':email' => $_POST['email']
      )
);

ทั้งนี้ข้อควรระวังคือ PDO นั้นเป็น extension ที่มีการทำงานแบบ OOP เต็มรูปแบบ
ดังนั้นเวลาเกิดข้อผิดพลาด จึงจะต้องใช้วิธี try / catch exception เอานะครับ

Facebooktwittermailby feather
ข้อความนี้ถูกเขียนใน PHP, Programming คั่นหน้า ลิงก์ถาวร

ใส่ความเห็น